微点交流论坛
» 游客:  注册 | 登录 | 帮助

 

 61  2/7  <  1  2  3  4  5  6  7  > 
作者:
标题: 微点,杀毒界的前沿.............
aquaos
新手上路





积分 5
发帖 5
注册 2008-12-24
#11  

mj大牛终于爆了点tophet的东东。

※ ※ ※ 本文纯属【aquaos】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 16:18
查看资料  发送邮件  发短消息   编辑帖子
点饭的百度空间
银牌会员




积分 2315
发帖 2236
注册 2007-11-30
#12  

哈哈~ 为什么不能防? 样本扔出来


一种基于NTLDR的BOOTKIT──原理及实现

前言:XCON2008将于不日召开,其间国内外安全界之高手将云集席间,共享中国安全界这一盛会。吾自学计算机以来从网络受益颇多,或换言之,若无网络 便无今日我对计算机知识的了解。吾近来研究NTLDR的结构和功能略有所得便随手做了个基于NTLDR的BOOTKIT,正想写篇相关文章回馈互联网,也 正如安全焦点的LOGO所说"From the Internet, For the Internet",而恰好这时又侧耳听闻MJ0011将在此次XCON上发布它的高级Bootkit Tophet.A,吾虽对Tophet略有耳闻,但未睹其真面目,这次吾对Tophet也是翘首以待,在一睹Tophet真身以前,吾发现很少有相关 BOOTKIT的文章,也未见任何源代码,便决心写下这篇文章,一为回馈滋养了我多年的网络;二也为这次XCON的召开推波助澜。

一.简介
二.NTLDR的HOOK
三.内核的加载与定位
四.对内核做HOOK
五.在内存里搭个狗窝
六.把自己挂上去
七.源代码
八.尾声

一.简介

先简要介绍一下我这个BOOTKIT吧,我这个BOOTKIT是基于NTLDR的文件型BOOTKIT,NTLDR是winNT系列内核的 Osloader,当开机以后BIOS载入MBR,MBR载入DBR,然后DBR载入NTLDR,并将执行权转交给它,它再来启动内核。所以NTLDR是 最接近内核的,而且对它做HOOK,可以避免编写针对各种类型外设的代码,提高通用性。总的来说,我的BOOTKIT有以下几个特点:
1.ring3下就可完成hook(改写NTLDR)
2.注入内核的代码没有内存大小限制,也无需自己读入代码
3.BOOTDRIVER驱动初始化时加载(依情况而定,也可hook内核其它地方)
4.理论上可以hook各种版本ntldr
5.理论上可以引导各个版本nt内核和内存相关boot.ini参数(嗯,你的内核得能用ntldr启动才行)
暂时没有对PAE内核,x64和内存相关BOOT.INI参数提供支持。我的调试环境是Bochs、Vmware、Windbg、Win2000 sp4、WinXp sp2、Win2003 sp1。汇编工具是C32ASM。本文牵涉到Windows x86的段页式内存管理、Windows地址空间布局结构、PE文件结构和汇编的知识,本人在写作本文时假设您已经了解了这些知识。

二.NTLDR的HOOK:

要做NTLDR的BOOTKIT,当然,我们首先面临的问题就是如何对NTLDR做HOOK?要对NTLDR做HOOK,那就首先要对 NTLDR的文件结构有所理解才行。我大致说一下它的结构和功能,NTLDR是由两部分构成,一部分是被称作Su Module(Startup)的16位汇编代码,另一部分则是名为Osloader的PE文件。Su module位于NTLDR的头部,Osloader紧随其后。DBR将NTLDR加载到物理地址2000:0000开始的地方,然后跳转到这个地址,将 控制权交给NTLDR进行引导,而这个地址也就是Su的入口。Su的主要功能是为Osloader准备内存环境,包括GDT、IDT、打开保护模式(未分 页)和将Osloader按编译时的虚拟地址移动Osloader等等。在MP(多处理器)版本的NTLDR中,Su还有一件事情要做,就是检测 Osloader的完整性,如果它检测到NTLDR被修改,那么,嘿嘿,这句话送给你“NTLDR is corrupt.The system cannot boot.”为了兼容windows 2003,我的DEMO就是用这种版本的NTLDR做的,由于我太懒,就没有研究这部分了,我绕过它的办法就是把它切了——我用没有校验的Su替换了它 ——我是不是很黄很暴力?嗯,我想是有那么点!

