如何在汇编中找到函数虚拟调用地址?

时间:2010-05-24 01:33:07

标签: function assembly virtual virtual-address-space

我已经用Google搜索了但是我不确定我是否提出了正确的问题而且无论如何都找不到,也许链接会有所帮助。

我创建了一个显示消息框的c ++程序,然后我用Ollydbg打开它,然后转到它调用MessageBoxW的部分。

每次运行应用程序时,MessageBoxW的调用地址都会更改,因为Windows正在更新我的Imports表以获得正确的MessageBoxW地址。所以我的问题是如何在我的导入表中找到MessageBoxW的虚拟地址,以及如何在ollydbg中使用它?

基本上我正在尝试在程序集中创建一个代码洞来再次调用MessageBoxW。 通过使用十六进制编辑器搜索可执行文件并找到调用的位置,我得到了相当接近的一点,我想我找到了虚拟地址。但是当我在olly中调用该虚拟地址并将其保存到可执行文件时,下次打开它时,调用被一堆DB xyz替换(看起来像虚拟地址,但为什么{{1}被删除?

很抱歉,如果我的术语已关闭,因为我是新手,所以我不太确定该怎么称呼。

2 个答案:

答案 0 :(得分:2)

(回复原帖的评论)

啊,不,“call”操作码中指定的地址是相对于调用指令的。但是,对于导入的函数,它很可能是间接调用(从内存位置读取函数的地址)。

在没有访问导入段的情况下,实际上没有“官方”/可靠的方法来获取任何功能的地址。如果要修补某个可执行文件,只需查看Windows在其导入段中的值。如果从另一个进程注入代码,则可以依赖于系统DLL中函数的地址相对于DLL的加载地址保持不变的事实。也可以在内存中手动定位和解析程序的导入段。

答案 1 :(得分:0)

1-查找可执行模块中消息框的地址。假设您的exe文件是a1.exe

可执行模块>选择a1.exe>按ctrl + N并找到消息框的地址。假设地址是00402008

2-使用ff25 08204000机器代码来调用消息框,但在推送参数之前,请将EIP推送到返回的地址。