inline hook之行。(渝州)

          以后的几篇blog都是关于inline hook的文章,也有可能引发其它一些列的战斗任务,也有可能一去不复返。 大侠请重新来过。

         1. 战斗一: 无进程木马

           所谓无进程木马,就是利用技术手段隐藏进程的木马,如果你破解不了它的隐藏技术,你就看不到它的进程。

        1) 进程是如何隐藏的?

         2)破解这种隐藏,又需要什么样的技术?

        3) 隐藏进程的技术,同样适用于隐藏DLL模块程序、 隐藏驱动程序。

     windows系统给我们开发人员,提供了几种列出系统所有进程、模块、与驱动的方法。最常见也是最常用的方法是调用系统的API: CreateToolHelp32Snapshot、EnumProcess、EnumProcessModules等,他们是获取进程列表的第一层手段,调用这个几个函数,其实就是告诉系统,我们需要进程列表,然后系统将列表反还给我们。

    而这个几个API在接到请求后又做了什么呢?

    他们会调用ZwQuerySystemInformation、ZwQuerySystemInformation会调用KiSystemService切入R0权限,然后自SSDT表中查取得NtQuerySystemInformation 的地址,并调用其指向的实际代码,而NtQuerySystemInformaion  的作用则是自系统的数据结构中取得相应的数据,再顺原路返回去。

     在中间任何一个环节进行拦截都可以实现隐藏的目的,这种拦截有一个名字叫:“Hook”,在切入R0权限前进行Hook,称为应用层Hook,而在之后进行的Hook则是内核Hook。内核hook则需要驱动才能实现。

       什么是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 (引用)。

 

 

        

你可能感兴趣的:(inline hook之行。(渝州))