首页
社区
课程
招聘
[分享]发两个过TerSafe反调的驱动
发表于: 2012-4-6 09:40 19458

[分享]发两个过TerSafe反调的驱动

2012-4-6 09:40
19458

一个是一年前写的,当时技术太菜,全硬编码通用性不太好,
大概思路就是,tersafe.sys里有个链表里面保存了要清零DebugPort的进程eprocess地址,
访问这个链表前要KfAcquireSpinLock加锁,
因此hook这个函数将其表清空即可饶过DebugPort清零。
其他的就是饶过他的几个钩子没什么好说的。

一年后的今天大概又觉得心里痒痒又跟大牛们学了许多,于是写了个通用点的驱动,
方法大概就是那个加载一个原始内核模块,然后把全局数据引用指向原来的模块(修复重定位),然后修复新模块的ServiceTable里的函数指向新模块,
并把新模块的ServiceTable添加到SSDT中的第三项,
通过hook sysenter判断调用者是否为我们要保护的进程,
将eax即ServiceIndex加上2000h即可调用到新模块的Service函数.
这是对于上层调用的饶过钩子,而对于底层上来的中断什么的,遍历IDT,
将里面在原内核模块范围的ISR,全部指向新模块。
这样大约可以饶过大部分钩子了罢
而对于DebugPort清零,也没什么好说的,搜特征码后改掉偏移。
还有一个要注意的就是有几个地方要把直接使用函数地址的地方改到新模块里,
不然跑着跑着又会跑回旧内核模块里。

在这一年里感觉自己又学习了许多,希望下一年可以写出更好的驱动

参考文章:
http://bbs.pediy.com/showthread.php?t=148815&highlight=tprotect+%E4%BB%A5%E4%B8%8B+%E4%B8%8B
http://bbs.pediy.com/showthread.php?t=143987&highlight=%E5%8A%A0%E8%BD%BD+%E5%86%85%E6%A0%B8+%E6%A8%A1%E5%9D%97
http://bbs.pediy.com/showthread.php?t=140159&highlight=%E5%8A%A0%E8%BD%BD+%E5%86%85%E6%A0%B8+%E6%96%87%E4%BB%B6
http://bbs.pediy.com/showthread.php?t=142443


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

上传的附件:
收藏
免费 6
支持
分享
最新回复 (24)
雪    币: 1994
活跃值: (1526)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
2
**个肺啊,
2012-4-6 09:43
0
雪    币: 1994
活跃值: (1526)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
3
沙发我站了也
2012-4-6 09:44
0
雪    币: 220
活跃值: (726)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
现在好东西都是新手发了
2012-4-6 09:47
0
雪    币: 3116
活跃值: (1269)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
5
楼主,已经写好给你了。。
GalaxyAP过游戏反调试框架,里面就有啥重加载内核的框架

http://bbs.pediy.com/showthread.php?t=142443
2012-4-6 09:54
0
雪    币: 2331
活跃值: (2220)
能力值: (RANK:400 )
在线值:
发帖
回帖
粉丝
6
怎么最近搞游戏保护的人这么多啊。。。
2012-4-6 09:54
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
7
看雪水太深啊,淹死我都没捞出来
2012-4-6 10:02
0
雪    币: 279
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错,强大~~~
2012-4-6 10:15
0
雪    币: 177
活跃值: (278)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
友情顶贴(⊙o⊙)
2012-4-6 11:18
0
雪    币: 44
活跃值: (385)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
好东西,顶一个。
2012-4-6 11:33
0
雪    币: 8221
活跃值: (3892)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
非常不错
2012-4-6 12:42
0
雪    币: 506
活跃值: (70)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
友情顶哥 ,咱俩都天字辈的。
2012-4-6 12:53
0
雪    币: 508
活跃值: (202)
能力值: ( LV9,RANK:160 )
在线值:
发帖
回帖
粉丝
13
一年前的东西现在都增加好几个保护基本上没用了
2012-4-6 13:26
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
  感谢分享
2012-4-6 14:05
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
15
还是能用的,主要是他那个DebugPort清零一直可以用
2012-4-6 15:15
0
雪    币: 60
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
支持楼主分享
2012-4-8 14:31
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
不知道是不是使用的方法有问题

