首页
社区
课程
招聘
[原创]360比赛第3题-我的解法
发表于: 2008-12-20 12:38 38236

[原创]360比赛第3题-我的解法

2008-12-20 12:38
38236

这题比较简单,大牛们不愿意发,我来发一下我的解法。
第3题—注册表保护挑战题

驱动加载后,创建一个内核态线程( driver-created thread)

0001054A xor eax, eax
0001054C push eax ; StartContext
0001054D push offset StartRoutine ; StartRoutine
00010552 push eax ; ClientId
00010553 push eax ; ProcessHandle
00010554 mov [ebp+ObjectAttributes.RootDirectory], eax
00010557 mov [ebp+ObjectAttributes.ObjectName], eax
0001055A mov [ebp+ObjectAttributes.SecurityDescriptor], eax
0001055D mov [ebp+ObjectAttributes.SecurityQualityOfService], eax
00010560 lea eax, [ebp+ObjectAttributes]
00010563 push eax ; ObjectAttributes
00010564 push 1F03FFh ; DesiredAccess
00010569 lea eax, [ebp+ThreadHandle]
0001056C push eax ; ThreadHandle
0001056D mov [ebp+ObjectAttributes.Length], 18h
00010574 mov [ebp+ObjectAttributes.Attributes], 200h
0001057B call ds:PsCreateSystemThread

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (15)
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好思路!!!!学习!!
2008-12-20 12:58
0
雪    币: 152
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
想问下是怎么判断循环中遇到的线程就是从StartRoutine开始执行的那个线程?
2008-12-20 13:00
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
4
呵呵 写suspend做法的基本都是抄看雪腾讯比赛的吧

这题本来是不允许SUSPEND线程的,只是为了降低难度,所以去掉了这个限制
你找线程的那个方法是非常不通用的 ,不是很好

那么现在已知的答案有四种:
1.suspend法
2.vol key法
3.直接HIVE法
4.hive替换法

目前选手做出来的只有前三种
2008-12-20 14:35
0
雪    币: 1126
活跃值: (156)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
5
我没准备回复
2008-12-20 15:06
0
雪    币: 63
活跃值: (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
6
偶也想过suspendthread法
2008-12-20 23:21
0
雪    币: 204
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
郁闷!!我的suspend方法怎么失败了呢?早知道通讯比赛里面有这个方法我也去看一下咯。 我只会hive方法,以为hive方法评委不推荐用,导致这题居然没做!悔不该当初。。。
2008-12-21 11:29
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
8
我第一反应就是用Suspend法,不过我真不知道那个看雪什么比赛上用过~~~
2008-12-21 12:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
[QUOTE=;]...[/QUOTE]
楼主很好很强大啊
2008-12-21 15:11
0
雪    币: 635
活跃值: (101)
能力值: ( LV12,RANK:420 )
在线值:
发帖
回帖
粉丝
10
suspend法没什么。只是做成地址低16位比较就比较XX TX了~
2008-12-21 21:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
王姐姐 你太牛啦
2008-12-21 22:02
0
雪    币: 1262
活跃值: (760)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
pSystemProc = (PSYSTEM_PROCESSES)lpSystemInfo;
        while(pSystemProc->NextEntryDelta != 0)
        {
                 if(pSystemProc->ProcessId == dwPID)  //为什么不用NtQuerySystemInformation 里获得的 ProcessName 比较是不是"System"进程.

而是用 CreateToolhelp32Snapshot 便利进程获得"SYSTEM"进程ID,然后
用NtQuerySystemInformation获得的信息链表再与 CreateToolhelp32Snapshot获得的进程ID比较呢呢。

NtQuerySystemInformation 难倒这个的功能不够强大一定要CreateToolhelp32Snapshot一起辅助。
小鸟,我认为NtQuerySystemInformation 足够了啊。看不懂,请大师指点。睡不着啊,在线等。

好不容易编译通过啊。下载最新sdk  + ntdll.h + ntdll.lib
(http://bbs.pediy.com/attachment.php?attachmentid=17289&d=1219225831)

代码有一处明显错误,导致编译不过。调用这个函数NtQuerySystemInformation的两个地方
,全部要改成pfNtQuerySystemInformation

-------------------------------------------------------------------------------
调试到半夜,发现 ScanProcess  函数用 CreateToolhelp32Snapshot 去获得"SYSTEM"的进程ID是多余的。
ScanProcess 这函数可以不要 。
SpeciProcess 这个函数就可以它的所有的事情。只要在SpeciProcess函数
        while(pSystemProc->NextEntryDelta != 0)
        {
               

                if(pSystemProc->ProcessId == dwPID)   //  只要在这里加进程名判断就可以。但搞不懂楼主意图。
                {                                                             //或者有什么深层的意思是我不懂的。请教论坛的高手,我也学习下。

                        for(ulIndex = 0; ulIndex < pSystemProc->ThreadCount; ulIndex++)
                        {
2008-12-21 22:48
0
雪    币: 221
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
13
NtQuerySystemInformation是在NTDLL.H中直接申明的,否则应采用pfNtQuerySystemInformation来调用。

后面的可以简化。
2008-12-22 08:55
0
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
请问 楼主 :
如何才能发现这个线程呢 用工具 还是  什么东西  ???
2008-12-22 09:39
0
雪    币: 1262
活跃值: (760)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
15
应该是ida
2008-12-22 12:16
0
雪    币: 44
活跃值: (133)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
ProcessExplorer就能看到该线程
2008-12-24 14:45
0
游客
登录 | 注册 方可回帖
返回
//