好吧,我正在尝试对不是我编写的程序进行基本修改。
我没有它的来源。
我也不在乎这是否仅适用于程序的单个版本,因此硬编码偏移量是可行的。无论如何,我已经找到了这个函数以及它在编译程序中的调用位置。
.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 字节地址替换为我自己的函数地址即可。但这是一个近亲的电话,这..更烦人。
那么,有人知道吗?
最佳答案
据我所知,您不能在纯 C# 中执行此操作。编写一个小的 C/C++ DLL 来包含 Hook 代码。如果 C/C++ 编译器不支持这种特定的调用约定,您始终可以只使用汇编。如果您不想使用单独的 DLL,您始终可以“手动”将二进制代码写入 C# 中的新内存区域,并将调用重定向到该内存区域。
关于C#:劫持近亲调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440345/