阅读:2087回复:0
[恢复]关于瑞星 碎甲“driverentry 过河拆桥”清除木马方法的问题的讨论
这是在 2006年12月19日 08:21:40 GMT 检索到的 http://bbs.driverdevelop.com/read.php?tid=120539 的 G o o g l e 缓存内容。
G o o g l e 已先预览各网页,拍下网页的快照存档。 这网页可能有更新的版本,请按此查看最新版。 本缓存网页可能引用了已经不存在的图片。单击此处,只查看缓存文本。 请使用网址 http://www.google.com/search?&q=cache:oyME5xrNNLwJ:bbs.driverdevelop.com/read.php%3Ftid%3D120539+%22%E5%85%B3%E4%BA%8E%E7%91%9E%E6%98%9F+%E7%A2%8E%E7%94%B2%E2%80%9Cdriverentry+%E8%BF%87%E6%B2%B3%E6%8B%86%E6%A1%A5%E2%80%9D%E6%B8%85%E9%99%A4%E6%9C%A8%E9%A9%AC%E6%96%B9%E6%B3%95%E7%9A%84%E9%97%AE%E9%A2%98%E7%9A%84%E8%AE%A8%E8%AE%BA%22&hl=zh-CN&gl=cn&ct=clnk&cd=1 链接此页或将其做成书签。 Google 和网页作者无关,不对网页的内容负责。 这些搜索字词都已标明如下: 关于 瑞 星 碎 甲 driverentry 过河拆桥 清除 木马 方法 的 问题 的 讨论 -------------------------------------------------------------------------------- 控制面板 | 短消息 | 搜索 | 会员 | 帮助 | 社区 | 首页 | 无图版 密码忘了...怎么办?邮件收不到.... 欢迎使用驱网身份认证服务。 发送 ARCK#UserName#Password 到 93891152 进行身份认证。 认证后可以用手机直接取回密码。 驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver -> 关于瑞星 碎甲“driverentry 过河拆桥”清除木马方法的问题的讨论 转到动态网页 << 1 2 3 >> Pages: ( 1/3 total ) --> 本页主题: 关于瑞星 碎甲“driverentry 过河拆桥”清除木马方法的问题的讨论 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题 guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 关于瑞星 碎甲“driverentry 过河拆桥”清除木马方法的问题的讨论 NTSTATUS NTAPI NewMMLoadSystemImage( PUNICODE_STRING p_w_picpathName, ULONG ulReserved1, ULONG ulReserved2, ULONG ulReserved3, PMODULEENTRYNODE *ModuleEntryStru, PVOID *ModuleBase) { if(p_w_picpathName && MyMmIsBlockValid(p_w_picpathName,sizeof(UNICODE_STRING))) KdPrint(("MMLoadSystemImage p_w_picpathName:%wZ\n",p_w_picpathName)); if(ModuleBase && MyMmIsBlockValid(ModuleBase,sizeof(PVOID)) ) KdPrint(("MMLoadSystemImage ModuleBase:0x%x\n",*ModuleBase)); if(ModuleEntryStru && MyMmIsBlockValid(ModuleEntryStru,sizeof(DWORD))){ PMODULEENTRYNODE pModuleEntryStru = *ModuleEntryStru; __asm int 3; if(pModuleEntryStru && MyMmIsBlockValid(pModuleEntryStru,sizeof(MODULEENTRYNODE))){ KdPrint(("MMLoadSystemImage ModuleFullPath:%wZ\n",&pModuleEntryStru->ModuleFullPath)); KdPrint(("MMLoadSystemImage ModuleName:%wZ\n",&pModuleEntryStru->ModuleName)); KdPrint(("MMLoadSystemImage EntryPoint:0x%x\n",&pModuleEntryStru->EntryPoint)); KdPrint(("MMLoadSystemImage ModuleBaseAddr:0x%x\n",&pModuleEntryStru->ModuleBaseAddr)); } } /* typedef struct tagModuleEntryNode{ struct tagModuleEntryNode *prev; struct tagModuleEntryNode *next; ULONG UnKnown1[4]; PVOID ModuleBaseAddr; PVOID EntryPoint; ULONG UnKnown2; UNICODE_STRING ModuleFullPath; UNICODE_STRING ModuleName; //the rest unknown }MODULEENTRYNODE,*PMODULEENTRYNODE; */ Hooks_GetStubAddForJmp(MMLoadSystemImage); __asm mov esp,ebp __asm pop ebp __asm jmp eax ASSERT(0); return 0; } 我的确不知道MMLoadSystemImage函数的原型,只是从网上一篇来自陆麟 的一篇文章《WIN2000内部加载模块》 http://kajaa.bbs.us/docs/Computer/Programming/lu0%E7%9A%84%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/sys/20020211.html 获得了函数的原型。 hook的思路严格按照, RtlInitUnicodeString(&us,L"ZwSetSystemInformation"); ZwSetSystemInformation = (PROC)MmGetSystemRoutineAddress(&us); .... 从ZwSetSystemInformation 查询NtSetSystemInformation的服务索引号 然后根据索引和KeServiceDescriptorTable,查询NtSetSystemInformation调用的起始地址。 然后从NtSetSystemInformation函数实现中搜索 MMLoadSystemImage的入口。 在NtSetSystemInformation实现中有一个六个参数的函数调用(push 调用6次),和MMLoadSystemImage相符。然后我就从call指令的操作数中,加上偏移量作为MMLoadSystemImage的起始地址,进行inline hook. 现在的问题是,当使用drivermornitor加载驱动时,或者使用net start driverservicename时,hook的新函数的确可以被调用。第一个参数p_w_picpathName的输出正确无误,而其他参数的输出结果则驴头不对马嘴。 MMLoadSystemImage p_w_picpathName:\??\G:\aaaaa\NoDeleteDelay\objchk_w2K_x86\i386\NoDeletedelay.sys MMLoadSystemImage ModuleBase:0x805039e3 MMLoadSystemImage ModuleFullPath: MMLoadSystemImage ModuleName: MMLoadSystemImage EntryPoint:0x805039d4 MMLoadSystemImage ModuleBaseAddr:0x805039d0 即使把函数修改为NTSTATUS NTAPI NewMMLoadSystemImage( PUNICODE_STRING p_w_picpathName, ULONG ulReserved1, ULONG ulReserved2, ULONG ulReserved3, PMODULEENTRYNODE ModuleEntryStru, PVOID ModuleBase) 去掉最后两个参数中的*指针符号,输出结果也不对。对ModuleEntryStru结构中的entrypoint成员进行反汇编,和测试用例中的汇编代码也对不上。 因为我的测试用例很简单,可以方便对汇编指令进行逐一比较。 #include <ntddk.h> #include <stdio.h> void OnLoad(IN PDRIVER_OBJECT DriverObject) { return; } NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath) { __asm int 3; DbgPrint(("Hello DriverEntry\n")); pDriverObject->DriverUnload = OnLoad; return STATUS_SUCCESS; } 问题出在哪里?是不是MMLoadSystemImage 函数原型有错误啊?如果是这样,谁有MMLoadSystemImage 函数的官方声明? [ 此贴被guaiguaiguan在2006-11-28 14:56重新编辑 ] 高速无限下载文件,请申请vip会员 [楼 主] Posted:2006-11-27 10:25| wowocock 级别: 驱动老牛 精华: 1 发帖: 4137 威望: 548 点 积分: 5407 分 贡献值: 1 点 注册时间:2002-04-08 把你的程序发给我看看, wowocock@hotmail.com 驱网网上商城-开发板,开发资料光盘 花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠 [1 楼] Posted:2006-11-27 10:31| doskey 级别: 论坛版主 精华: 3 发帖: 265 威望: 262 点 积分: 2623 分 贡献值: 0 点 注册时间:2004-12-08 CODE: NTSTATUS MmLoadSystemImage ( IN PUNICODE_STRING ImageFileName, IN PUNICODE_STRING NamePrefix OPTIONAL, IN PUNICODE_STRING LoadedBaseName OPTIONAL, IN BOOLEAN LoadInSessionSpace, OUT PVOID *ImageHandle, OUT PVOID *ImageBaseAddress ) [Copy to clipboard] from Win2k source 驱网网上商城-开发板,开发资料光盘 [2 楼] Posted:2006-11-27 11:14| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 谢谢doskey,我试一下? 驱网网上商城-开发板,开发资料光盘 [3 楼] Posted:2006-11-27 11:16| wowocock 级别: 驱动老牛 精华: 1 发帖: 4137 威望: 548 点 积分: 5407 分 贡献值: 1 点 注册时间:2002-04-08 晕,那么简单的东西还保密??? 高速无限下载文件,请申请vip会员 花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠 [4 楼] Posted:2006-11-27 12:12| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 9494,我也觉得这些东西对你来说是easy中easy。只是这些代码和其他无关代码混在一块,拆解起来比较麻烦。没有保密的意思,再说实现的过程已经说的很明白了,前面很多人讨论很多了。 驱网网上商城-开发板,开发资料光盘 [5 楼] Posted:2006-11-27 12:39| killvxk 级别: 论坛版主 精华: 0 发帖: 578 威望: 552 点 积分: 5491 分 贡献值: 0 点 注册时间:2005-10-03 MMLoadSystemImage寻址 停麻烦,但不是很麻烦~ 驱网网上商城-开发板,开发资料光盘 [6 楼] Posted:2006-11-27 13:30| killvxk 级别: 论坛版主 精华: 0 发帖: 578 威望: 552 点 积分: 5491 分 贡献值: 0 点 注册时间:2005-10-03 比较好的方法就是在r0用NtSEt加载一个驱动,该驱动可以定位到离MmLoad很近的一个地址,向上搜索 0x50e8就可以找到MmLoad了,不过这个不是很通用可能~~ xp+sp2上好用 高速无限下载文件,请申请vip会员 [7 楼] Posted:2006-11-27 13:37| killvxk 级别: 论坛版主 精华: 0 发帖: 578 威望: 552 点 积分: 5491 分 贡献值: 0 点 注册时间:2005-10-03 lkd> u nt!NtSetSystemInformation+0x372: 806059f8 57 push edi 806059f9 8d45d8 lea eax,[ebp-28h] 806059fc 50 push eax//特征0x50e8 806059fd e898d8f9ff call nt!MmLoadSystemImage (805a329a)//可以获得了~~ 80605a02 8945e4 mov dword ptr [ebp-1Ch],eax 80605a05 3bc7 cmp eax,edi 80605a07 0f8cb0040000 jl nt!NtSetSystemInformation+0x837 (80605ebd) 80605a0d ff75ac push dword ptr [ebp-54h] lkd> u nt!NtSetSystemInformation+0x38a: 80605a10 e8b352f2ff call nt!RtlImageNtHeader (8052acc8) 80605a15 898568ffffff mov dword ptr [ebp-98h],eax 80605a1b 3bc7 cmp eax,edi 80605a1d 7512 jne nt!NtSetSystemInformation+0x3ab (80605a31) 80605a1f ff75b4 push dword ptr [ebp-4Ch] 80605a22 e8d7d2f9ff call nt!MmUnloadSystemImage (805a2cfe) 80605a27 b87b0000c0 mov eax,0C000007Bh 80605a2c e98c040000 jmp nt!NtSetSystemInformation+0x837 (80605ebd) lkd> u nt!NtSetSystemInformation+0x3ab: 80605a31 8b5028 mov edx,dword ptr [eax+28h] 80605a34 899578ffffff mov dword ptr [ebp-88h],edx 80605a3a 8b5dac mov ebx,dword ptr [ebp-54h] 80605a3d 03d3 add edx,ebx 80605a3f 899578ffffff mov dword ptr [ebp-88h],edx 80605a45 89953cffffff mov dword ptr [ebp-0C4h],edx 80605a4b 6a2a push 2Ah 80605a4d 59 pop ecx lkd> u nt!NtSetSystemInformation+0x3c8: 80605a4e 33c0 xor eax,eax 80605a50 8dbd7cfeffff lea edi,[ebp-184h] 80605a56 f3ab rep stos dword ptr es:[edi] 80605a58 899d88feffff mov dword ptr [ebp-178h],ebx 80605a5e 50 push eax 80605a5f 8d857cfeffff lea eax,[ebp-184h] 80605a65 50 push eax 80605a66 ffd2 call edx //可以stack walk到的地址 高速无限下载文件,请申请vip会员 [8 楼] Posted:2006-11-27 13:40| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 RtlInitUnicodeString(&us,L"ZwSetSystemInformation"); ZwSetSystemInformation = (PROC)MmGetSystemRoutineAddress(&us); if(*(PUCHAR)ZwSetSystemInformation == 0xB8){ PUCHAR cPtr, pOpcode; ULONG Length; PROC NtSetSystemInformation = (PROC)(KeServiceDescriptorTable->ServiceTableBase[ *(PULONG)((PUCHAR)(ZwSetSystemInformation)+1)]); g_aFunctions[MMLoadSystemImage].pfnTarget = NULL; for (cPtr = (PUCHAR)NtSetSystemInformation; cPtr < (PUCHAR)NtSetSystemInformation + PAGE_SIZE; cPtr += Length) { Length = SizeOfCode(cPtr, &pOpcode); if (!Length) break; if (*(PUSHORT)cPtr == 0xE850 && *(PUCHAR)((PUCHAR)cPtr + 6) == 0x89 && *(PUSHORT)((PUCHAR)cPtr+9) == 0xc73b ) { g_aFunctions[MMLoadSystemImage].pfnTarget =(PROC)( cPtr+6+(ULONG)(*(PULONG)(cPtr + 2))); DisableInt(); DisableProtection(); Hooks_InstallIntoFunction(MMLoadSystemImage); EnableProtection(); EnableInt(); break; } } } 驱网网上商城-开发板,开发资料光盘 [9 楼] Posted:2006-11-27 13:49| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 QUOTE: 引用第9楼killvxk于2006-11-27 13:40发表的“”: lkd> u nt!NtSetSystemInformation+0x372: 806059f8 57 push edi 806059f9 8d45d8 lea eax,[ebp-28h] 806059fc 50 push eax//特征0x50e8 ....... 这是什么调试器啊?很不错,我还没有用过。 驱网网上商城-开发板,开发资料光盘 [10 楼] Posted:2006-11-27 13:52| doskey 级别: 论坛版主 精华: 3 发帖: 265 威望: 262 点 积分: 2623 分 贡献值: 0 点 注册时间:2004-12-08 这就是传说中的windbg 高速无限下载文件,请申请vip会员 [11 楼] Posted:2006-11-27 13:54| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 参考了cyliu转贴的 Loading drivers and Native applications from kernel mode, without touching registry一文(http://bbs.driverdevelop.com/htm_data/16/0611/120192.html), 发现 NTSTATUS MmLoadSystemImage ( IN PUNICODE_STRING ImageFileName, IN PUNICODE_STRING NamePrefix OPTIONAL, IN PUNICODE_STRING LoadedBaseName OPTIONAL, IN BOOLEAN LoadInSessionSpace, OUT PVOID *ImageHandle, OUT PVOID *ImageBaseAddress ) 调用的基地址还是有些问题。最后两个参数无论是当前指针还是指向的内容(40个字节范围内),没有发现映象的基地址(以4d 5a (MZ)开始的地址)。而且顶层样例驱动启动后,断点时使用mod命令查看得到的模块基地址和后面两个参数或者其指向的内容都不一样。 高速无限下载文件,请申请vip会员 [12 楼] Posted:2006-11-27 13:58| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 我的windbg怎么提示符是kd而不是lkd啊? 高速无限下载文件,请申请vip会员 [13 楼] Posted:2006-11-27 14:02| doskey 级别: 论坛版主 精华: 3 发帖: 265 威望: 262 点 积分: 2623 分 贡献值: 0 点 注册时间:2004-12-08 提示符可以改的 高速无限下载文件,请申请vip会员 [14 楼] Posted:2006-11-27 14:07| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 也许hook MmLoadSystemImage直接返回一个STATUS_ACCESS_DENIED,就可以拒绝某个驱动加载。但是还是系统能够像PsSetLoadImageNotifyRoutine那样,能够得到基地址,然后获得entrypoint,继而patch 几个字节,让其体面退出,而不是返回STATUS_ACCESS_DENIED粗暴地拒绝。 高速无限下载文件,请申请vip会员 [15 楼] Posted:2006-11-27 14:13| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 真是晕了头,没有看清doskey提供 NTSTATUS MmLoadSystemImage ( IN PUNICODE_STRING ImageFileName, IN PUNICODE_STRING NamePrefix OPTIONAL, IN PUNICODE_STRING LoadedBaseName OPTIONAL, IN BOOLEAN LoadInSessionSpace, OUT PVOID *ImageHandle, OUT PVOID *ImageBaseAddress ) 最后两个参数是出口参数。居然还在傻虎虎地在没有调用原来函数的时候对这两个参数dump。 驱网网上商城-开发板,开发资料光盘 [16 楼] Posted:2006-11-27 14:50| wowocock 级别: 驱动老牛 精华: 1 发帖: 4137 威望: 548 点 积分: 5407 分 贡献值: 1 点 注册时间:2002-04-08 我的意思是要有个完美的获得地址的方法,从2K,到VISTA下都好的办法,看来是比较困难的. hook MmLoadSystemImage的话,你应该在函数完成以后再去取里面的内容分析,如果是不允许的,你还得动态去获得 MmUnloadSystemImage去卸载,又是件费力的事情. 高速无限下载文件,请申请vip会员 花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠 [17 楼] Posted:2006-11-27 15:05| guaiguaiguan 级别: 驱动中牛 精华: 5 发帖: 362 威望: 371 点 积分: 3710 分 贡献值: 0 点 注册时间:2003-10-11 QUOTE: 引用第17楼wowocock于2006-11-27 15:05发表的“”: 我的意思是要有个完美的获得地址的方法,从2K,到VISTA下都好的办法,看来是比较困难的. hook MmLoadSystemImage的话,你应该在函数完成以后再去取里面的内容分析,如果是不允许的,你还得动态去获得 MmUnloadSystemImage去卸载,又是件费力的事情. 终于可以正常工作了,看来瑞星提供的这种偷梁换柱的代码替换法还是很好使的。有空再去测试一下那个driverentry的过河拆桥法。 现在获得MmUnloadSystemImage函数入口地址方法只能用代码搜索了,因为这个函数是没有输出且未见文档的函数,这里采用的搜索函数入口地址的方法和从PsLookupProcessByProcessId函数入口搜索PspCidTable的方法同出一辙,如上面代码所示,至于跨平台的兼容性,只能看运气了,新的平台对这些函数完全可能重写,这样这种搜索的方法就会失效。 加载的影像地址,只有调用了hook前的函数,才能对这些地址初始化,最后两个参数方才可用。 原来忽视了这一点。对于你说的“如果是不允许的,你还得动态去获得 MmUnloadSystemImage去卸载,又是件费力的事情”我还不太了解这句话的意思。 不过,很感谢上面三位提供的热心帮助,我收获很大。 高速无限下载文件,请申请vip会员 [18 楼] Posted:2006-11-27 15:25| wowocock 级别: 驱动老牛 精华: 1 发帖: 4137 威望: 548 点 积分: 5407 分 贡献值: 1 点 注册时间:2002-04-08 瑞星的方法对于SETINFORMATION进去的好象无效,必须在MmLoadSystemImage上再HOOK,而且只有这个函数成功返回后你才能获得正确的信息,而返回后再把原来的影象卸载,又是件麻烦的事情. 驱网网上商城-开发板,开发资料光盘 花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠 [19 楼] Posted:2006-11-27 15:46| << 1 2 3 >> Pages: ( 1/3 total ) 快速跳至 >> 初学者入门 |- c/c++入门(含vc使用) |- InnoSetup 中文讨论区 |- 黑客反汇编之 asm2c |- Keil C 使用 |- 电子技术基础 |- ABC初学者 |- 驱动及应用程序安装程序制作 >> 安全技术 |- 反流氓、反木马和rootkit |- 特洛伊之木马故乡 |- 网络安全技术 |- 病毒技术分析 >> 阅读与交流 |- windows 源码解读 |- 书评 >> 各取所需 |- 求职专区 |- 合作开发 |- 供需信息 >> 驱动开发 |- 每周话题 |- vista & x64 驱动程序 |- WDF 学习与研究 |- Kernel Mode discussion and Soft Driver |- USB驱动开发 |- 非USB硬件驱动开发 |- 图形设备驱动版(打印、扫描、显示...驱动) |- Mac 驱动开发 |- NDIS网络接口开发 |- LINUX&UNIX核心开发 |- 开发工具使用 |- (IEEE1394)FireWire |- 文件系统(过滤)驱动程序开发 |- 软件工程在驱动开发中的应用 |- 总结、原创区 >> 硬件开发 |- DSP & PLD &FPGA |- 硬件设计 |- FirmWare |- 集成电路设计(IC) >> SNMP网管 |- SNMP网管软件开发 >> 嵌入式系统及掌上设备 |- 嵌入式系统开发 |- Wince 程序开发 |- VxWorks >> 程序人生 |- 疯狂灌水 |- 新闻,要闻,花边 |- IT新闻 |- 情感小屋 |- I love English |- 程序人生 |- 志宁自语 |- MP3 & FLASH 共享 |- 艺术&帖图区 |- 漂流一族 >> 其它事务 |- 用户留言 |- 软件使用与交流 >> 公司黑白名单 |- 白名单 |- 黑名单 >> 合作网站技术支持论坛 |- 驱动开发网在线商城 |- syser debugger |- S1系列PCI开发板、FPGA开发板支持 |- PLX PCI 开发板支持 |- DriverStudio 技术支持 驱动程序开发网技术社区 -> Kernel Mode discussion and Soft Driver 快速发帖 顶端 内容: HTML 代码不可用 使用签名 Wind Code自动转换 [查看帖子长度] 标题: 表情: 按 Ctrl+Enter 直接提交 Powered by PHPWind v4.3.2 Code ? 2003-05 PHPWind This is html template view this page faster You can contact us |
|
|