问个基础的问题:
只知道程序的地址,如0x77D507EA
在程序中应该如何调用这个函数呢?
我用call dword ptr ds:[77D507EAh]的话,编译可以正常通过,但是运行就会出错。如果在里面单步跟踪的话,走到这儿就跳飞了,就像这个例子,一下子跳到0x7c92e460处执行去了。
如我的试验程序temp.asm的代码如下:
.code
start:
call @lab
@lab:
pop ebp
lea ebp,[ebp+6]
jmp @f
db 'MessBox........',0
@@:
push 0
push ebp
push ebp
push 0
call dword ptr ds:[77d507eah]
ret
反汇编后的代码如下:
00401000 > $ E8 00000000 CALL temp.00401005
00401005 $ 5D POP EBP
00401006 . 8D6D 06 LEA EBP,DWORD PTR SS:[EBP+6]
00401009 . EB 10 JMP SHORT temp.0040101B
0040100B . 4D 65 73 73 4>ASCII "MessBox........",0
0040101B > 6A 00 PUSH 0
0040101D . 55 PUSH EBP
0040101E . 55 PUSH EBP
0040101F . 6A 00 PUSH 0
00401021 FF DB FF [COLOR="Red"];此处就是call dword ptr ds:[77d507eah]的机器码了[/COLOR]
00401022 15 EA07D577 ADC EAX,77D507EA
00401027 . C3 RETN
而直接用Call MessageBox的话,生成的机器码会有差别
temp2.asm的反汇编的代码如下:
00401000 >/$ E8 00000000 CALL temp2.00401005
00401005 |$ 5D POP EBP
00401006 |. 8D6D 06 LEA EBP,DWORD PTR SS:[EBP+6]
00401009 |. EB 17 JMP SHORT temp2.00401022
0040100B |. 4D 65 73 73 4>ASCII "MessBox........."
0040101B |. 2E 2E 2E 2E 2>ASCII "......",0
00401022 |> 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401024 |. 55 PUSH EBP ; |Title
00401025 |. 55 PUSH EBP ; |Text
00401026 |. 6A 00 PUSH 0 ; |hOwner = NULL
00401028 |. E8 0B000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
0040102D \. C3 RETN
0040102E 4D DB 4D ; CHAR 'M'
0040102F 61 DB 61 ; CHAR 'a'
00401030 72 DB 72 ; CHAR 'r'
00401031 6B DB 6B ; CHAR 'k'
00401032 4C DB 4C ; CHAR 'L'
00401033 61 DB 61 ; CHAR 'a'
00401034 62 DB 62 ; CHAR 'b'
00401035 45 DB 45 ; CHAR 'E'
00401036 6E DB 6E ; CHAR 'n'
00401037 64 DB 64 ; CHAR 'd'
00401038 $- FF25 00204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ; user32.MessageBoxA [COLOR="red"] ;注意,此处被编译成了FF25,而前面被编译成了FF15,这有什么差别??[/COLOR]
我查了一下Intel的指令集
FF /2 CALL r/m16 Call near, absolute indirect, address given in r/m16
FF /2 CALL r/m32 Call near, absolute indirect, address given in r/m32
9A cd CALL ptr16:16 Call far, absolute, address given in operand
9A cp CALL ptr16:32 Call far, absolute, address given in operand
FF /3 CALL m16:16 Call far, absolute indirect, address given in m16:16
FF /3 CALL m16:32 Call far, absolute indirect, address given in m16:32
那个FF /3还有FF /2是什么意思????
FF15和FF25什么区别????
对了,还有,temp2.exe里面401038处,是跳转指令,跳到402000处,此处是导入表,刚好存储的是MessageBoxA的地址,即0x77d507ea
为什么此处一个jmp,仅仅跳到了402000处,而此处仅是一个双字,它为什么能自动转到0x77d507ea???
谢谢了~
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!