Kernel32.dll!BaseInitializeContext 反编译源码

近期反编译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
}

啥也不说了~~~~~~~~~~~~~~~~~~~~~~

你可能感兴趣的:(c,汇编,OS,winapi)