首页
社区
课程
招聘
[原创]SigilHook:用 AngelScript 做 x86/x64 函数 Hook 的注入式运行时
发表于: 2026-9-30 19:08 481

[原创]SigilHook:用 AngelScript 做 x86/x64 函数 Hook 的注入式运行时

2026-9-30 19:08
481

冰与火的战歌:Windows内核攻防实战高级班!从零到实战,融合AI与Windows内核攻防全技术栈,打造具备自动化能力的内核开发高手。

最后于 2026-9-30 19:11 被StackPointer编辑 ,原因:
收藏
点赞 ・1
打赏
分享
最新回复 (4)
雪    币: 2939
活跃值: (5770)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2 楼
支持,来个简单点的例子吧,就hook sleep 打印参数 然后展示下如何使用脚本热加载脚本
2026-10-1 10:44
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3 楼
// Copyright (c) 2026 StackAndPointer
// SPDX-License-Identifier: MIT
//
// Plants vs. Zombies x86 target:
//   Board::Update at 0x415D40 receives Board* this in ECX.
#include "SigilHook.ash"

uint64 g_boardUpdateHook = SH_INVALID_HANDLE;

void onBoardUpdate() {
    const uint64 board = shReg(SH_REG_CX);

    array<uint64> args(2);
    args[0] = 1;
    args[1] = board;

    uint64 result = 0;
    const uint8 status = shCallUsercall(
        0x41B960,
        "void",
        "int,void*",
        "usercall:ret=none;arg0=ecx;arg1=eax",
        args,
        result);
    if (status != SH_OK) {
        shLog("Board::AddSunMoney call failed: " + shStatusString(status));
    }

    // Call the relocated original Update after inserting the AddSunMoney call.
    const uint64 original = shTrampoline(g_boardUpdateHook);
    if (original == 0) {
        shLog("Board::Update trampoline is unavailable");
        shSkipOriginal();
        return;
    }

    array<uint64> originalArgs(1);
    originalArgs[0] = board;
    const uint8 originalStatus = shCallUsercall(
        original,
        "void",
        "void*",
        "usercall:ret=none;arg0=ecx",
        originalArgs,
        result);
    if (originalStatus != SH_OK) {
        shLog("Board::Update original call failed: " + shStatusString(originalStatus));
    }

    shSkipOriginal();
}

void main() {
    installAddSunMoneyHook();

    g_boardUpdateHook = shHookUsercall(
        0x415D40,
        "void onBoardUpdate()",
        "void:void*",
        "usercall:ret=none;arg0=ecx");
    if (!shIsValidHook(g_boardUpdateHook)) {
        shLog("Board::Update hook failed: " + shLastError());
    }
}

void unload() {
    if (shIsValidHook(g_boardUpdateHook)) {
        shDestroyHook(g_boardUpdateHook);
        g_boardUpdateHook = SH_INVALID_HANDLE;
    }
    uninstallAddSunMoneyHook();
}
// Copyright (c) 2026 StackAndPointer
// SPDX-License-Identifier: MIT
//
// Plants vs. Zombies x86 target:
//   Board::AddSunMoney at 0x41B960 receives theAmount in ECX and this in EAX.
#include "SigilHook.ash"

uint64 g_addSunMoneyHook = SH_INVALID_HANDLE;

void onAddSunMoney() {
    const uint64 amount = shReg(SH_REG_CX);
    shSetReg(SH_REG_CX, amount * 0);
    shKeepOriginal();
}

void installAddSunMoneyHook() {
    g_addSunMoneyHook = shHookUsercall(
        0x41B960,
        "void onAddSunMoney()",
        "void:int,void*",
        "usercall:ret=none;arg0=ecx;arg1=eax");
    if (!shIsValidHook(g_addSunMoneyHook)) {
        shLog("Board::AddSunMoney hook failed: " + shLastError());
    }
}

void uninstallAddSunMoneyHook() {
    if (shIsValidHook(g_addSunMoneyHook)) {
        shDestroyHook(g_addSunMoneyHook);
        g_addSunMoneyHook = SH_INVALID_HANDLE;
    }
}
这是修改PVZ的示例,热重载现在是手动触发形式,或许可以改成检查代码是否被修改触发。
2026-10-1 13:11
0
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4 楼

欢迎提issues

最后于 2026-10-1 13:14 被StackPointer编辑 ,原因:
2026-10-1 13:12
0
雪    币: 2939
活跃值: (5770)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5 楼
最后于 2026-10-1 16:11 被小希希编辑 ,原因: 重写
2026-10-1 15:42
0
游客
登录 | 注册 方可回帖
返回