内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx

上传人:b****6 文档编号:8564491 上传时间:2023-05-11 格式:DOCX 页数:9 大小:202.45KB
下载 相关 举报
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第1页
第1页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第2页
第2页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第3页
第3页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第4页
第4页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第5页
第5页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第6页
第6页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第7页
第7页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第8页
第8页 / 共9页
内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx_第9页
第9页 / 共9页
亲,该文档总共9页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx

《内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx(9页珍藏版)》请在冰点文库上搜索。

内核态下基于动态感染技术的应用程序执行保护Word文档下载推荐.docx

.const

CCOUNTED_UNICODE_STRING"

\\Device\\devDHDriver"

g_usDeviceName,4

\\?

?

\\slDHDriver"

g_usSymbolicLinkName,4

.code

;

>

DriverUnload 

procpDriverObject:

PDRIVER_OBJECT

invoke 

DbgPrint,$CTA0("

Driverunload"

IoDeleteSymbolicLink,addrg_usSymbolicLinkName

mov 

eax,pDriverObject

IoDeleteDevice,(DRIVER_OBJECTptr[eax]).DeviceObject

ret

endp

DispatchCreateClose 

procpDeviceObject:

PDEVICE_OBJECT,pIrp:

PIRP

eax,pIrp

assume 

eax:

ptr_IRP

[eax].IoStatus.Status,STATUS_SUCCESS

[eax].IoStatus.Information,0

nothing

IoCompleteRequest,pIrp,IO_NO_INCREMENT

eax,STATUS_SUCCESS

.code 

INIT

DriverEntry 

PDRIVER_OBJECT,pusRegistryPath:

PUNICODE_STRING

local 

status:

NTSTATUS

pDeviceObject:

PDEVICE_OBJECT

status,STATUS_DEVICE_CONFIGURATION_ERROR

IoCreateDevice,pDriverObject,0,addrg_usDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,addrpDeviceObject

.if 

eax==STATUS_SUCCESS

IoCreateSymbolicLink,addrg_usSymbolicLinkName,addrg_usDeviceName

ptrDRIVER_OBJECT

[eax].DriverUnload,offsetDriverUnload

[eax].MajorFunction[IRP_MJ_CREATE*(sizeofPVOID)],offsetDispatchCreateClose

[eax].MajorFunction[IRP_MJ_CLOSE*(sizeofPVOID)],offsetDispatchCreateClose

Driverentry"

status,STATUS_SUCCESS

.else

IoDeleteDevice,pDeviceObject

.endif

@@:

eax,status

END 

DriverEntry

CCOUNTED_UNICODE_STRING宏在汇编语言中定义一个类似DDK中的UNICODE_STRING的结构,定义在Strings.mac中,这是KmdKit作者Four-F的伟大贡献之一,Strings.mac包含了对大部分字符串的定义,ANSI字符串$CTA0(类似于char[]);

Unicode字符串$CTW0(类似于w_char[])。

在Strings.mac出现之前,在汇编中定义Unicode字符串是件相当麻烦的事情。

DriverEntry是内核程序的入口点,当内核模块被加载时,程序从这里开始执行,类似于用户态程序的WinMain或main函数。

其中的IoCreateDevice和IoCreateSymbolicLink创建设备名和创建符号连接。

IoCreateDevice使用\Device\devDHDriver为名字来创建一个设备,你可以使用KmdKit中的SymLinks.exe这个工具来查看我们创建的符号和连接:

同时你也可以在以后的用户态应用程序中以\\.\devDHDriver为文件名,用CreateFile来打开我们创建的内核对象。

下面的代码为内核对象指定分派例程,例如:

当使用CreateFile和CloseHndle打开或关闭对象的时候,我们的内核程序使用哪个函数处理(这里用DispatchCreateClose这一个函数来处理);

当使用DeviceIoControl与内核对象交换数据时,应该用哪个函数来处理(我们的例子中没有添加对DeviceIoControl的支持);

当内核对象被卸载时,应该用哪个函数来处理(这里是DriverUnload这个函数)。

其实设备名称和连接符号不是内核态程序必须的,特别是一些不需要与用户态程序进行数据交互的内核程序,我们的程序就是这样,所以在我们的代码中完全不需要调用IoCreateDevice、IoCreateSymbolicLink,也不需要在分派例程中指定DispatchCreateClose这个函数,DispatchCreateClose也只是调用IoCompleteRequest直接向用户态程序返回操作成功。

把这些写在这里的目的,只是让大家有所了解。

后面的DbgPrint向内核调试器输出一串字符,类似于用户态的OutputDebugString函数。

这个函数的调用也不是必须的,只方便我们检查用。

DriverEntry应该返回STATUS_SUCCESS这样才能保证我们的内核程序被正常加载。

看到这里,大家也许会发现其实DriverEntry这个函数只在系统加载内核模块时才被调用一次,其它时间永远不再调用了,如果在内核模块加载后仍将这份代码保存在内存中,真是一份不必要的内存开销(虽然我们的例子中这个开销非常小),所以我们将DriverEntry函数单独定义在.codeINIT节中,表示当内核加载完成后,这部分代码可以从内存中丢弃。

再来看DriverUnload,刚才已经说了,我们将这个函数指定为内核模块的卸载例程,也就是当我们的内核模块被卸载时调用。

它所作的工作刚好和DriverEntry相反:

用IoDeleteSymbolicLink删除符号连接,用IoDeleteDevice删除设备。

正如前面说的一样,如果你的内核程序并没有创建设备和符号连接,也就不需要调用这两和函数。

好了,代码写完,我们来看内核程序的汇编和连接。

在我的印象中MicrosoftVisualStudio2005及以上版本内置了对汇编语言的汇编支持,不幸这一次我安装的是2003版(我原以为2003也内置支持)。

所以我们得手动地来调整。

在DynamicHook.asm的“属性”à

“自定义生成步骤”à

“常规”中,设置命令行为:

ml/c/coff/nologo/Fo$(IntDir)\$(InputFileName).obj/IC:

\MASM32\include\w2k/IC:

\MASM32\Macros$(InputFileName)(Debug版本可以加上/Zi参数)。

ml各参数的含义你可以输入ml/?

来查看,这里就不在敷述了。

大家看到/I参数,指定了输入目录的位置,这就是我刚才讲如果你不将MASM32安装到C盘,这里你就要重新指定。

设置输出为:

$(IntDir)\$(InputFileName).obj,如图:

当然,随着我们程序的进一步深入,DynamicHook.asm会include其它一些文件,你就需要在“附加依赖”里面指定这些文件,以保证当有文件修改时,VC会发现需要重新进行汇编。

然后进入连接器选项,在“常规”选项卡中将输出文件修改为:

$(OutDir)/DynamicHook.sys;

“启用增量连接”选“否”;

附加库目录中输入:

C:

\masm32\lib\w2k:

“输入”选项卡中附加依赖项:

ntoskrnl.libhal.lib;

忽略所有默认库选“是”:

“调试”选项卡中,生成调试信息选“是”(这个随便你,我见过很多人发行出来的exe仍包含有调试符号,逆向起来相当Happy)。

“System”选项卡中子系统我们选“未设置”(VS2003相当不给力,只有CONSOLE、WINDOWS和未设置三个选项,VS2005中好像就有NATIVE,这个我们现在只有不设置,等会在命令行中手动设置):

“高级”选项卡中,设置入口点为:

DriverEntry(刚才我已经说了,这次我怕连接器不认识);

设置校验和选“是”(内核程序的校验和都应该设置,虽然在用户态下,当启动进程时系统并不检查PE文件实际的校验和和PE文件结构中填写的校验和是否一致,但在对内核模块,系统却要严格检查,设置的校验和若与实际的校验和不一致,内核模块是不能被加载的);

基址上填“0x10000”(我习惯用这个基址了,当然,若不设置,也没关系):

最后在命令行中输入:

/align:

16/ignore:

4078/section:

CODE,REW/subsystem:

native/driver:

/align:

16指定PE文件及内存映像按16字节对齐(通过我的经验来看,其实这个选项如何设置并不重要,但内核中内存是很宝贵的,还是弄小一点吧)。

/ignore:

4078若不设置,每次连接时会出现下面的warning:

LINK:

warningLNK4078:

找到多个“INIT”节,它们具有不同的属性(E2000020)。

看着不顺眼,去掉吧。

/section:

CODE,REW这个选项它指定CODE这个节(关于“节”的意思,学习下PE文件即知,你不学也没关系,我以后要讲)具有可读、可写、可执行的属性,虽然目前我们还没有CODE这个节,但以后会有用的。

/subsystem:

native就是我们前面说的“子系统”,前面我们没有指定,在这里手动指定为native。

/driver很简单了,我们要连接出一个“驱动”程序(也许VS把所有内核态程序都统称为“驱动”吧)。

搞完这些,一按“生成”,若无意外,我们用汇编写的第一个内核程序DynamicHook.sys就生成了。

现在我们来学习如何用它。

前面我们说了,用KmdKit中Tools目录中KmdManager.exe这个工具来加载和卸载它:

像图上这样,选好文件,把中间两个复选框选上,这里要说一下,在Win32下,加载一个内核程序首先要用CreateService创建,然后用StartService启动,用StopService停止,用DeleteService删除,对已经创建的,用OpenService打开。

对于正常的内核程序,一般在安装时用CreateService,这时可以设置启动方式为SERVICE_AUTO_START、SERVICE_BOOT_START、SERVICE_DEMAND_START、SERVICE_DISABLED或SERVICE_SYSTEM_START,这些意义都顾名思义的。

由于我们的内核模块是自己用的,所以我们都使用Create、Start、Stop、Delete这样的过程,以免在注册表中留下垃圾,所以我们把中间的复选框选中,点Reg’n’Run完成Create和Start,点Stop’n’Unreg完成Stop和Delete:

根据KmdManager.exe的输出,我们的内核模块加载和卸载都是正常的。

但是!

写程序就如打仗:

用户态下你就如张飞张胖子,随你如何乱来,有勇无谋,打死敌人解决问题就是王道,大不了来个非法操作,重新按F5调试一次;

在内核态下,你一定要向诸葛亮同志学习――谨慎!

谨慎!

内核态下没有机会给你重来,出错就是蓝屏,就是重启。

而且内核态的程序调试起来相当复杂,SoftICE比较有名,但不稳定,毕竟它对目标系统的影响太大了。

WinDbg对目标系统的影响较小,但用电缆连接双机调试也很不方便,当然有改进的办法,安装VirtualPC用COM口模拟双机电缆连接,但调试器的使用你就不要再以为舒服得像Ring3下一边听着MP3一边跟MM聊天一边在OllyDbg中复制粘贴了。

有关使用VirtualPC+WinDbg调试内核代码的方法,可以在baidu上去找,与本课题无关,也就不在敷述了。

说了这么多,我只想说:

要谨慎!

刚才我们不是用DbgPrint输出了一些调试信息吗?

现在我们就把DebugView启动起来看看。

在DebugView中把CaptureWin32关掉,把CaptureKernel,在KmdManager中点“Reg’n’Run”,DebugView输出“Driverentry”,再点“Stop’n’Unreg”,DebugView输出“Driverunload”:

一切都是OK的,打完收工。

这章我们讲了如何用汇编语言来编写一个简单的内核态程序,下一章,我们要讲解什么是SSDT,SSDT的重要性以及如何在内核程序中获取SSDT。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2