Combojiang大叔blog上有篇文章
《一段让od跑飞的字符串压栈》,不过他没有解释,偶解释一下,希望大叔见谅:-)
pushsz MACRO str1
LOCAL label_1,label_2,label_3
push edx
call label_1 ; call label相当于push eip, jmp label
db 06ah,00h,0e8h,91h,0ch,00h,00h,0a3h ; (A),8字节
jmp label_2 ; (B)
db 0e8h
label_1:
pop eax ; 此时eax = eip ,也即是A处地址
add eax,8 ; eax 此时等于B处地址
push eax ; 保存eax
call label_3 ; push eip, jmp label_3,eip->db str1, 0
db str1,0
label_3:
pop edx ; edx指向db str1, 0
pop eax ; 恢复eax
jmp eax ; 跳转到eax,即为(B): jmp label_2
label_2:
xchg eax,edx ; 交换eax和edx, eax指向字符串
pop edx
ENDM
当执行完宏时,eax 指向字符串
起花指令的作用,IDA看了很乱
主要测试代码如下:
.code
start:
invoke GetModuleHandle,NULL
mov g_hInst,eax
invoke GetCommandLine
mov g_CmdLine,eax
invoke WinMain,g_hInst,NULL,g_CmdLine,SW_SHOWDEFAULT
invoke ExitProcess, eax
WinMain proc uses esi edi hInstance:dword,hInstPrev:dword,lpCmdLine:dword,nCmdShow:dword
push 0
pushsz "combojiang"
push eax
push eax
push 0
call MessageBoxA
xor eax, eax
ret
WinMain endp
end start
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!