03 汇编常用小知识
小知识
| # x86
ebp + 4h: 函数返回地址
ebp + 8h: 函数第一个参数
ebp + 0Ch: 函数第二个参数
ebp - 4h: 函数内部第一个局部变量
ebp - 8h: 函数内部第二个局部变量
# 全局变量
mov 寄存器, byte/word/dword ptr ds:[0x12345678]
# 带符号位的扩展
movsx cx, al
# 补零扩展
movzx cx, al
# 疑似switch语句
jmp dword ptr [edx * 4 + 401000h]
|
栈帧技术
| push ebp // 提升堆栈,分配栈空间
mov ebp, esp
sub esp, 40h
push ebx // 保留现场
push esi
push edi
lea edi, [ebp-40h] // 初始化栈内数据
mov ecx, 10h
mov eax, 0CCCCCCCCh
rep stos dword ptr [edi]
push 4 // 第二个参数入栈
push 3 // 第一个参数入栈
call add // 调用add函数
add esp,0Ch // 平衡add函数堆栈
pop edi // 恢复现场
pop esi
pop ebx
add esp, 40h // 降低堆栈
mov esp, ebp // 恢复栈底
pop ebp
retn // 返回到调用处
|
判断函数参数个数
# 一般情况
# 第一步:观察调用处的代码
push 3
push 2
push 1
call 0x401000
# 第二步:观察平衡堆栈的代码
call 0x401000
add esp, 0Ch # 外平栈, __cdecl
# 或者函数内部
ret 0Ch # 内平栈, __stdcall
函数内部功能分析步骤
1. 分析参数
2. 分析局部变量
3. 分析全局变量
4. 功能分析
5. 返回值分析
do while循环

while循环

for循环

本文总阅读量
次