分析平台:VC
编译工具:vs2012
类原型:
class CAddressChain
{
public:
CAddressChain();
BYTE* m_pbFeatureCode;
DWORD m_dwBaseAddress;
DWORD m_dwOffsetAddress[20];
};
构造函数定义:
CAddressChain:: CAddressChain()
{
m_pbFeatureCode = 0;
m_dwBaseAddress = 0;
for (int i = 0; i < 20; i++)
{
m_dwOffsetAddress[i] = -1;
}
}
创建方式之栈中创建:
void Test()
{
CAddressChain acw;
acw.m_dwBaseAddress = 1;
}
环境分析之准备环境:
void Test()
{
}
push ebp /*保存外层栈帧;栈帧,当前环境的栈空间的底部;栈底,空间最小值;栈帧指示了栈空间的底部,栈顶指示了栈空间的最大值;如图(在帖子最底下)
空间的顶部(esp),空间的底部(ebp) */
mov ebp,esp /*确定本层环境的栈空间底部;esp当前指示的是外层栈空间的顶部,本层需要拥有自己的栈空间,以方便数据的保存(局部变量),esp指示了栈空间当前的位置,顾把esp传递给ebp,用ebp来锁定本层栈空间的底部,有了底部(ebp),顶部(esp),就能确定本层栈空间的大小 */
/*这里为异常处理指令,没有深入研究,不做分析*/
push ebx /*保存外层寄存器,寄存器就那么几个,不够用,外层可能都用到了,所以这里先保存起来*/
push esi /*同上*/
push edi /*同上*/
sub esp,1C4h /*为本层栈空间分配了1C4h的空间;*/
lea edi,[ebp+FFFFFE30h] /* ebp,栈底;FFFFFE30h,这是补码形式,转换过来是-1C4h;即取到栈空间的顶部位置 */
mov ecx,71h
mov eax,0CCCCCCCCh
rep stos dword ptr es:[edi]
/*上面五条指令为本层栈空间分配空间,并初始化为CC,即int 3指令,如果不小心运行到这,即产生异常*/
至此,环境就安排好了;总结为:保护外层栈空间、寄存器;申请本层栈空间并初始化;
环境现状:
栈底 ebp
栈顶 esp
栈空间可用来申请的大小 ebp - (ebp – 1C4h)
本层栈空间总容量 ebp - esp
环境分析之退出环境:
之前有sub esp,1C4
这里有 add esp,1C4
之前有 push esi
这里有 pop esi
之前有 mov ebp,esp
这里又 mov esp,ebp
/*用到的寄存器,全部还原回去*/
对象创建:
CAddressChain acw;
push 1
lea ecx,[ebp+FFFFFF78h] /* lea ecx,[acw]; ebp栈底; FFFFFF78h 补码方式,转换为-88h;此处选取了栈空间ebp – 88h 的位置,栈总空间是ebp – 1C4h */
call 016D1B64 /*call CAddressChain::__autoclassinit; 初始化对象的栈;详细代码如下:
push ebp
mov ebp,esp
sub esp,0CCh
push ebx
push esi
push edi
push ecx
lea edi,[ebp+FFFFFF34h]
mov ecx,33h
mov eax,0CCCCCCCCh
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课