-
问题内容:急!请问:知道了函数的绝对地址,怎样用call 来调用此函数?
- 原讨论链接:http://community.csdn.net/expert/topicview1.asp?id=4794683
- 所属论坛:汇编语言
审核组:其他开发语言
- 提问者:gyj86
解决者:mydo
- 感谢:sclzmbie pig4210 DelphiGuy programfanny fhb13 akirya
- 关键字:函数 参数 调用 帖子 其他开发语言 汇编语言 地址 请问 汇编 call push
- 答案:
请问:知道了函数的绝对地址,怎样用call 来调用此函数?
我知道了user32.dll 里的messageboxA的函数的绝对地址是0x77d36476(00026476+
77d10000
)
我这样写:call 0x77d36476
可编译不通过,报告 improper operand type错误
请问如何写代码来完成这种功能 呀?
我是在vc里嵌的汇编
---------------------------------------------------------------
__asm
{
push 0
lea eax,szcp
push eax
lea ecx,sztxt
push ecx
push 0
mov ebx,0x77d36476
call ebx
}
---------------------------------------------------------------
write C++ in VS and then look up the generated assembly code. Copy&Paste!
---------------------------------------------------------------
函数调用前参数先入栈啊,正如二楼所说,三个必要参数要先push。再call。
不过我还是觉得不能成功,不是说windows的保护模式嘛,每个程序都独立拥有4G寻址,为你程序开辟空间时因为你程序没有导入函数表,可能未将messageboxA函数写入这个程序的所属空间。也就是说可能那个地址不允许访问,或根本就不存在入口。这样,用绝对地址去访问是不成功的,除非你确定这个地址一定存在入口并允许访问。
---------------------------------------------------------------
要先用LoadLibrary装载这个DLL,把这个DLL映射到进程的地址空间,然后就可以了。
---------------------------------------------------------------
在汇编里直接使用地址调用函数.
---------------------------------------------------------------
以前的帖子说过,楼主可以查查以前关于调用DLL的帖子。
---------------------------------------------------------------
typedef int (PASCAL *TYPE_MYFUN)(HWND,LPCTSTR,LPCTSTR,UINT);
TYPE_MYFUN MyFun=0x77d36476;
MyFun( 0, 0, 0, 0);
- 评价:
给朵鲜花(0)
扔个鸡蛋(0)