已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
标 题:【原创】rootkit hook之三 inline hook作 者:combojiang时 间:2008-01-30,17:27:57链 接:/showthread.php?t=59127最近为了写好rootkitinlinehook篇,特意A了著名的流氓软件(cdnprot.sys),这个文件很庞大,有152k之多,花费了我好几个晚上的时间,让我少看好多集的电视剧闯关东,在这个软件里面用了很多好的技术,不管怎么说,技术本身是无辜的,由于我们今天谈论的主题是Inlinehook,因此今天只是带领大家看看他是怎样使用inlinehook这项技术的。今天是一年一度的小年,发表此篇,作为对大家的小年献礼吧,顺祝大家小年好。关于什么是inlinehook.,这些基本概念,我们就不在这里说了,大家可以google下。对于ring3下的inlinehook使用起来非常的方便,也非常简单。但是到了ring0,inlinehook就麻烦些,搞不好就出现了bsod.,我们今天讲的是内核中的inlinehook。这个技术,在这个流氓软件中应用的比较稳定。我们就来看看它是怎么用的。先谈谈思路:1Hook之前的准备工作之一。在这个软件中,总共hook了15个nativeapi函数。他们分别是:ZwOpenKey,ZwClose,ZwQueryValueKey,ZwDeleteKey,ZwSetValueKey,ZwCreateKey,ZwDeleteValueKey.ZwEnumerateValueKey,ZwRestoreKey,ZwReplaceKey,ZwTerminateProcess,ZwSetSecurityObject,ZwCreateThread,ZwTerminateThread,ZwQuerySystemInformation.这15个函数中,包括2个未公开的函数,ZwCreateThread,ZwTerminateThread,这两个函数,需要我们从ntdll.dll的导出表中找到。另外,所有的nativeapi函数的最终实现都是在ntoskrnl模块中,所以,我们使用ZwQuerySystemInformation的0B号功能,找出ntoskrnl模块的内存加载区间,然后逐个判断ssdt表中这些要hook的函数地址,是否在这个区间内。确保我们是第一个吃螃蟹的人。呵呵。2Hook之前准备工作之二:1)一个全局函数表,保存这15个要hook的函数的原始地址。这个表起始地址位于:.data:00036860,终止于:data:0003689C共60字节2)一个hook的函数地址表,分别对应于要hook的15个函数的跳转。这个表起始地址位于:.data:00034E98.data:00034E98off_34E98ddoffsetsub_1EEA8.data:00034E9Cddoffsetsub_1EE82.data:00034EA0ddoffsetsub_1EF82.data:00034EA4ddoffsetsub_1EF4A.data:00034EA8ddoffsetsub_1EF6D.data:00034EACddoffsetsub_1EEC1.data:00034EB0ddoffsetsub_1EED2.data:00034EB4ddoffsetsub_1EEF5.data:00034EB8ddoffsetsub_1EF31.data:00034EBCddoffsetsub_1EF18.data:00034EC0ddoffsetsub_1EF93.data:00034EC4ddoffsetsub_1EFA8.data:00034EC8ddoffsetsub_1EFBD.data:00034ECCddoffsetsub_1EFE6.data:00034ED0ddoffsetsub_1EFFF这15个函数,都是在cdnprot.sys中实现的。3)一个用于保存函数开头字节的二维数组数据区,数组形式是array1530;15个函数,每个函数有30个字节可用。这30个字节中,首先保存原hook函数开头字节,然后写入0xe9,再写入数组当前位置跟原hook函数地址偏移我们已复制出的字节码后的位置之间的相对偏移值。(具体我们要保存原hook函数开头多少字节,代码中有一个算法。)这个数组的作用是,当我们hook了函数后,执行完我们的hook函数之后,然后,需要恢复执行原api函数,由于原api函数开头5字节已经被改写,由于函数原开头字节已经保存到相应的数组里,因此这里的作法是,执行这个数组中的机器码,数组机器码执行到最后,会跳转到原hook函数某个偏移位置,继续执行。3Inlinehook1)IoAllocateMdl,分配一个mdl,将要hook的函数映射进去。2)MmProbeAndLockPages,锁定页面3)去掉写保护4)保存函数开头机器码到对应的二维数组区,改写开头5个字节,让他跳转到起始地址位于.data:00034E98的跳转表中的对应跳转函数。5)恢复写保护6)MmUnlockPages7)IoFreeMdl4Inlinehook后的恢复工作正如2步骤3)中描述的那样。代码太多,不在这里贴出了。Inlinehook对应的函数是sub_1F30D,这个函数很庞大。嵌套了n多层。我把逆向的源文件和.idb文件附上。有兴致的可以使用ida5.2看看。附上一个例子吧:这个例子是hook了KiInsertQueueApc,由于KiInsertQueueApc没有导出,需要在KeInsertQueueApc中找出来。#include#includeULONGg_KiInsertQueueApc;charg_oricode8;ULONGg_uCr0;char*non_paged_memory;voidWPOFF()ULONGuAttr;_asmpusheax;moveax,cr0;movuAttr,eax;andeax,0FFFEFFFFh;/CR016BIT=0movcr0,eax;popeax;cli;g_uCr0=uAttr;/保存原有的CRO屬性VOIDWPON()_asmstipusheax;moveax,g_uCr0;/恢復原有CR0屬性movcr0,eax;popeax;_declspec(naked)my_function_detour_KiInsertQueueApc()_asmmovedi,edipushebpmovebp,esppushecxmoveax,ecx_emit0xEA_emit0xAA_emit0xAA_emit0xAA_emit0xAA_emit0x08_emit0x00ULONGGetFunctionAddr(INPCWSTRFunctionName)UNICODE_STRINGUniCodeFunctionName;RtlInitUnicodeString(&UniCodeFunctionName,FunctionName);return(ULONG)MmGetSystemRoutineAddress(&UniCodeFunctionName);/根据特征值,从KeInsertQueueApc搜索中搜索KiInsertQueueApcULONGFindKiInsertQueueApcAddress()char*Addr_KeInsertQueueApc=0;inti=0;charFindcode=0xE8,0xcc,0x29,0x00,0x00;ULONGAddr_KiInsertQueueApc=0;Addr_KeInsertQueueApc=(char*)GetFunctionAddr(LKeInsertQueueApc);for(i=0;i100;i+)if(Addr_KeInsertQueueApci=Findcode0&Addr_KeInsertQueueApci+1=Findcode1&Addr_KeInsertQueueApci+2=Findcode2&Addr_KeInsertQueueApci+3=Findcode3&Addr_KeInsertQueueApci+4=Findcode4)Addr_KiInsertQueueApc=(ULONG)&Addr_KeInsertQueueApci+0x29cc+5;break;returnAddr_KiInsertQueueApc;VOIDDetourFunctionKiInsertQueueApc()char*actual_function=(char*)g_KiInsertQueueApc;unsignedlongdetour_address;unsignedlongreentry_address;KIRQLoldIrql;inti=0;charnewcode=0xEA,0x44,0x33,0x22,0x11,0x08,0x00,0x90;reentry_address=(unsignedlong)g_KiInsertQueueApc)+8;non_paged_memory=ExAllocatePool(NonPagedPool,256);for(i=0;i256;i+)(unsignedchar*)non_paged_memory)i=(unsignedchar*)my_function_detour_KiInsertQueueApc)i;detour_address=(unsignedlong)non_paged_memory;*(unsignedlong*)(&newcode1)=detour_address;for(i=0;i200;i+)if(0xAA=(unsignedchar*)non_paged_memory)i)&(0xAA=(unsignedchar*)non_paged_memory)i+1)&(0xAA=(unsignedchar*)non_paged_memory)i+2)&(0xAA=(unsignedchar*)non_paged_memory)i+3)*(unsignedlong*)(&non_paged_memoryi)=reentry_address;break;oldIrql=KeRaiseIrqlToDpcLevel();for(i=0;i8;i+)g_oricodei=actual_functioni;actual_functioni=newcodei;KeLowerIrql(oldIrql);VOIDUnDetourFunction()char*actual_function=(char*)g_KiInsertQueueApc;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年贵阳市云岩区辅警招聘考试题库附答案解析
- 2025年省直辖行政单位潜江市辅警招聘考试题库附答案解析
- 2025中铁八局设计院竞聘1人笔试考试参考题库及答案解析
- 2025年嘉兴市南湖区人民医院招聘事业单位工作人员3人笔试考试备考题库及答案解析
- 2025年中铁西北科学研究院有限公司工程管理咨询中心招聘笔试考试参考试题及答案解析
- 2025年广西贵港市教育局赴外招聘急需紧缺人才30人(南宁师范大学场次)笔试考试备考试题及答案解析
- 河北省唐山市十校2025-2026学年高三上学期期中考试语文试题(含答案)
- 2025贵州茅台生物科技研发有限责任公司科技人才招聘考试笔试备考题库及答案解析
- 陇南市市级机关遴选真题2024
- 2025年遂宁市射洪县保安员招聘考试题库附答案解析
- 竞聘库房管理岗位
- 石灰岩矿开采及综合利用项目施工方案
- 2025年安全信息考试试题及答案
- 2025标准网签购房合同范本下载
- 2025 年氢能工业与应用研究报告
- 云南人力资源开发有限责任公司招聘笔试题库2025
- 人教版八年级上册生物第五单元第一章综合实践项目 设计并制作生态瓶
- 2025河南城发环保能源有限公司下属项目公司校园招聘110人笔试考试参考题库及答案解析
- 2025全国医疗应急能力培训系列课程参考答案
- 理性看待分数用心守护成长+2025-2026学年高二上学期期中家长会主题班会
- 企业货款清欠流程及管理措施
评论
0/150
提交评论