我有一個使用的例子庫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,英特爾提供了很容易找到的在線參考資料,這些參考文獻將詳細淹沒您。 –