再讲讲Osloader,它的作用比较复杂,说的简单点就是为内核准备执行环境,然Osloader会根据boot.ini的设置将 windows内核、hal.dll和其它Boot Driver加载进内存。有关NTLDR更详细的结构和功能,请读者参看有关资料。

了解了NTLDR的大致结构和功能。好,接着我们来看一下我们HOOK NTLDR所存在的问题?首先就是该在哪下手,理论上你可以在任何一个地方下手(废话),但是接下来你该跳转到哪里呢?茫茫内存,我该如何走啊,我又在人 生的道路上迷路了。。。靠!所以先要选个老巢,执行HOOK CODE之后,才能让CPU有个地方可以去。我选择将CODE放在Osloader里,没错,Su会按SECTION的地址重定位Osloader,这样 我们就可以很轻松地定位我们CODE的地址。我的做法就是直接用工具在Osloader里新建了一个节,将所有XX都放在了里面。兜了个圈子,我们回来, 我们到底要在哪下手呢?因为我们的根本目的是要HOOK内核,所以执行我们CODE的时候,内核要已经被加载进了内存。那我们怎么知道在哪内核已经被加载 进了内存呢?根据我对NTLDR的分析,在将控制权转给内核之前,Osloader会调用这个函数──BlSetupForNt,这个函数的会最后做些设 置的收尾工作,包括剪裁页表。有个函数有个P用啊?要定位它的位置啊!嗯,所以我在这个函数里面找到了这个特征码:
mov eax, cr3
mov cr3, eax (机器码:“0F 20 D8 0F 22 D8” )
这段代码是用来flush TLB的。这段代码在我能找到的NTLDR里都出现过了,眼看就可以下手了吧,我很遗憾的告诉你,我不只在一处找到了这串特征码,并且有在内核加载之前调 用的也有在内核加载之后调用的。为了顺利HOOK内核,所以我在CODE里加了保护性代码,通过这段代码你几乎可以在任何完整指令处进行HOOK。你可以 下很多HOOK,不过得有一个是在内核加载之后执行的。利用这段特征串能比较方面的找到HOOK点。

在我制作DEMO的过程中发现“0F 20 D8 0F 22 D8” 串会集中出现在文件头的部分和文件尾的部分,建议只HOOK文件尾的串。我使用"call RVA"共5个字节的指令来实现跳转。

PS:Osloader位置的确定可以直接搜索特征值"MZ", "PE"。

三.内核的加载与定位

当控制权顺着hook code,转移到这一步的时候,如上所言,我们必须确定内核是否加载。我第一个想到的办法就是硬编码内核一个地址,然后测试这个地址是否有效,这个办法是 可行的,因为同一个NTLDR总会将内核加载在同一个地址。但是这样的通用性不高,ring3下面的工作会增加。为了使DEMO具有较高通用性,我使用了 暴搜的方法,从可能的加载地址:VA0x80400000~0x81000000。为了不致引起page fault,首先必须从PDE搜索起,再确定PTE是否有效,然后测试MZ、PE标志,最后ImageSize的大小要大于0x150000(也就内核这 么大了),这是为了避免其它PE文件影响结果,像Osloader。

四.对内核做HOOK
这个时候整个内核就在我们眼前了,但是我们还不能直接动手,因为我们现在CODE所在的内存会在内核初始化的时候被清洗掉,所以我们还要 HOOK一次EntryPoint。为什么?这个道理就像我们站在了一座宝库门口,但是我们偏偏没有一把打开宝库的钥匙,而这把钥匙会出现在内核的 EntryPoint里。这把钥匙就是内核入口函数KiSystemStartup的参数──LoaderBlock。
这是一个类型名为LOADER_PARAMETER_BLOCK的指针。它的结构如下:

Author: inghu
EMail: jack.xlt@gmail.com
Site:  http://hi.baidu.com/inghu
Date: 2008-11-1

我们通过LdrEntry就可以找到BootDriver的EntryPoint,对它做inline hook就可以了。这里要注意三点:1.只有Flags为某个值时,它才会被初始化(或者说这个BootDriver的DriverEntry函数才会被 调用); 2.由于加载的驱动会被搬移到内存高地址,所以要做inline hook; 3.这个时候驱动还没有relocate,所以某些间接寻址的代码会被修改,所以要找一个代码不会被修改的值。我使用了7个字节来call我的代码 (mov eax, xxxxxx; call eax;),所以要保证这7个字节不会修改。

