汇编实现:
1.参数入栈;
2.函数调用;升栈;保护现场;填充缓冲区,执行操作;恢复现场,减低堆栈
3.平衡栈;
eg:
//保存原来栈底
push ebp
//提升栈
mov ebp,esp
sub esp,0x40
//保护现场
push edi
push esi
push ebx
//填充堆栈
mov eax,0x0cccccccc
lea edi,[ebp-40]
mov ecx,0x10
rep stosd ptr es:edi
//执行代码
//局部变量从ebp-4开始。参数从ebp+8开始
//恢复现场
pop ebx
pop esi
pop edi
//恢复堆栈
mov esp,ebp
pop ebp
三种调用约定:
_cdecl 参数从右至左入栈 平衡栈式调用者清理堆栈
_stdcall 参数从右至左入栈 平衡栈时自身清理堆栈
_fastcall ecx/edx传送前两个,剩下从右至左入栈 自身清理堆栈
float数据表示
IEEE实现方式
指数表示方法:
若表示数据小数点为左移时将整数部分最高位置1,整数部分右移时将最高位置0;将为位移部分数据减1
区分if 与if …else 语句的特点在于jcc跳转之后的语句的上一句是否存在跳转语句
逆向工程函数分析:
1.分析函数参数:将传入的参数分别用符号进行表示;
2.分析局部变量:[ebp-4]
3.分析全局变量:[0x12345678]
4.功能分析