我有一个使用的例子库test2.dll
一个示例程序test1.exe
。如何更改呼叫与逆向工程
test.dll
所包含的功能和A()
相同类型的B()
。test1.exe
调用A
然后退出。
在这里,我找到了呼叫A()
: (http://i.stack.imgur.com/5W9Jd.jpg)
现在,如果我没有记错,我需要用正确的B()
偏移更换88FDFFFF
,却怎么也我计算它,以便B()
将被调用,而不是A()
?
我有一个使用的例子库test2.dll
一个示例程序test1.exe
。如何更改呼叫与逆向工程
test.dll
所包含的功能和A()
相同类型的B()
。test1.exe
调用A
然后退出。在这里,我找到了呼叫A()
: (http://i.stack.imgur.com/5W9Jd.jpg)
现在,如果我没有记错,我需要用正确的B()
偏移更换88FDFFFF
,却怎么也我计算它,以便B()
将被调用,而不是A()
?
如果这在x86呼叫相对指令,偏移值是通过减去呼叫之后的指令的地址计算(=调用指令位置+ 5个字节),从目标的地址。所以,你需要修补偏移地址(B) - 地址(callinstruction + 5)。
好的。但是'B()'位于一个dll中,那么'address(B)'究竟是什么?我知道它是'test2.dll'内的入口点,但是如何将它转换为'text1.exe'中的地址?并且'callinstruction + 5 = ADD ESP,0C'? – assafmo
欢迎来到逆向工程,在那里你可以了解更多关于系统细节的信息,而不是你真正想知道的。您需要花时间学习如何组织DLL,以及标准代码如何调用DLL中的函数。然后你就会明白如何找到地址(A),因此地址(B)。 [我不会写“callinstruction + 5 = ADD ...”作为一个合理的等式。我没有检查你的例子,看看这个调用之后有什么指令;它可能是那个具体的ADD是那个指令。在这种情况下,“地址(callinstruction)+5 ==地址(ADD ...)”如果这是你的问题] –
如果b
在test1.exe进口很容易,否则你必须使用LoadLibrary和GetProcAddress的。
按ctrl+N
,看是否b
进口与否。
如果您打算使用二进制调试工具,您最好在认识目标计算机的指令集方面进行认真的投资。这些信息很容易在参考手册中找到;对于x86,英特尔提供了很容易找到的在线参考资料,这些参考文献将详细淹没您。 –