如何使用逆向工程更改呼叫
Posted
技术标签:
【中文标题】如何使用逆向工程更改呼叫【英文标题】:How to change a call with Reverse engineering 【发布时间】:2012-11-20 08:15:39 【问题描述】:我有一个示例程序test1.exe
,它使用示例库test2.dll
。
test.dll
包含相同类型的函数A()
和B()
。
test1.exe
调用A
然后退出。
在这里我找到了对A()
的调用:
(http://i.stack.imgur.com/5W9Jd.jpg)
现在,如果我没记错的话,我需要将88FDFFFF
替换为B()
的正确偏移量,但是如何计算它以便调用B()
而不是A()
?
【问题讨论】:
如果您打算使用二进制调试工具,您最好在了解目标计算机的指令集方面进行认真的投资。这些信息很容易在参考手册中找到;对于 x86,英特尔提供了很容易找到的在线参考资料,这些参考资料会让您难以忘怀。 【参考方案1】:如果这是在 x86 调用相关指令中,偏移值的计算方法是从目标地址中减去调用之后的指令地址(= 调用指令位置 + 5 个字节)。因此,您需要将偏移量修补为 address(B)-address(callinstruction+5)。
【讨论】:
好的。但是B()
位于一个dll中,那么address(B)
到底是什么?我知道它是test2.dll
中的入口点,但如何将其转换为text1.exe
中的地址? callinstruction+5 = ADD ESP,0C
呢?
欢迎来到逆向工程,在这里您可以了解比您真正想知道的更多的系统细节。是时候学习如何组织 DLL,以及标准代码如何调用 DLL 中的函数了。然后您将了解如何找到地址 (A),从而找到地址 (B)。 [我不会把“callinstruction+5 = ADD...”写成一个合理的等式。我没有检查您的示例以查看调用后的指令;可能是特定的 ADD 是该指令。在这种情况下,"address(callinstruction)+5 == address(ADD ...)" 如果这是您的问题]【参考方案2】:
我建议先学习 asm 基础知识,然后使用 HIEW hexeditor/disassembler 来更改简单的代码。
【讨论】:
我知道asm,HIEW用起来不太舒服。 是的,HIEW 是 99.9% 的逆向工具的基本工具,习惯它,它很容易使用。 大多数逆向器使用 IDA 和 OllyDBG。我以此为生,从未使用过 HIEW。只是我的 2 美分。 那么当你必须修改二进制文件时你是怎么做的呢?从 IDA 的十六进制视图?如果您从未使用过 HIEW,我很抱歉,但您是中途逆向工程师,也许您从未有过更具挑战性的项目要做。只是我 14 年的经验。【参考方案3】:如果 b
在 test1.exe 中导入,则很容易,否则您必须使用 LoadLibrary 和 GetProcAddress。
按ctrl+N
查看b
是否被导入。
【讨论】:
以上是关于如何使用逆向工程更改呼叫的主要内容,如果未能解决你的问题,请参考以下文章