3

我已经四处搜索,但我不确定我是否在问正确的问题,无论如何我都找不到太多,也许链接会有所帮助。

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

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

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

抱歉,如果我的术语不正确,因为我是新手,所以我不太确定该叫什么。

4

2 回答 2

2

(回复对原帖的评论)

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

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

于 2010-05-24T02:33:40.043 回答
0

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

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

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

于 2015-08-05T18:07:30.063 回答