我在win2k的某个驱动中找到了这样的代码段:
55                    PUSH EBP
8BEC                  MOV EBP,ESP
83EC 10               SUB ESP,10

XP中:
8BFF                  MOV EDI,EDI
55                    PUSH EBP
8BEC                  MOV EBP,ESP

只要inline hook这样的驱动就可以保证不会在relocate后,执行乱七八糟的代码了。

如此,一扇通向我们狗窝的金灿灿的大门就做好了,你就等着大摇大摆到宝库里往自己窝里搬东西好了。。。

七.源代码

说了这么多废话,也不知道您听明白没有,没有?!直接看src,这才是硬道理!

以下这段代码是直接从我的DEMO上取下来的,因为所有代码都是一句句像debug一样敲进去的,所以就没有那么好看,不要怪我啊!这段代码成功引导了 win2k sp4, winxp sp2, win2003 sp1, wrk等内核,不支持PAE内核和VISTA,还有一些与内存有关的boot.ini的参数也不支持。至于DEMO,由于是直接改的M$的NTLDR,牵 涉到xx问题,就不公开发表了。

八.尾声:

关于BOOTKIT有很多种实现,虽然此篇也是BOOTKIT,但使用的技术却很常规,本文也意在讲述后半程技术(如何映射内存和 HOOK内核),以求更为巧妙的技术出现。比如本人就想尝试HOOK NTDETECT.COM和将某类型的网卡做成PCI BOOT CARD,限于精力也只是形成了想法,欢迎有兴趣的朋友一起交流。最后,还是祝各位enjoy yourself吧,玩得开心!

//*********************本人功力尚浅,其中错误难免,还望读者不吝赐教****************************
//********本文纯属技术交流,本人不对任何因使用本文所述之技术和代码引起的任何问题负任何责任*****
//**************************本文可以随意转载,但请保留版权信息*********************************
//********文中提到的所有数据结构均搜集于Internet,本文所述之原理均*****************************
//********来自于本人对NTLDR和NT内核分析的笔记还有Internet,再次感谢网络!!!!****************

//=================技术是把双刃剑,既可杀敌也可防敌,至于是杀是防全看用剑之人==================

※ ※ ※ 本文纯属【点饭的百度空间】个人意见,与【 微点交流论坛 】立场无关※ ※ ※

你的微笑 is 微点的骄傲!
http://hi.baidu.com/new/micropoint
2008-12-24 16:35
查看资料  发送邮件  访问主页  发短消息   编辑帖子
mj0011_2
禁止发言





积分 86
发帖 109
注册 2008-12-14
#13  

你可以问问微点的工程师能不能防~哈哈

你贴的那个只不过是基础级的bootkit, 没法和完备的TOPHET相比~

※ ※ ※ 本文纯属【mj0011_2】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 16:48
查看资料  发送邮件  发短消息   编辑帖子
koo
注册用户





积分 332
发帖 327
注册 2007-11-17
#14  



  Quote:
Originally posted by mj0011_2 at 2008-12-24 15:05:
TEST程序不是不愿意放,而是没必要放出来增加微点的垃圾HOOK点~

随便一提,XCON2008上我发布的tophet.a就可以绕过一切所谓的“主动防御”,当然,它不但也可以绕过所有防御软件,也可以在任何检查软件下隐身, ...

我说你笨你真笨,我说你蠢你就对号入座,你知道吗,现在欧阳锋刻苦钻研出了一种新功夫,叫 蛤蟆窜地功,欧阳锋说了,我只用蛤蟆功你们就不行,我这蛤蟆窜地功不会给一般人看的,因为你们都不行,不配看..............

你感觉你说这个有用吗?按照你的说法那些大叔大妈是不懂的,你这么一说这个他们不懂,当然我也不懂,但是我这个人只知道现实,你拿出来我看看行不?

套用本山叔叔一句话,你别整那没有的行不,拿出点东西来说话行不。

你那叫纸上谈兵吧?

微点防不了,那360能嘛?

※ ※ ※ 本文纯属【koo】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 17:55
查看资料  发短消息   编辑帖子
mj0011_2
禁止发言





积分 86
发帖 109
注册 2008-12-14
#15  

