首页
论坛
课程
招聘
[原创]解决infinityhook在win7环境下启动失效的问题
2021-2-23 19:43 1621

[原创]解决infinityhook在win7环境下启动失效的问题

2021-2-23 19:43
1621

背景介绍,楼主的工作是排查网吧盗号或者挖矿问题,所以需要监控到傀儡进程是谁写入的内存。

 

使用了论坛上的infinityhook源码来监控写入函数,却发现驱动start设置为1时,系统启动后自己设置的infinityhook失效。
经过数日排查发现AddressOfEtwpGetCycleCount的值会改变两次,一次变为无效的指针,第二次就会变成一个对的值,所以驱动启动后开启一个线程来检测这个值,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
    NTSTATUS ReIfhInitialize(_In_
    INFINITYHOOKCALLBACK InfinityHookCallback)
{
    NTSTATUS Status;
 
    // 测试 CKCL 会话是否已经启动
    Status = IfhpModifyTraceSettings(1);
    if (!NT_SUCCESS(Status))
    {
        //
        //  // 没有启动 尝试打开
        //
        Status = IfhpModifyTraceSettings(0);
 
        if (!NT_SUCCESS(Status))
        {
            //这里代表打开失败  设置就失败了
            WriteErrorLogFile("重新初始化时尝试启动CKCL会话失败");
            return Status;
        }
 
        Status = IfhpModifyTraceSettings(1);
        if (!NT_SUCCESS(Status))
        {
            WriteErrorLogFile("重新初始化时尝试设置syscall失败");
            return Status;
        }
    }
 
    //
    // We need to resolve certain unexported symbols.
 
    if (!IfhpResolveSymbols())
    {
        WriteErrorLogFile("重新初始化时IfhpResolveSymbols失败");
        return STATUS_ENTRYPOINT_NOT_FOUND;
    }
 
 
    // We care about overwriting the GetCpuClock (+0x28) pointer in
    // this structure.
    //
    PVOID* AddressOfEtwpGetCycleCount;
    if (ISWIN7(g_oviEx)) {
        //WIN7系统
        AddressOfEtwpGetCycleCount = (PVOID*)((uintptr_t)CkclWmiLoggerContext + OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK_WIN7); //offset: 0x18
    }
    else {
        //WIN10系统
        AddressOfEtwpGetCycleCount = (PVOID*)((uintptr_t)CkclWmiLoggerContext + OFFSET_WMI_LOGGER_CONTEXT_CPU_CYCLE_CLOCK); //offset: 0x28
    }
    //
    // Replace this function pointer with our own. Each time syscall
    // is logged by ETW, it will invoke our new timing function.
    // 替换掉该地址的值为自己的函数  HOOK的关键步骤  
    _try
    {
        //保存原来的值
        static PVOID * OldAddressOfEtwpGetCycleCount = AddressOfEtwpGetCycleCount;
        //如果原来的值被修改 并且指针有效的情况下修改该指针即可成功,(会出现一次无效指针)
        if (AddressOfEtwpGetCycleCount != OldAddressOfEtwpGetCycleCount && MmIsAddressValid(AddressOfEtwpGetCycleCount))
        {
            *AddressOfEtwpGetCycleCount = IfhpInternalGetCpuClock;
            PsTerminateSystemThread(0);
        }
 
    }
    _except(EXCEPTION_EXECUTE_HANDLER)
    {
        WriteErrorLogFile("重新初始化时AddressOfEtwpGetCycleCount是无效的指针");
        return STATUS_UNSUCCESSFUL;
    }
    return STATUS_SUCCESS;
}

看雪学院推出的专业资质证书《看雪安卓应用安全能力认证 v1.0》(中级和高级)!

收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 569
活跃值: 活跃值 (198)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
vblank 活跃值 2021-2-23 22:39
2
0

前段时间我用这玩意也发现了这个诡异的问题,HOOK突然就失效了,一直不知道是啥原因。
话说ReIfhInitialize是一个线程?

最后于 2021-2-23 22:42 被vblank编辑 ,原因:
雪    币: 11
活跃值: 活跃值 (504)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
麻木的时间 活跃值 2021-2-23 22:41
3
0
IfhInitialize是他原来的初始化函数,我改了一下名字,重新初始化的意思。
游客
登录 | 注册 方可回帖
返回