2011-09-12 57 views
0

我有這個程序,我正在嘗試進行逆向工程。我不知道它是否是編譯器的優化或困惑,但現在,調用其他函數通過數學計算的代碼的某些部分則稱爲如組裝相對JMP/CALL工具/插件的絕對JMP/CALL?

CALL EAX 

,直到它加載爲它工作正常另一個程序中的DLL。基地址偏移被改變,所以現在所有相關的代碼都能正常工作,但是所有計算得到的調用/ jmps都不會進入正確的區域。

所以我想通過將所有絕對調用轉化爲相對調用來輕鬆解決這個問題。

在步進代碼並讓所有數學計算出來的時候,我得到了正確的jmp/call offset。

我沒有像沒有足夠的空間來分配補丁的問題。由於絕對調用通常使用它之前,我可以使用,以及解決的事情了

絕對電話線,這就是數學結束:

seg000:0044F7D1     add  eax, 3B882683h 
seg000:0044F7D6     call eax 

轉換爲喜歡

seg000:0044F7D1     call  3B882683h 

那麼上述過程將不會作爲EAX工作的已經的東西,但它只是一個僞代碼示例

那麼我的問題不是如何做到這一點,但沒有任何在OllyDbg或IDA Pro中爲我自動執行此操作的插件?

回答

0

你想要得到的變量調用的計算ADRESS,那真的很難搞清楚,因爲它們不相等,你怎麼在這部分

seg000解釋它:0044F7D1添加EAX,3B882683h seg000:0044F7D6調用eax

會很容易做出這樣的插件,但它從來就不是這樣的。 EAX可能會改變那部分代碼,這就是爲什麼這個調用是一個「變量」。試想一下,如果你不允許通過EAX或者其他任何寄存器會改變調用該函數而不讓你通過,那麼代碼的一部分控制遊戲中的門或者其他任何東西,否則你被允許,因爲你有一個密鑰或者類似的東西和代碼將EAX更改爲地址,通話執行代碼打開大門。這只是一個例子,因爲有變量的調用。你想想的一個插件,必須聽到所有可能的電話,這可能是一個非常龐大的大規模,會導致錯誤或沒有概述。

因此,最簡單的方法是打破這個通話並閱讀寄存器。 我希望能夠幫助你理解,或者我沒有回答正確的問題,你的問題有點誤導,因爲你說了關於JMP和一個dll注入的問題,這讓我很不爽。你可以在私人信息或這裏告訴我更詳細的信息。

+0

我想撕毀的代碼..並把它放在C中的函數/ ++,我不能模擬代碼確保..但獲得像'call eax'這樣的函數我可以通過跳到每個調用eax的斷點來實現嗎?但你知道有多少電話eax的?超過1000.如何在地獄我會得到他們所有的手..所以我要求一個工具,汽車撕裂功能..並放置調用EAX可能有一個評論,它被稱爲。 – SSpoke

1

您可以使用調用LoadLibrary

使用KERNEL32.LoadLibraryA

KERNEL32。GetProcAddress的

調用EAX

KERNEL32.FreeLibrary

也當您導入一個頭的所有功能地址保存到穩定的地址。函數的地址是變化,但你總是調用這些穩定的地址,而不是你的函數的地址。

您可以通過某些程序(如「pe explorer」)查看dll函數的地址。 enter image description here

您總是打電話給00402008h,但00402008h不是您的功能地址。00402008的值是你的函數的地址。

  • FF25 08204000會打電話00402008
  • E8 0500萬的價值將調用EIP + 00000005