首页
社区
课程
招聘
原创 普及X64 ssdtshadow inline HOOK
发表于: 2015-9-22 02:14 12812

原创 普及X64 ssdtshadow inline HOOK

2015-9-22 02:14
12812

序:
我只想说~~再不发帖老大就 不搭理我了~~~
原因:玩保护玩到了 XINGCODE3 就他的各种检测就让我不得不重视这个问题了

各种窗口 各种X 我的工具 让我忍无可忍,就决定先HOOK了在说其他 最开始我用TA 的代码里面的 HOOK 方法 在 挂钩 NT 内核中的函数算是无往不利 在SHADOWSSDT中就蛋疼菊花紧了~~
于是 开始自己搞

我们要做的就是
得到KeServiceDescriptorTableShadow的地址 然后根据这个玩意儿得到函数地址 再inline hook!

大家要说了为什么不直接利用表HOOK 我就像说一句 太麻烦 要找一个在同一4GB 的内存空间做代理函数 还要二级跳 何必呢

HOOK 方式 使用汇编引擎得到一个不截断的大于等于14字节的可存放JMP 的长度

然后COPY 这个一片内存 复制到代理函数的开头  我用的汇编文件 给他30 个NOP 怎么都够了

然后 进入过滤函数 最后决定是跳回去执行还是这里就返回了

下面这个函数是获取 指定shadowssdt中指定index的项的函数地址

ULONG64 ssdt_GetSSDTShaDowFuncX64(ULONG serviceID){
        PKSERVICE_TABLE_DESCRIPTOR SSDTShadow;
        PULONG         W32pServiceTable;
        KAPC_STATE     ApcState;
        PULONG g_Guiprocess;
        ULONG64 funcAddress;
        SSDTShadow = (PKSERVICE_TABLE_DESCRIPTOR)KeServiceDescriptorTableShadow;
        serviceID &= 0x0FFF;
        if (!SSDTShadow)
        {
                return 0;
        }

        g_Guiprocess = Search64Process("csrss", 0);

        W32pServiceTable = SSDTShadow[1].Base;
        KeStackAttachProcess(g_Guiprocess, &ApcState);
        funcAddress = (LONGLONG)(W32pServiceTable[serviceID] >> 4)
                + (ULONGLONG)W32pServiceTable;

        KeUnstackDetachProcess(&ApcState);
        funcAddress &= 0xfffffff0ffffffff;
        return funcAddress;

}

代码略丑不要见怪
上面一些调用自己补充~~很简单~~

下面开始HOOK~、

这次目标程序函数是NtUserWindowFromPoint~
        g_NtUserWindowFromPoint = ssdt_GetSSDTShaDowFuncX64(20);这样就得到了这个函数的地址
        X64 = g_NtUserWindowFromPoint;保存一下一会儿HOOK 用
        g_NtUserWindowFromPoint = g_NtUserWindowFromPoint+ 15;//十五字节
这里一会儿代理函数跳回去 跨过15个字节用到

下面编写.asm 文件
这里这个函数的前15个字节不截断的
EXTERN        g_NtUserWindowFromPoint:QWORD //汇编中调用C里面申明的跳转地址
.CODE
FromPoint MACRO
        BYTE         048h ,089h ,05Ch ,024h ,018h ,048h, 089h ,04Ch  ,024h ,008h ,057h ,048h ,083h ,0ECh ,060h
ENDM
proxy_NtUserWindowFromPoint PROC
  FromPoint //实现开头15字节
  JMP QWORD ptr [g_NtUserWindowFromPoint] //跳回去
proxy_NtUserWindowFromPoint ENDP

  

一切准备就绪我们实现的功能就是跳到代理函数再跳回去~

DbgPrint("proxy_NtUserWindowFromPoint:%p", &proxy_NtUserWindowFromPoint);
        tmpv = (UINT64)&proxy_NtUserWindowFromPoint;

        memcpy(jmp_code + 6, &tmpv, 8);
        attach(&ApcState);

        DbgPrint("X64:%p", X64);
        irql = WPOFFx64();
        RtlFillMemory((void*)X64, 15, 0x90);
        memcpy(X64, &jmp_code, 14);
        WPONx64(irql);
        deach(&ApcState);
// HOOK好了

语文是生物老师教的不好意思献丑了~~~
看一下效果图

每次发帖都有些纠结【 【排版也不好~~~
如果大家愿意来我的博客看看我也是很高兴的 :http://blog.csdn.net/qq_18942885


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不错,就是vs写64位ASM只能db了,蛋疼
2015-9-22 04:29
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
要过PG的,自己玩玩就可以
2015-9-22 04:45
0
雪    币: 1392
活跃值: (5177)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
4
win7 的shadow不用过。win8才要
2015-9-22 08:25
0
雪    币: 2325
活跃值: (4908)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
博客收藏了·!~
2015-9-22 10:22
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
前段时间被x3恶心的不行。
看到一个搞x3的 肯定要致谢一下。
2015-9-22 15:16
0
雪    币: 719
活跃值: (777)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
7
他的窗口检测很恶心。。他还会。。最小化PCHT的窗口,。。。还有各种各种XX。总之很恶心的东西。
2015-9-22 19:42
0
雪    币: 326
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
这个能顺利的pass掉pg吗。
2015-10-6 14:35
0
雪    币: 22
活跃值: (453)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
暂时用不上 还是关注下~~
2015-10-6 16:23
0
雪    币: 459
活跃值: (398)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
10
原来如此,以为hook shadow也要pass pg
2016-5-24 14:52
0
游客
登录 | 注册 方可回帖
返回
//