2010-03-13 51 views
2

好的,我正在嘗試寫一個不是由我寫的程序的不同的基本修改。
我沒有它的來源。
我也不在乎這隻適用於單一版本的程序,所以硬編碼偏移是可行的。無論如何,我已經找到了函數,並在編譯的程序中調用它。C#:劫持近乎相對的電話

.text:1901C88F loc_1901C88F:      ; CODE XREF: ConnectionThread+1A2j 
.text:1901C88F         ; DATA XREF: .text:off_1901CC64o 
.text:1901C88F 8B C8   mov  ecx, eax ; jumptable 1901C862 case 11 
.text:1901C891 8B C6   mov  eax, esi 
.text:1901C893 E8 48 C5 FF FF call ChatEvent 

據IDA的全功能的簽名是:

char *__usercall ChatEvent<eax>(char *Data<eax>, unsigned int Length<ecx>) 

我已經有我需要在運行時修補程序,並做我所需要的任何其他操作。
我需要什麼,是能夠寫出像這樣一個功能:

bool ProcessChat(char *Data, unsigned int Length); 
char *__usercall HijackFunction(char *Data, unsigned int Length){ 
    if (ProcessChat(Data, Length)) 
     Call OriginalChatEvent(Data, Length); 
} 

得到什麼,我試圖做的JIST?
使用stdcall函數很容易,只需用我自己的函數地址替換4字節地址即可。但這是一個近乎相對的呼叫,這是更煩人的。

那麼,任何人有任何想法?

+0

Duh。計算相對地址。 – 2010-03-13 23:02:32

+0

Anton Tykhyy ..有幫助,謝謝。 我的問題是上下文,我可以很容易地計算出相對地址0x1901C898 - MyPointer。 但是,我不能爲了我的生活而想到如何在C#中編寫__usercall委託,我可能只是腦筋急轉彎。 無論如何,這是在switch語句中,所以我可以輕鬆地將該特定情況重定向到我想要的任何內存點。但就像我說的,我對這個堆棧感到擔憂,並使這個世界爆炸。 我不想搞亂堆棧,並使所有的東西爆炸... – Lex 2010-03-14 00:10:05

+0

你可以重新編譯C#二進制文件嗎?反射器應該能夠爲你提取整個項目.... – 2010-03-14 00:48:39

回答

1

AFAIK,你不能在純粹的C#中做到這一點。編寫一個小的C/C++ DLL來包含鉤住的代碼。如果C/C++編譯器不支持這種特定的調用約定,那麼您總是可以使用程序集。如果您不想使用單獨的DLL,則可以始終將二進制代碼「手動」寫入C#中的新內存區域,並將調用重定向到該內存區域。