能力值:
( LV2,RANK:10 )
|
-
-
2 楼
个人觉得把存放返回值的edi+13的地址放入堆栈就可以吧。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
就是我上面写的那样吗?
mov eax, dword ptr [edi+13]
push eax
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
[QUOTE=追风傲雪;711654]就是我上面写的那样吗?
mov eax, dword ptr [edi+13]
push eax[/QUOTE]
应该是
lea eax,dword ptr ds:[edi+13]
push eax
吧
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
假设我在函数里定义了一个局部变量:char ret_path[MAX_PATH];
在call dword ptr [edi+5]之后:
mov esi, eax
lea edi, ret_path
mov ecx, MAX_PATH
rep movs byte ptr es:[edi], byte ptr ds:[esi]
然后在call XXXXXXXX之前:
lea eax, ret_path
push eax
call XXXXXXXX
这样就能准确的调用XXXXXXXX函数,但我采用了naked约定,多了一个局部变量,我该怎么调整堆栈平衡?我用naked目的就是不想VC编译器帮我调整堆栈
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
edi+5 是我在代码段里留出来的地方,而不是数据段里的
我已经在程序前面加上#pragma comment(linker,"/section:.text,rwe"),把代码段设置为“可读可写可执行”了
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
请问怎么做才能保证正确地调用XXXXXXXX?如果定义局部变量的话,该怎么调整堆栈?不定义局部变量,那怎么把返回路径存放在堆栈里?麻烦高手们指导指导~
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
没人知道吗?帮帮忙啊~!~!~
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
顶~~~~~
|
能力值:
( LV3,RANK:20 )
|
-
-
10 楼
可以定义局部变量,但必须自己建栈结构,大概如下:
void __declspec(naked) Func()
{
char ret_path[MAX_PATH];
__asm
{
push ebp
mov ebp,esp
sub esp, __LOCAL_SIZE
lea eax,ret_path
push eax
call XXXXXXXX
.....
leave
ret
}
}
要点:__LOCAL_SIZE是编译器提供的宏,编译器会自动计算其大小(可能超过你的求的大小);局部变量访问时,要使用EBP,因此必须建立栈结构。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
问题已经解决了,感谢半道出家的回答
|
|
|