近期反编译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 = 0x3000;
pContext->Esp = dwInitESP;
if( dwEipType == 1 )
{
pContext->Eip = 0x7C8106E9;
}
else
{
if( dwEipType == 2 )
{
pContext->Eip = 0x7C82FF82;
}
else
{
pContext->Eip = 0x7C8106F5;
}
}
dwInitESP -= 4;
pContext->ContextFlags = CONTEXT_FULL;
pContext->Esp = dwInitESP;
}
狂汗啊55555,居然过了这么多年,还是不会用CSDN的编排功能:(。本想把反汇编一并贴进来对照着阐述一下,奈何这博客的编排功能把我“编排”得没有了兴致。下面再单独贴一下反汇编代码:
void WINAPI BaseInitializeContext(CONTEXT* pContext, PPEB pPeb, PVOID pEntryPoint, DWORD dwInitESP, DWORD dwEipType)
{
7C810433 8BFF mov edi, edi
7C810435 55 push ebp
7C810436 8BEC mov ebp, esp
7C810438 8B45 08 mov eax, dword ptr [ebp+8]
7C81043B 8B4D 10 mov ecx, dword ptr [ebp+10]
7C81043E 83A0 8C000000 00 and dword ptr [eax+8C], 0
7C810445 837D 18 01 cmp dword ptr [ebp+18], 1
7C810449 8988 B0000000 mov dword ptr [eax+B0], ecx
7C81044F 8B4D 0C mov ecx, dword ptr [ebp+C]
7C810452 8988 A4000000 mov dword ptr [eax+A4], ecx
7C810458 6A 20 push 20
7C81045A 59 pop ecx
7C81045B 8988 94000000 mov dword ptr [eax+94], ecx
7C810461 8988 98000000 mov dword ptr [eax+98], ecx
7C810467 8988 C8000000 mov dword ptr [eax+C8], ecx
7C81046D 8B4D 14 mov ecx, dword ptr [ebp+14]
7C810470 C780 90000000 38000000 mov dword ptr [eax+90], 38
7C81047A C780 BC000000 18000000 mov dword ptr [eax+BC], 18
7C810484 C780 C0000000 00300000 mov dword ptr [eax+C0], 3000
7C81048E 8988 C4000000 mov dword ptr [eax+C4], ecx
7C810494 0F85 E44B0000 jnz 7C81507E
7C81049A C780 B8000000 E906817C mov dword ptr [eax+B8], 7C8106E9
7C8104A4 83C1 FC add ecx, -4
7C8104A7 C700 07000100 mov dword ptr [eax], 10007
7C8104AD 8988 C4000000 mov dword ptr [eax+C4], ecx
7C8104B3 5D pop ebp
7C8104B4 C2 1400 retn 14
}
啥也不说了~~~~~~~~~~~~~~~~~~~~~~