boxxie 发表于 2026-1-12 20:12
小菜不是很会改
能否,烦请楼主告诉一下具体改那里呢
多谢了
<火山程序 类型 = "通常" 版本 = 1 />
# @ typedef void (*ORIGINAL_CODE)();
# @ ORIGINAL_CODE fpOriginalLocation = nullptr;// 这里的名称与下面取特殊指针的名称一致就可以了
方法 钩子内联JMP方法 <公开 静态 @强制输出 = 真>
{
调试输出 ("从HOOK 内存地址跳转到了当前方法中,执行完这段后再跳回源地址!")
调用原函数 ("fpOriginalLocation", 整数, )// 跳回原地址继续向下执行
}
方法 内联钩子指定地址跳转 <公开>
{
变量 状态码 <类型 = HOOK状态>
变量 pTargetAddress <类型 = 无类型指针>
pTargetAddress = 无类型指针.长整数转指针 (0x140001234)
状态码 = 简单HOOK.创建钩子1 (pTargetAddress, 钩子内联JMP方法, 取特殊指针 ("fpOriginalLocation", 无类型指针))
如果 (状态码 != HOOK状态.操作成功 && 状态码 != HOOK状态.目标钩子已经创建)
{
信息框 ("钩子创建失败," + HOOK状态码到文本 (状态码), , )
返回
}
状态码 = 简单HOOK.启用钩子 (pTargetAddress)
如果 (状态码 != HOOK状态.操作成功)
{
信息框 ("钩子启用失败," + HOOK状态码到文本 (状态码), , )
返回
}
// 这里就已经挂接成功了,只要调用那个地址,就会HOOK回调到【钩子内联JMP方法】中执行了.
简单HOOK.移除钩子 (pTargetAddress)
返回
// @ @m<RM_TYPE_INLINE_DEF>(void,ORIGINAL_CODE,fpOriginalLocation)
}
大概就是这个意思。具体还要看实际情况来定。说白了,内联就是JMP,跳来跳去罢了。
666666
boxxie 发表于 2026-1-12 20:12
小菜不是很会改
能否,烦请楼主告诉一下具体改那里呢
多谢了
我更新了下示例跟模块,里面有例子,参考一下吧。
:loveliness:
好的
多谢楼主分享哟
其实可以改成完全无需嵌入代码的,因为你有些地方搞复杂了。
比如你用嵌入代码定义函数指针和变量,不如直接用个变整数或通用指针变量,然后用“调用静态方法、调用无参数静态方法、调用无返回值静态方法”,需要CDECL的再改一个方法就行。
另外火山一般只要类型尺寸一致就可以了,指针、句柄都可以直接用“变整数”,改为在嵌入代码里加上类型强转。定义太多类型容易跟其他模块冲突。
Xelloss0618 发表于 2026-1-12 23:45
其实可以改成完全无需嵌入代码的,因为你有些地方搞复杂了。
比如你用嵌入代码定义函数指针和变量,不如直 ...
大佬你说的很对啊,确实可以弄成不用嵌入代码!突然开窍了!哈哈,哪些类型是以后有用的!我还没弄完!感谢大佬点评!!谢谢
不错,谢谢分享
海王牛逼
Xelloss0618 发表于 2026-1-12 23:45
其实可以改成完全无需嵌入代码的,因为你有些地方搞复杂了。
比如你用嵌入代码定义函数指针和变量,不如直 ...
:噜阿噜
还是X大大想更高大上
海王 发表于 2026-1-12 20:30
# @ typedef void (*ORIGINAL_CODE)();
:L
太菜了,没看懂楼主的代码
HOOK的是个内存地址,楼主你代码里用的还是函数名.
头大了,没看懂:'(