脑残就是脑残,思维跟别人都不一样~呵呵

欢迎某人再出来客观评论一下~

※ ※ ※ 本文纯属【mj0011_2】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 18:04
查看资料  发送邮件  发短消息   编辑帖子
koo
注册用户





积分 332
发帖 327
注册 2007-11-17
#16  



  Quote:
Originally posted by mj0011_2 at 2008-12-24 18:04:
脑残就是脑残,思维跟别人都不一样~呵呵

欢迎某人再出来客观评论一下~

又来了,你丫不说脑残能挂啊,你把你说那什么玩意看似很深奥的玩意给我发过来看下行不,我求你了,我运行下看看啥效果行不,放心,我机器挂了跟你没关系,就算爆炸造成人身伤害我也不要求你啥,我就求你给我发过来,谢谢你了,亲爱的MJ

※ ※ ※ 本文纯属【koo】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 18:11
查看资料  发短消息   编辑帖子
mj0011_2
禁止发言





积分 86
发帖 109
注册 2008-12-14
#17  

懒得和脑残继续纠缠~想要BIN?花钱上XCON看去~
哦,忘了 貌似不卖票给楼上这种脑残的~

※ ※ ※ 本文纯属【mj0011_2】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 18:14
查看资料  发送邮件  发短消息   编辑帖子
koo
注册用户





积分 332
发帖 327
注册 2007-11-17
#18  



  Quote:
Originally posted by mj0011_2 at 2008-12-24 18:14:
懒得和脑残继续纠缠~想要BIN?花钱上XCON看去~
哦,忘了 貌似不卖票给楼上这种脑残的~

所以我说你整这纸上谈兵的玩意没用啊,你又不肯放出来,我们又不知道,你说你说这玩意是找骂啊还是想让人羡慕你啊?
微点搓,在你看来微软也很搓,那么多漏洞,一个月一堆,或许在你看来任何软件都很搓,但是你就是不能给我们大家一个不搓的软件来,哎。你说你。

我都不知道该怎么给你说了,对你我很无语。

※ ※ ※ 本文纯属【koo】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 18:24
查看资料  发短消息   编辑帖子
mj0011_2
禁止发言





积分 86
发帖 109
注册 2008-12-14
#19  

给脑残解释是最费劲了~

微点的工程师也知道,根本轮不上用tophet.a,微点中可bypass的地方简直太多了~

象楼主这种不懂装懂的脑残反而跟他说不通 哈哈

随便说几个:
例如不拦截加载驱动,只要进了RING0,任何主动防御都是没用的~

再例如不能对抗wow handle注入,不能对抗hotpatch 注入,等等,这些都是比较猥琐的~
简单的方法也应该是一堆,不过没时间研究,就不随便乱说了~
微点就象一张破网,漏洞太多了~为什么没有人关注呢,因为用户量太小了~
等微点什么时候发展到360或者瑞星的用户基数,就会发现在木马的攻击下他的那一点点小hook是多么的脆弱和不堪一击~

又说了一堆话,最后一回了,以后不能再教育楼主这种脑残,简直就是对牛弹琴啊~

※ ※ ※ 本文纯属【mj0011_2】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 18:27
查看资料  发送邮件  发短消息   编辑帖子
mj0011_2
禁止发言





积分 86
发帖 109
注册 2008-12-14
#20  



  Quote:
Originally posted by koo at 2008-12-24 18:24:



所以我说你整这纸上谈兵的玩意没用啊,你又不肯放出来,我们又不知道,你说你说这玩意是找骂啊还是想让人羡慕你啊?
微点搓,在你看来微软也很搓,那么多漏洞,一个月一堆,或许在你看来任何软件都很搓,但 ...

好东西是要给懂的人~你什么时候听说把一个0DAY给个脑残的啊~我看你才是找骂的~

※ ※ ※ 本文纯属【mj0011_2】个人意见,与【 微点交流论坛 】立场无关※ ※ ※
2008-12-24 18:27
查看资料  发送邮件  发短消息   编辑帖子
 61  2/7  <  1  2  3  4  5  6  7  > 



论坛跳转:

可打印版本 | 推荐 | 订阅 | 收藏


[ 联系我们 - 东方微点 ]


北京东方微点信息技术有限责任公司 福建东方微点信息安全有限责任公司

闽ICP备05030815号