近期反编译CreateProcessInternalW中的一小段函数:
BaseInitializeContext 为Kernel32.dll文件中一内部函数,其作用为即将创建的线程初始化上下文CONTEXT的结构。
由于每个OS及补丁的版本不同,Kernel32.dll都不尽相同。下文例子所使用的相关文件信息如下:
Kernel32.dll 的文件信息:
文件版本: 5.1.2600.5512 (xpsp.080413-2111)
MD5: BF1CDAF5792B78D4730727FACF307D46
在汇编中,为结构成员赋值,通常的做法为把该结构的基地址传给一个寄存器,然后再用[register+offset]的方式来表示这个成员。这个函数中用到的最重要的结构就是CONTEXT了,下图为其成员偏移。有了这个图,就可以更轻松的理解汇编所表达的意思了。
注意:如果结构变量为一栈变量(与当前代码所使用的堆栈相同),则变量的表示一般为[ebp-var_off],该变量的成员就直接表示为[ebp-var_off+mem_off]。var_off指代变量在栈中的基址,mem_off为结构成员的偏移,同上一种表示方法中的offset。
CONTEXT结构成员偏移图
void WINAPI BaseInitializeContext(CONTEXT* pContext, PPEB pPeb, PVOID pEntryPoint, DWORD dwInitESP, DWORD dwEipType)
{
l_7C810433:
pContext->SegGs = 0;
pContext->Eax = pEntryPoint;
pContext->Ebx = pPeb;
pContext->SegDS = pContext->SegES = pContext->SegSS = 0x20;
pContext->SegFS = 0x38;
pContext->SegCS = 0x18;
pContext->EFlags