otta13
技术员
帖子
146
精华
0
无忧币 1283
积分 207
阅读权限 30
|
发表于:2008-6-24 15:48
标题:win32 api hook的进一步分析
<上一帖 |
下一帖>
首先明确以下几个概念,都属于应用层(win32层、ring3层、用户层)的概念:一定要注意概念的准确性和严谨性,
一、win32 api函数:存在于dll或exe文件中,常用的有2000多种,通过调用api函数,能实现多种功能;
二、函数入口点:即api函数入口点地址,是pe(exe和dll都属pe,即Portable Executable File Format,可移植的执行体)的一个“属性值”,也叫RVA(相对虚拟地址)。比如sreng会调用api函数,这些函数的入口点地址已经存在于sreng这个pe中,pe的一部分。
入口点实际地址根据DLL(api函数所在的dll)的加载位置不同而变化。进程和该进程调用的dll在同一个内存地址空间。不同进程的内存地址空间之间是相互独立;
三、hook:钩子,钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。msdn上介绍的window提供有13类钩子。钩子也是封装于dll文件中;
四、api hook:不属于上述说的13类钩子,它能改变一个进程调用api函数得到的结果。基本的方法就是通过上述提到的hook,“接触”到需要修改的api函数入口点,改变它的地址指向新的自定义的函数。所以说,api hook并不是什么特别不同的hook,它也需要通过上述13个基本的hook提高自己的权限,跨越不同进程间访问的限制,达到修改其他线程的api函数地址的目的。对自身进程空间下使用到的api函数地址的修改,是不需要用到api hook技术就可以实现的。api hook的载体也是dll文件;
即api hook是针对线程、针对pe而言,更改其api函数入口点,等等。。。
分为:
1、全局api hook:对整个系统里面所有线程都进行 api HOOK,注意,病毒多半是进行全局api hook;
2、线程相关api hook:只对指定的线程进行api HOOK;
好了,切入正题,举例详解sreng2.5对api hook的检测:
一、sreng的官网上介绍说sreng2.5能检测到全局api hook,及针对sreng的线程相关api hook。
(有必要再强调下,sreng检测到的都是应用层的api hook ,从sreng启动不加载驱动可看出)
针对sreng的线程相关api hook,可以通过启动一个sreng来验证,没有api hook时,点“api hook检查”,会提示“sreng没有在当前的sreng进程里面发现有api hook的存在”,证明了sreng具备针对sreng的线程相关api hook检查。
如果存在全局api hook呢?那么启动2个sreng,如果都提示有api hook的存在,那么就证明了有全局api hook(这个也是sreng官网的解释)。比如卡巴的klif.sys是全局api hook,同时也是内核级hook(本篇暂不讲解内核级hook,等下篇吧,^_^)。
sreng2.5的帮助中这么说:“。。。扩大了API HOOK检测范围” ,我仔细分析了下,应该是扩大了对api函数种类的识别。毕竟api函数有成千上万个。
那么,我有个疑问,既然sreng2.5能检测到全局api hook,那么必然能够检测到针对sreng的api hook。大家说对吧?
二、具体分析:
比如sreng探测到:
API HOOK
原 因 api名字 危险等级 被下面模块所HOOK
RVA错误(入口点错误) RegEnumValueA 高, C:\WINDOWS\system32\123.dll
RVA错误(入口点错误) RegEnumValueW 高, C:\WINDOWS\system32\123.dll
注:引用sreng官网的话“由于 HOOK 的实现方式不同,可能出现无法找到被那个模块HOOK的情况,这是一种正常现象。在SREng界面里,显示模块的跳转地址而不是模块名字。”
RegEnumValue函数:枚举注册表的项目,可以根据参数来枚举开机启动的注册表项。后面加A或W,是函数在dll里的名字,分别对应Ansi和Unicode编码的两种形式。
1、当sreng被123.dll进行apihook时,sreng正常本来要调用RegEnumValue枚举开机启动项的注册表项,因函数入口点错误,而执行了另一个函数(注:RegEnumValue函数的参数也会被截获),返回的结果自然不对。(达到隐藏开机注册表项的目的)。如果是全局api ook,那么即使不用sreng,直接进注册表项看,看到的结果仍然不对,因为你的所有线程已经被api hook 了;
2、如果只是针对sreng的api hook ,那么我不用sreng,直接进注册表查看,应该能看到真实的结果。而往往病毒都是进行全局api hook。比如“反病毒终结者变种N”:http://chinabeta.cn/hkjs/hkjs/200712/21623.html;
3、我们知道,执行api hook需要dll为载体。而“因函数入口点错误,而执行了另一个函数。。”,这另一个函数也是需要dll为载体,是同一个dll:123.dll吗?我暂时无法证实,但从卡巴的klif.sys文件看,应该是用同一个,这样效率高吧,全局api hook已经很效率很低了;
4、这个123.dll也是需要应用程序的调用才能实现api hook,是什么应用程序调用的,不同的病毒实现方式应该不一样,这个我没再分析了,(没有搞过与此相关的编程工作,水平有限,呵呵);
5、sreng2.5是怎么实现对自身api hook的检测的呢?作者一定用了更高明的方法,这个我也不知道了。^_^;
6、sreng2.5发现存在api hook,如果执行api hook的模块可疑,最好先修复入口点错误,再扫描日志。如果你对api函数熟悉,也可自行决定;
7、全局api hook,是不是会在每个进程中都插入123.dll呢??
|
 网络虽虚拟,技术无边界,来看看大家“真面目”! |
|