C#:劫持近乎相对的电话

时间:2010-03-13 22:50:29

标签: c# c++ assembly

好吧,我正在尝试为不是我写的程序写一个不同的基本修改 我没有它的来源。
我也不在乎这只适用于单个版本的程序,因此硬编码偏移是可行的。无论如何,我已经找到了函数以及它在编译程序中的调用位置。

.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);
}

获取我想要做的事情的主旨? 使用stdcall函数,只需用我自己的函数地址替换4字节地址即可。但这是一个近乎相对的呼叫,这更令人讨厌。

那么,任何人都有任何想法?

1 个答案:

答案 0 :(得分:1)

AFAIK,你不能用纯C#做到这一点。编写一个小的C / C ++ DLL来包含钩子代码。如果C / C ++编译器不支持此特定调用约定,则始终只能使用程序集。如果您不想使用单独的DLL,您可以随时“手动”将二进制代码写入C#中的新内存区域,并将调用重定向到该内存区域。