能力值:
( LV2,RANK:10 )
|
-
-
2 楼
call = push 返回地址+push跳转地址+ret
你1楼只push+ret 那就相当于一个jmp so返回地址出错
call hehe
hehe:
pop eax
add eax,9
经过这个操作后eax就拿到了返回地址 push进去之后 就OK了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
能再说详细一点吗?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
有没有别的方法..可以不出错???
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
楼主想想:
你用
push dwkk
ret
这样调用了Myfun,但是你想想这个函数完了往什么地方返回,我这样写你也许就明白了
void TestFUN()
{
DWORD dwkk = (DWORD)Myfun;
__asm
{
push b1
push dwkk
ret
b1: nop
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
void TestFUN()
{
DWORD dwkk = (DWORD)Myfun;
__asm
{
call hehe
hehe:
pop eax
add eax,9
push eax
push dwkk
ret
}
}
这不就是传说说 模拟了一个CALL的功能?
楼主看看什么叫CALL
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
这个好象有问题啊 ?
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
还是没有搞清楚,我知道函数要返回..但是这个返回地址应该是CS:IP说了算啊.
给EAX赋值有什么用呢???
麻烦大家再说说吧,,我还是没有懂
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
我明白了一点点:知道要返回
就是不知道为什么一定要在push dwkk 之前压一个值,这个值压入后,是不是作为函数的返回值呢??
改成这样也行:
void TestFUN()
{
DWORD dwkk = (DWORD)Myfun;
__asm
{
mov eax, offset wenboly
push eax
push dwkk
ret
wenboly:
nop
}
}
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
401000 call Myfun
401005 xxxxxxxx
===========
push 4010005 //压入CALL的下一行汇编代码
jmp Myfun
压入个地址为了告诉程序运行完了CALL,要去什么地方
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
你是用push & retn的方法直接让代码跳转到了Myfun函数头去开始执行,这个操作并不等于call,而是相当于jmp,简单的说就是你在跳转到Myfun函数去执行之前,没有告诉Myfun这个函数执行完之后应该返回到什么地方去执行以后的代码,所以Myfun函数执行完毕后跳转到了一个无效位置,然后出错
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
谢谢各位。。。。。。。
|
能力值:
( LV9,RANK:250 )
|
-
-
13 楼
call==push eip+5/push offset FUNC/ret
ret ==pop eip...
可以这么理解...
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
楼主应该看看栈,函数执行完毕之后是要返回的,你那个mov eax, offset wenboly就是要取wenboly的偏移
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
void Myfun()
{
MessageBox(NULL,"dddd","DDD",0);
}
void TestFUN()
{
DWORD dwkk = (DWORD)Myfun;
__asm
{
lea eax,rreett
push eax
push dwkk
ret
rreett:
}
}
你没给返回地址,肯定出错
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
正解。
|
|
|