C#:劫持近亲调用

标签 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 字节地址替换为我自己的函数地址即可。但这是一个近亲的电话,这..更烦人。

那么,有人知道吗?

最佳答案

据我所知,您不能在纯 C# 中执行此操作。编写一个小的 C/C++ DLL 来包含 Hook 代码。如果 C/C++ 编译器不支持这种特定的调用约定,您始终可以只使用汇编。如果您不想使用单独的 DLL,您始终可以“手动”将二进制代码写入 C# 中的新内存区域,并将调用重定向到该内存区域。

关于C#:劫持近亲调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2440345/

相关文章:

assembly - 为什么 RISC-V 中 "long long"参数需要 "aligned even-odd register pair"

assembly - 如果距开始位置 <128 字节,则访问结构成员会更快?

c# - 更新和插入查询创建死锁

c++ - 在 Windows XP 和 CodeBlocks 上延迟加载 DWMAPI

c# - 在 MVC2 中显示图像 blob

c++ - 从 utsname 中找出 Linux 操作系统名称

c++ - OnDestroy 中的 DestroyWindow 不起作用

memory - 数组未跨越 256 字节边界

c# - 使用 FFMPEG/Splicer 和 C#

c# - Action 字典期望其键的类型