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