2017-10-16 125 views
0

你好,我努力學習逆向工程,所以我從process hacker用來查看進程的內存動態串...可能獲得特殊內存地址文件中的引用程序集地址?

我得到這樣的:

Address Length Result 
----------------------- 
0x853978 (43): hello 
0xfb5e1a8 (86): hello alex ! 

現在我想知道如何能我得到/找到他們的參考地址?

我試用WinHex但我不能,我不知道我該怎麼做,是否有可能找到文件形式的內存地址參考彙編地址(例如:0x853978)或這是不可能的任何方式。

任何人都可以提供幫助嗎?

回答

3

它的變化是halting problem,所以它是不可能的,但是一些不完美的弱啓發式可以在多項式時間內完成以找到常見模式。

如果代碼編寫者決定避免加載地址的常見模式,例如由於混淆原因它可能是從多項式等計算出來的。使用軟件工具找到它實際上是不可能的,因此只需要分解代碼並理解它有幫助。

但是...爲什麼你用winhex失敗,即使在非神祕的情況下。

您沒有發佈任何有關您的平臺的信息,所以我們猜測它是x86-64。然後大多數二進制文件是PIC,所以引用特定數據的代碼是通過將相對偏移量添加到當前的rip(指令指針)來完成的。像lea rdx,[rip+1234] ; rdx = address of string "hello" ..然後超過該指令的+1234字節操作碼是第一個字節'h'。因此,創建一個工具,將所有可能的組合視爲位移偏移並將它們添加到當前的虛擬地址,可能有助於找到對特定位置的二進制文件的引用。

即使你知道,你正在尋找1234位移,x86是小端,所以32b位移常量1234 == 0x4d2被存儲在內存中作爲d2 04 00 00

但是通常在RE中,一些反彙編工具也用於反彙編代碼,所以你可以自己檢查它,並找出它是如何工作的,以及它在哪裏訪問特定的內存。反彙編並不完美(由於同樣的原因,正如我在開頭提到的那樣),但最好的反編譯器已經合理地調整了啓發式方法,以正確檢測常見代碼並以合理可讀的方式對其進行反彙編(儘管如果有人敢用一些技巧來製作它很難反彙編,並添加反調試措施,你可能不得不回到優質的舊紙和鉛筆,並手動模擬,以突破最初的防禦措施,使其可調試)。

這個答案聽起來可能相當暗淡和消極,實際上你通常會遇到二進制文件,它們要麼完全沒有棘手,要麼混淆不清,而且大多數專業的反彙編工具會產生合理的結果,只讀取它們爲asm源代碼,調試器也應該能夠與大多數二進制文件一起使用。儘管如果代碼是由高級語言編譯器生成的,將會有成千上萬行代碼,帶有剝離的調試信息,因此有經驗可以精確定位代碼的焦點位置,這是很好的,因爲您無法通過* all * of它在合理的時間。

編輯:

您也可以在某些平臺上使用的內存訪問斷點調試,找出運行過程中的任何「活」引用指令。這不會顯示所有這些,除非您強制代碼運行所有組合,但如果您感興趣哪些代碼在特定情況下可以訪問它,這就足夠了。