Win2003下,第2个驱动加载后,调用0x80->0x2080的NtOpenProcess时,NewKiFastCallEntry里还是调用了dword ptr fs:[1Ch] +124 +118 +0 +0x80*4 的老KeServiceDescriptorTable的表
2012-4-16 14:45
0
雪    币: 1763
活跃值: (964)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
学习了,牛人
2012-4-16 22:49
0
雪    币: 226
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
先顶,然后留着以后慢慢看
2012-4-16 23:09
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
20
[QUOTE=Music小冷;1064241]不知道是不是使用的方法有问题

Win2003下,第2个驱动加载后,调用0x80->0x2080的NtOpenProcess时,NewKiFastCallEntry里还是调用了dword ptr fs:[1Ch] +124 +118 +0 +0x80*4 的老KeServiceDescriptorT...[/QUOTE]

忘记说使用方法了,加载驱动后, OD等程序文件名里面加个 HackProtect 注意大小写
我测试了几台xp都没问题
2012-4-19 12:02
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
是在Win2003下测试的,最后发现问题在KeAddSystemServiceTable里,XP下TableIndex>3直接返回,Win2003下TableIndex>1就直接结束了.....

这个驱动边学边改改了好几天了还没在Win2003下改完。。。

PS:话说好像现在DXF不能在虚拟机的XP和2003中运行了?用了3个系统都没运行成功。。。
2012-4-19 16:06
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
在2003下KiFastCallEntry计算mov     edi,eax;shr     edi,8;and     edi,10h找不到合适位置。。。
MyKiFastCallEntry中把_KPCR *SelfPcr->_KTHREAD->ServiceTable的位置改成自己的SSDT和shadowSSDT,程序一启动就是0xc0000005错误
让被保护程序直接加载新内核也不会搞。。。
搞了很久也没搞定这个。。。彻底崩溃了。。。还是inline吧
2012-4-20 13:59
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
23
我只测试了xp sp3吧, ssdt一共4项,正常情况下只用了前2项, 我把新内核的sdt加为第三项,然后在KiFastCallEntry里面判断为保护的进程则将ServiceIndex加0x2000,这样他会自动去访问第三个表里面的函数了
2012-4-22 19:13
0
雪    币: 135
活跃值: (106)
能力值: ( LV2,RANK:140 )
在线值:
发帖
回帖
粉丝
24
开始我也也是想改KTHREAD里的ServiceTable, 不过后来想想这样可能稳定性和通用性反而不好就算了.
2012-4-22 19:15
0
雪    币: 376
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
XP里看了一下,确实如此
万恶的2003啊,只有2个表的位置。。。最后还是inline hook KiFastCallEntry里面替换了

顺便附上一直崩溃的MyKiFastCallEntry仅供娱乐
void __declspec(naked) MyKiFastCallEntry()
{
       
        __asm
        {
//                cmp eax, 1000h
//                jae win32k_s

                pushad
                push eax
                /*
                mov ax,23h
                mov ds,ax
                mov es,ax
                mov gs,ax//*/
                mov ax,0x30
                mov fs,ax

                call IsProtectProcessService
                test al, al                //=0 OLD;=1 NEW
                popad
                        je win32k_s
                        push edx
                        push edi
                                                mov     edi,dword ptr fs:[0x1C]                //_KPCR+1C
                                                mov     edi,dword ptr [edi+0x124]        //_KPCR *SelfPcr +124=_KTHREAD
                                                mov     edx,dword ptr [edi+0x118]        //_KTHREAD+118=ServiceTable
                                                cmp                edx,OrgServiceDescriptorTable_ntoskrnl_Addr
                                                je __changessdt
                                                cmp                edx,OrgServiceDescriptorTable_win32k_Addr
                                                je __changeshadow
                                                cmp                eax,0x1000
                                                jae __changeshadow
                                                jmp __nod
                                __changessdt:
                                                mov                edx,NewServiceDescriptorTable_ntoskrnl_Addr
                                                mov                dword ptr [edi+0x118],edx
                                                jmp __nod
                                __changeshadow:
                                                mov                edx,NewServiceDescriptorTable_win32k_Addr
                                                mov                dword ptr [edi+0x118],edx
                                __nod:
                        pop edi
                        pop edx
                add eax, 2000h
                jmp [NewKiFastCallEntry]
                jmp __end

win32k_s:
                jmp [OrgKiFastCallEntry]
__end:
        }
}
2012-4-22 23:14
0
游客
登录 | 注册 方可回帖
返回
//