备忘录–2017-07-24
我正在一个其他进程的虚拟空间中:
0、我应该怎么往这个空间中写数据呢?
1、我应该怎么定位这个空间中与当前进程的相关信息呢?
2、我应该怎么定位我写入的数据呢?以下内容并不能完全解决所有问题…
FS:[0xXX]:这是维基百科的一些说明
//可以如下使用
void main()
{
DWORD i = 0;
__asm
{
mov eax, fs:[0x20]
mov i, eax
}
printf("%d", i);
}
PEB(不用点我,没有连接):翻译称进程环境块,看看官网提供的阉割版,看看它实际的样子,具体有什么用,不明,但是也可以从一些字段猜测。今次只是临时保存,还未经测试。测试后补充。
微软阉割版PEB结构体:毕竟是不开源的系统。
PEB结构体导出分享:这是外国朋友收集到的WIN32平台下各个版本的PEB结构说明,无注释。网页版详细,同样是无注释的。
#pragma pack(push)
#pragma pack(1)
template <class T>
struct LIST_ENTRY_T
{
T Flink;
T Blink;
};
template <class T>
struct UNICODE_STRING_T
{
union
{
struct
{
WORD Length;
WORD MaximumLength;
};
T dummy;
};
T _Buffer;
};
template <class T, class NGF, int A>
struct _PEB_T
{
union
{
struct
{
BYTE InheritedAddressSpace;
BYTE ReadImageFileExecOptions;
BYTE BeingDebugged;
BYTE _SYSTEM_DEPENDENT_01;
};
T dummy01;
};
T Mutant;
T ImageBaseAddress;
T Ldr;
T ProcessParameters;
T SubSystemData;
T ProcessHeap;
T FastPebLock;
T _SYSTEM_DEPENDENT_02;
T _SYSTEM_DEPENDENT_03;
T _SYSTEM_DEPENDENT_04;
union
{
T KernelCallbackTable;
T UserSharedInfoPtr;
};
DWORD SystemReserved;
DWORD _SYSTEM_DEPENDENT_05;
T _SYSTEM_DEPENDENT_06;
T TlsExpansionCounter;
T TlsBitmap;
DWORD TlsBitmapBits[2];
T ReadOnlySharedMemoryBase;
T _SYSTEM_DEPENDENT_07;
T ReadOnlyStaticServerData;
T AnsiCodePageData;
T OemCodePageData;
T UnicodeCaseTableData;
DWORD NumberOfProcessors;
union
{
DWORD NtGlobalFlag;
NGF dummy02;
};
LARGE_INTEGER CriticalSectionTimeout;
T HeapSegmentReserve;
T HeapSegmentCommit;
T HeapDeCommitTotalFreeThreshold;
T HeapDeCommitFreeBlockThreshold;
DWORD NumberOfHeaps;
DWORD MaximumNumberOfHeaps;
T ProcessHeaps;
T GdiSharedHandleTable;
T ProcessStarterHelper;
T GdiDCAttributeList;
T LoaderLock;
DWORD OSMajorVersion;
DWORD OSMinorVersion;
WORD OSBuildNumber;
WORD OSCSDVersion;
DWORD OSPlatformId;
DWORD ImageSubsystem;
DWORD ImageSubsystemMajorVersion;
T ImageSubsystemMinorVersion;
union
{
T ImageProcessAffinityMask;
T ActiveProcessAffinityMask;
};
T GdiHandleBuffer[A];
T PostProcessInitRoutine;
T TlsExpansionBitmap;
DWORD TlsExpansionBitmapBits[32];
T SessionId;
ULARGE_INTEGER AppCompatFlags;
ULARGE_INTEGER AppCompatFlagsUser;
T pShimData;
T AppCompatInfo;
UNICODE_STRING_T<T> CSDVersion;
T ActivationContextData;
T ProcessAssemblyStorageMap;
T SystemDefaultActivationContextData;
T SystemAssemblyStorageMap;
T MinimumStackCommit;
};
typedef _PEB_T<DWORD, DWORD64, 34> PEB32;
typedef _PEB_T<DWORD64, DWORD, 30> PEB64;
#pragma pack(pop)
ReactOS:百度百科说明。这是一个克隆winnt的开源操作系统。
ReactOS文档:此处定位到peb__teb.h,可以从此处查看到一些源码信息。
PEB之转存工具:我这下载时显示404,但是作者的说明可以加深理解。
PEB之读取指定进程的环境变量字符串数据:我下下来用了,比如我当前的谷歌浏览器是读不,OD读不了,但是自己写的小程序,execel.exe是可以读的。也许可以提供思路。但是好像有个小问题,它使它读过的进程线程暂停了。
非PEB的一些笔记:涵盖的内容挺多。
PEB一个实际应用:读2.ntdll. 读3kernel32。
2017-7-29:在内存中不使用API而通过PEB遍历模块列表##下载链接
#region---------流程描述
//说明 :
// 1、不展开时为了取得结构体申明的名称,展开为了后续写汇编代码时好处理偏移
// 2、注意字符串是wchar_t类型的,不是char类型
//汇编:
void main()
{
__asm //只索引主模块,如果要查找其他模块可以进行遍历
{
mov eax, fs:[0x30] //PEB
mov eax, [eax + 0x0c] //_PEB_LDR_DATA
mov eax, [eax + 0x0c] //InLoadOrderModuleList起点
mov ecx, [eax] //跳过第1个模块。我的系统是win10,到这里就到了test_.exe
mov ecx, [ecx] //跳过第2个模块。我的系统是win10,到这里就到了ntdll.dll
mov ecx, [ecx] //跳过第3个模块。我的系统是win10,到这里就到了kernel32.dll
#region //以下应当使用循环,可遍历出所有dll信息
mov ebx, [eax + 0x18] //DllBase
mov ebx, [eax + 0x28] //FullDllName :完整路径
mov ebx, [eax + 0x30] //BaseDllName :文件名
#endregion //循环遍历可以使用多种方式,例如DllBase=0,或者使用do{}while(主模块地址!=InLoadOrderLinks[0])等;
}
}
#endregion