|
目标:用汇编取出当前行的地址
1 call XXX(一个地址) 占用的字节集数
----------
通常占用5个字节,call 占用一个字节集,地址通常占用4字节集
为什么说是通常呢?因为还用特殊的情况,如 call eax,机器码 FFD0,占用两个字节集,
这个情况目前不考虑
2 call一个地址后,返回地址的存放位置
----------
写一个子程序,放到OD里面看一下:
不上图了,图片字体比较模糊
00403597 55 PUSH EBP ; 单击按钮
00403598 8BEC MOV EBP,ESP
0040359A 81EC 04000000 SUB ESP,4
004035A0 8965 FC MOV DWORD PTR SS:[EBP-4],ESP
004035A3 68 00000000 PUSH 0
004035A8 68 0C314000 PUSH 0040310C ; ASCII "hello"
004035AD 68 0C314000 PUSH 0040310C ; ASCII "hello"
004035B2 68 00000000 PUSH 0
004035B7 B8 00000000 MOV EAX,0
004035BC E8 94020000 CALL 00403855 ; MessageBoxA
004035C1 3965 FC CMP DWORD PTR SS:[EBP-4],ESP
004035C4 74 0D JE SHORT 004035D3
004035C6 68 06000000 PUSH 6
004035CB E8 7F020000 CALL 0040384F
004035D0 83C4 04 ADD ESP,4
004035D3 8BE5 MOV ESP,EBP
004035D5 5D POP EBP
004035BC E8 94020000 CALL 00403855; MessageBoxA 就是call 信息框了,
F2断下,F7单步进入,看一下寄存器的变化,
单步进入前:
$ ==> > 00000000
$+4 > 0040310C ASCII "hello"
$+8 > 0040310C ASCII "hello"
$+C > 00000000
$+10 > 0018F628
$+14 >/0018F660
单步进入后:
$-4 > 004035C1 返回到 win.004035C1 来自 win.00403855
$ ==> > 00000000
$+4 > 0040310C ASCII "hello"
$+8 > 0040310C ASCII "hello"
$+C > 00000000
$+10 > 0018F628
$+14 >/0018F660
004035C1 3965 FC CMP DWORD PTR SS:[EBP-4],ESP
可以看到,返回地址放到了[ebp-4]的地址了,
3 写汇编代码取出[ebp-4]的值
----------
mov eax,[ebp-4]
leave
ret
得出返回值,这样还不够,+5得出当前行的地址,
mov eax,[ebp-4]
add eax,5
leave
ret
易语言中这样写
置入代码 ({ 139, 133, 252, 255, 255, 255, 129, 192, 5, 0, 0, 0, 201, 195 })返回 (0 )
不知道这样对不对,欢迎讨论
补充内容 (2018-3-19 14:15):
mov eax,[ebp+4]
' add eax,5
' leave
' ret
置入代码 ({139,133,4,0,0,0,129,192,5,0,0,0,201,195})
这样才对
|
|