跳转至

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循环

image_20221007_194418.png

while循环

image_20221007_194814.png

for循环

image_20221007195446.png


本文总阅读量
回到页面顶部