之后的几篇blog都是关于inline hook的文章,也有可能引起其它一些列的战斗任务,也有可能一去不复返。 大侠请从新来过。html
1. 战斗一: 无进程木马windows
所谓无进程木马,就是利用技术手段隐藏进程的木马,若是你破解不了它的隐藏技术,你就看不到它的进程。数据结构
1) 进程是如何隐藏的?函数
2)破解这种隐藏,又须要什么样的技术?操作系统
3) 隐藏进程的技术,一样适用于隐藏DLL模块程序、 隐藏驱动程序。orm
windows系统给咱们开发人员,提供了几种列出系统全部进程、模块、与驱动的方法。最多见也是最经常使用的方法是调用系统的API: CreateToolHelp32Snapshot、EnumProcess、EnumProcessModules等,他们是获取进程列表的第一层手段,调用这个几个函数,其实就是告诉系统,咱们须要进程列表,而后系统将列表反还给咱们。htm
而这个几个API在接到请求后又作了什么呢?blog
他们会调用ZwQuerySystemInformation、ZwQuerySystemInformation会调用KiSystemService切入R0权限,而后自SSDT表中查取得NtQuerySystemInformation 的地址,并调用其指向的实际代码,而NtQuerySystemInformaion 的做用则是自系统的数据结构中取得相应的数据,再顺原路返回去。进程
在中间任何一个环节进行拦截均可以实现隐藏的目的,这种拦截有一个名字叫:“Hook”,在切入R0权限前进行Hook,称为应用层Hook,而在以后进行的Hook则是内核Hook。内核hook则须要驱动才能实现。ip
什么是hook? 什么是SSDT ?
windows 操做系统就像一个为咱们管理电脑的服务公司,而他的工做机制是逐级上报,各负其责,他派一个服务人员时刻跟着咱们,看咱们有什么要求。当咱们想查看中都有什么进程的时候,咱们会告诉服务员,咱们想了解当前都有哪些进程,那服务员就会把咱们的要求报上去,报给谁呢?他要先知道哪一个部门负责 哪一个工做才行,SSDT表就是作这个的,SSDT表就像是一个路标,指明了什么样的工做应该由哪个部门负责处理。经过查表得知负责的部门后,工做就被移 交到了那个部门,工做完成后,部门会把工做结果交回给服务员,服务员再交给咱们,而咱们也就获得咱们想要的结果了。
应用层HOOK呢,就像是服务员被木马偷偷的替换了,当咱们提出要求时呢,他会检查是否对他有害,或将对他有害的信息去掉,好比咱们想查看进程,那他在将结果交给咱们时,却把木马的进程自结果中抹去了,这样,咱们天然是看不到木马进程了。
而 最多见的内核HOOK,则是HOOK-SSDT,上面说了SSDT就是一张表,标明了什么工做应该由什么部门负责。而SSDT HOOK也就是木马将表上 的内容给改了,原本交给A部门负责的工做被改为了交给由木马负责,这样,服务员在上报咱们的请求时,一查表发现查看进程的工做是由木马负责的,他就把这请 求交给木马了,而木马呢?他但是知道表中原来的内容是什么的呀,他只是对请求进行一下过滤,发现没有对本身有害的,就直接转交给原部门了,对本身有害的, 天然也就视状况滤掉或涂改了。每个函数都实现了某一种功能,好比:结束进程是由NtTerminateProcess来完成的,若是HOOK了这个,那 么在进程结束前,就有机会更改结果了,能够拒绝被结束。当你试图在任务管理器中结束某个进程时,系统会拒绝你的操做,其实这并非系统拒绝 的,而是进程本身,因为进程本身的HOOK了SSDT,因此,结束进程的工做服务员都交给他去作了,他一旦发现结束的就是他本身,那他直接告诉服务员这个 进程不能结束,而后服务员就把这个结果给咱们了,其实咱们的这个请求并无真的到达应该送交的部门。
还有一种是“Inline-HOOK”,什么是Inline-HOOK呢?
上 面说过了,SSDT就像是一个标明了什么工做由哪一个部门来作的表,SSDT-HOOK就是更改了这个表的指向。而Inline-HOOK呢?他并无更改 表的指向,查找进程的工做在表中仍然指向了负责查找进程的部门。可是呢,木马却把那个部门中的人员替换了,这样仍然能达到它的目的。 Inline- HOOK更加的复杂、更加的邪恶、也更加的不稳定,而应用范围倒是更加的普遍,查找起来更加的困难 。要知道,对比SSDT表中的指向是否正确,是否指向了正确的部门,要简单一些,不就是一张表,拿原来的表比对一下就知道了。但inline-Hook却替换的是公司的人员,Windows就像一个大公司,有成千上百的人,天知道他替换的是哪个。。。
总:程序就像是为了实现某一目的而定的计划书;进程就是组织工人分配资源开始执行这份计划,而Windows操做系统呢?就是一个为咱们管理电脑也是管理这些执行计划的工人的服务管理公司;而Windows操做系统呢?就是一个为咱们管理电脑也是管理这些执行计划的工人的服务管理公司。
原本想直接绕开SSDT hook,看来是不行,下载Hook Shadow SSDT 的源码,进行分析一下。
战斗二: 伴随着疑问前行,SSDT 和 Shadow SSDT 有什么关系?
在看雪上找到了相似的问题: 既然hook了SSDT 再单独hook SSDT Shadow 是干什么?
sudami 回答: 2 张不一样的表,有些API函数是由win32k.sys导出的,这张表只有在SSDT shadow里面找获得。SSDT是ntoskrl,的东西,SSDT shadow 好像都是win32k.sys的东西。并且后者不常驻内存。在SSDT中的函数,在shadow ssdt中也存在,并且shadow ssdt中还有win32k.sys导出的函数,这些函数并不在SSDT中。
查找KeAddSystemServiceTable 这个函数来找到KeServiceDescriptorTableShadow的偏移,原理是这个函数含有对KeServiceDescriptorTableShadow的引用, lea ecx,nt!KeServiceDescriptorTableShadow (80554060)[eax];在 ntoskrnl中有导出,它函数的做用只是添加系统服务表,不是系统服务。因为如今仍是菜鸟,功力不行,仍是暂时不反kd> uf KeAddSystemServiceTable 这个函数。 反这个函数的大侠的blog地址在: http://blog.sina.com.cn/s/blog_65a1d2800100qf7l.html (引用)。