好吧,我正在尝试为不是我写的程序写一个不同的基本修改
我没有它的来源。
我也不在乎这只适用于单个版本的程序,因此硬编码偏移是可行的。无论如何,我已经找到了函数以及它在编译程序中的调用位置。
.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字节地址即可。但这是一个近乎相对的呼叫,这更令人讨厌。
那么,任何人都有任何想法?
答案 0 :(得分:1)
AFAIK,你不能用纯C#做到这一点。编写一个小的C / C ++ DLL来包含钩子代码。如果C / C ++编译器不支持此特定调用约定,则始终只能使用程序集。如果您不想使用单独的DLL,您可以随时“手动”将二进制代码写入C#中的新内存区域,并将调用重定向到该内存区域。