查看: 3567|回复: 15
收起左侧

主防。你拿什么捍卫我的系统安全?

[复制链接]
淼楠
发表于 2008-8-12 19:45:28 | 显示全部楼层 |阅读模式
参考WIN32API函数,HOOK等条目时,可以使用RKU,看看安全软件都HOOK些什么
绝大部分,不求甚解,仅了解就很有用
Windows消息机制
很多教材都有介绍这里不赘述,仅做简单的说明
    Windows是一消息(Message)驱动式系统,Windows消息提供了应用程序与应用程序之间、应用程序与Windows系统之间进行通讯的手段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。
    Windows系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。
    计算机的所有输入设备由 Windows监控,当一个事件发生时,Windows先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。一个事件的发生,到达处理它的窗口函数必须经历上述过程。消息具有非抢先性,即不论事件的急与缓,总是按到达的先后排队(一些系统消息除外),这就使得一些外部实时事件可能得不到及时的处理。
    例子:打开记事本程序,该程序有一个File(文件)菜单,那么,在运行该应用程序的时候,如果用户单击了File菜单里New命令时,这个动作将被Windows (而不是应用程序本身!)所捕获,Windows经过分析得知这个动作应该由上面所说的那个应用程序去处理,既然是这样,Windows就发送了个叫做WM_COMMAND的消息给应用程序,该消息所包含信息告诉应用程序:"用户单击了New菜单",应用程序得知这一消息之后,采取相应的动作来响应它,这个过程称为消息处理。Windows为每一个应用程序(确切地说是每一个线程)维护了相应的消息队列,应用程序的任务就是不停的从它的消息队列中获取消息,分析消息和处理消息,直到一条接到叫做WM_QUIT消息为止,这个过程通常是由一种叫做消息循环的程序结构来实现的。
    消息循环,这里简单形象的说明是,就像我们玩游戏,游戏有一个模块,一直在判断我们角色的HP,直到我们的HP为零或为负,我们就结束了生命。
    或者比如人的生命,活着的时候不停接受外界消息(声光味道),直到我们寿终正寝(有点儿迷信,最后一个消息是上苍发送的:“你挂了”        
    对应的,应用程序一直在接受WINDOWS的消息,直到接收到让它结束的消息
(PS:简单说明怎么也这么难呢?)
函数
不确切的说,函数就是一段程序的功能模块,比如我们要输出一个字符串“ONE WORLD,ONE DREAM”
就可以用函数来实现,为了整齐和模块化,所有要输出字符串的功能,我们都交给一个函数,这样还很方便
函数有的带有参数,有的不带参数,参数是函数执行时,传给它的需要使用信息
比如:屠宰函数,我们必须传给它一只猪(一群),或者一只牛啥的,当我们传参数错了,传给它一个美女
那么它工作就不正常了
函数也有返回值(也可以什么都不返回,就纯屠宰),就是执行完毕后返回给咱一个值
如上面,我们传猪完毕,屠宰函数执行,返回成品肉
传美女,屠宰异常,返回一个错误信息“你丫还有没有人性?!”
这里的猪和美女,就是不同的参数类型
一只牛和一群猪,代表参数可以有多个
成品肉和错误信息,代表不同返回值
WIN32 API常见函数
Windows API包含了一大组功能强大的函数,它们本身驻扎在 Windows 中供人们随时调用。这些函数的大部分被包含在几个动态链接库(DLL)中,譬如:kernel32.dll、 user32.dll 和 gdi32.dll。 Kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。(当然还有其它DLL中的函数)
我们看SRENG扫描报告,会看到一些类似的函数名(进程特权中,就常会出现被杀毒软件或者病毒HOOK了的函数,HOOK的概念参见1楼),我们现在来简单了解,一些函数的功能(PS:不包括NativeAPI)
1、限制程序功能函数
EnableMenuItem 允许、禁止或变灰指定的菜单条目
EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰)
2、磁盘处理函数
GetDiskFreeSpaceA 获取与一个磁盘的组织有关的信息,以及了解剩余空间的容量
GetDiskFreeSpaceExA 获取与一个磁盘的组织以及剩余空间容量有关的信息
GetDriveTypeA  判断一个磁盘驱动器的类型
GetLogicalDrives  判断系统中存在哪些逻辑驱动器字母
GetFullPathNameA 获取指定文件的详细路径
GetVolumeInformationA  获取与一个磁盘卷有关的信息
GetWindowsDirectoryA 获取Windows目录的完整路径名
GetSystemDirectoryA 取得Windows系统目录(即System目录)的完整路径名  
3、文件处理函数
CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台  
OpenFile 这个函数能执行大量不同的文件操作
ReadFile 从文件中读出数据  
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
WriteFile 将数据写入一个文件
WriteFileEx  与WriteFile类似,只是它只能用于异步写操作,并包括了一个完整的回调  
SetFilePointer 在一个文件中设置当前的读写位置  
SetEndOfFile 针对一个打开的文件,将当前文件位置设为文件末尾  
CloseHandle  关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等  
  
_lcreat 创建一个文件
_lopen 以二进制模式打开指定的文件
_lread 将文件中的数据读入内存缓冲区
_lwrite  将数据从内存缓冲区写入一个文件
_llseek 设置文件中进行读写的当前位置  
_lclose 关闭指定的文件
_hread  将文件中的数据读入内存缓冲区
_hwrite 将数据从内存缓冲区写入一个文件
  
OpenFileMappingA 打开一个现成的文件映射对象
CreateFileMappingA 创建一个新的文件映射对象
MapViewOfFile 将一个文件映射对象映射到当前应用程序的地址空间
MapViewOfFileEx  (内容同上)
  
CreateDirectoryA 创建一个新目录
CreateDirectoryExA 创建一个新目录
RemoveDirectoryA 删除指定目录
SetCurrentDirectoryA 设置当前目录
  
MoveFileA 移动文件
DeleteFileA 删除指定文件  
CopyFileA 复制文件  
CompareFileTime 对比两个文件的时间
SetFileAttributesA 设置文件属性  
SetFileTime 设置文件的创建、访问及上次修改时间
FindFirstFileA 根据文件名查找文件  
FindNextFileA 根据调用FindFirstFile函数时指定的一个文件名查找下一个文件  
FindClose 关闭由FindFirstFile函数创建的一个搜索句柄
SearchPathA 查找指定文件  
  
GetBinaryTypeA 判断文件是否可以执行
GetFileAttributesA  判断指定文件的属性  
GetFileSize 判断文件长度
GetFileTime 取得指定文件的时间信息
GetFileType  在给出文件句柄的前提下,判断文件类型  
4、注册表处理函数
RegOpenKeyA  打开一个现有的注册表项
RegOpenKeyExA  打开一个现有的注册表项
RegCreateKeyA 在指定的项下创建或打开一个项
RegCreateKeyExA 在指定项下创建新项的更复杂的方式
RegDeleteKeyA 删除现有项下方一个指定的子项
RegDeleteValueA 删除指定项下方的一个值
RegQueryValueA 获取一个项的设置值
RegQueryValueExA 获取一个项的设置值
RegSetValueA 设置指定项或子项的值  
RegSetValueExA 设置指定项的值
RegCloseKey 关闭系统注册表中的一个项(或键)
5、时间处理函数
CompareFileTime  比较两文件时间
GetFileTime 得文件建立,最后访问,修改时间
GetLocalTime 得当前本地时间
GetSystemTime 得当前系统时间
SetFileTime 设置文件时间
SetLocalTime 设置本地时间
SetSystemTime 设置系统时间
6、进程函数
CreateProcessA  创建一个新进程
ExitProcess 以干净的方式关闭一个进程  
FindExecutableA 查找与一个指定文件关联在一起的程序的文件名
FreeLibray 释放指定的动态链库
GetCurrentProcess 获取当前进程的一个伪句柄
GetCurrentProcessId 获取当前进程一个唯一的标识符
GetCurrentThread 获取当前线程的一个伪句柄  
GetExitCodeProces 获取一个已结束进程的退出代码
GetExitCodeThread 获取一个已结束线程的退出代码
GetModuleHandleA  获取一个应用程序或动态链接库的模块句柄
GetPriorityClassA 获取特定进程的优先级别
  
LoadLibraryA  载入指定的动态链接库,并将它映射到当前进程使用的地址空间
LoadLibraryExA 装载指定的动态链接库,并为当前进程把它映射到地址空间  
LoadModule  载入一个windows应用程序,并在指定的环境中运行  
  
TerminateProcess 结束一个进程
  

SSDT 系统服务描述符表
    内核中有两个系统服务描述符表,一个是KeServiceDescriptorTable,由ntoskrnl.exe导出,一个是KeServieDescriptorTableShadow,没有导出,这两者都是一个结构体。
    当系统需要使用一个本机API的时候,就会去查找SYSTEM_DESCRIPTOR_TABLE这个表,KeServiceDescriptorTable
下面是一个来自E8 非常形象的比喻
    从前有一个很大的帮派,名字叫做Windows,功能很多并且很强大。因为这些各方面的能力由各个专人负责,他们一个人做一件事情。随着人员增多,帮主发现联系起来越来越困了。有一天帮主要找竟然NtOpenProcess来调查一下他的一个手下是不是别的帮派派来的间谍,但是他发现NtOpenProcess跑不见了。
    于是军师就想出了一个好办法来解决这个问题:先建立一个封闭的密室,这个密室只有八袋长老以上的人才能进去。密室中间有一张纸条,上面写着一个地址——温家堡,还有这个地址放着多少人的联系信息等内容。这个密室就是Ntdll.dll,这个纸条就是SYSTEM_DESCRIPTOR_TABLE,上写的地址就是SYSTEM_SERVICE_TABLE,也就是温家堡了。这个温家堡是一个有很多大房间的地方,每个房子有个房间号,房间里面又放着一张纸条,上面写着各个手下的住所。比如说编号为7A的房间,里面放的是NtOpenProcess的家庭住址。
    这样一来,帮主要找人就容易了。先去密室找到纸条,看看上面写的是温家堡还是白云城,那个地方有多少个人的联系信息等。如果是温家堡就跑到那里去,看看要找谁,找NtOpenProcess就去7A房间。在这个房间里一看,啊,里面写着NtOpenProcess现在就住在密室的旁边……搞定。
    这里就有一个新的问题,帮主假设这个里面写的东西都是正确的,没有被人改过。于是就有了别派的间谍发现了,偷偷溜进密室,然后根据纸条的内容,又跑到温家堡。进到7A房间,神不知鬼不觉的把里面记录的NtOpenProcess的地址改成了自己的家。于是,帮主再找人,发现找到对头家里去了,这个就是传说中的SSDT Hook了。。。(PS:太传神了,偶像)
    攻击者进入WINDOWS核心后(ring0)之后,找到SYSTEM_SERVICE_TABLE的地址(进入密室,找到纸条写的地址——温家堡)。然后把SYSTEM_SERVICE_TABLE中一个特定函数的地址为自己定义的函数入口,截获了系统调用(来到温家堡,改掉7A房间里面写的住所,改成自己家)一次HOOK就完成了。
  PS:看了几遍其实还是有点儿晕,仔细看,能看明白的


主动防御为什么对恶意软件有威慑力(或者说,病毒为什么要反击)
                                                                                                                                             
行为:
  自启动
  绕过软件防火墙
  密码截取
  释放文件
  执行程序
  加载内核驱动,或者加载ROOTKIT
  其它要修改注册表的行为:浏览器加载项,SHELL扩展项(如右键菜单)
  操作物理内存
  
以上行为,大部分都会被主防拦截到

代码注入
  广泛应用于穿透软件防火墙,将恶意代码注入到可信进程之中

  1.远程线程技术,HOOK,APC
  2.代码注入也可以转化为修改注册表
  如:WINLOGON通知包,BHO,EXPLORER SHELL扩展,<AppInit_DLLs>等等等等
  这样就可以把DLL注入相关进程(这个进程可能是防火墙默认允许访问网络的,于是出现了会下载更多病毒的东东)
  3.进入核心,恢复钩子(比如恢复SSDT,会使大多数监控失效)
    或者从磁盘文件解析,取得需要使用的相关函数的原始地址,绕过监控,进行注入
  4.OpenProcess时可以将目标进程的PID+1或+3,绕过一些安全软件防止自身进程被终止的保护,结束安全软件,再进行注入
**方法3也被利用于绕过注册表监控
  

恶意软件如何进入系统核心
一些病毒是如何进入系统核心的呢?

  1 主要是加载驱动
      SCM
      CreateService
      NtLoadDriver
      ZwSetSystemInformation(SystemModuleInformation)
      ZwSystemDebugControl
  2 写注册表(HIVE方法),如果安全软件监控了ZwLoadDriver,则首次不加载,重启后加载
  3 物理内存对象 \Device\PhysicalMemory(符号链接,绕过一些主动防御对物理内存对象的监控)
  4 权限提升(提升到SYSTEM..)
  5 感染系统关键SYS文件,再添加 Callgate
  etc.


恶意软件的反抗
为了对抗主动防御,恶意软件采取的一些行为
1.映像劫持
2.HOOK威胁
3.伪造数字签名
4.创建一个对话框,只有1*1像素,屏幕左上角,用户无法察觉
  由于一些安全软件判断逻辑为:具有非交互界面的进程,就是无窗口的进程,加载驱动,或释放文件报警
  这样就绕过了监控;模拟键盘鼠标(1楼)
  (PS:太邪恶了...)
5.修改系统日期,使一些安全软件过期(越来越少了)
6.绕过防火墙,通过后门程序更新本身或者下载更多的威胁,导致无法彻底清除
7.防止文件被删(只能重启删除)
8.替换系统文件, 感染文件
9.隐藏注册表键值



『 PS --本群成员 天云一剑 。楠楠。 此贴可能含有技术和说明上的不足和纰漏。希望大家能提出意见修改。并且请大家多多包涵!THANKS』
caolizhen
发表于 2008-8-12 19:58:31 | 显示全部楼层
LZ说的是HIPS。。。。。
暗夜公爵
发表于 2008-8-12 19:59:22 | 显示全部楼层
不识庐山真面目...
caolizhen
发表于 2008-8-12 20:00:57 | 显示全部楼层
原帖由 caolizhen 于 2008-8-12 19:58 发表
认清主动防御概念

主动防御(Proactive Denfense),有人认为主动防御只包括行为拦截和前瞻性防御,还有人竟认为主动防御就是HIPS,其实现在业界对主动防御还没有一个很好的定义,甚至每种不同杀软的白皮书的定义都不同。

我们首先可以从字面意思上来分析,主动防御,也就是非被动防御,对未知威胁,传统技术所预测不到的病毒进行防御,那么也就可以这么理解,区别于特征码杀毒的都可以叫做主动防御(前摄性防御),狭义的主防就是指行为拦截。那么就定义来看,NOD32和红伞也应该有主防的。



引用我和小夏写的认清主动防御
caolizhen
发表于 2008-8-12 20:02:50 | 显示全部楼层
秒你所说的主防中的HIPS还有一种方法,
如果HIPS靠Ring3下的API Hook来完成,那被恢复钩子也是很简单的东西,就像弱智的瑞星,全是Ring3的东西。
深红的雪
发表于 2008-8-12 20:07:11 | 显示全部楼层
不错的普及文

函数方面,不要忘了大部分还有W系列的,建议把A去掉
caolizhen
发表于 2008-8-12 20:12:59 | 显示全部楼层

回复 6楼 rappar 的帖子

气流 久闻大名。。。。。。
深红的雪
发表于 2008-8-12 20:22:45 | 显示全部楼层

回复 5楼 caolizhen 的帖子

Ring3下没有HIPS

瑞星的主防虽然很容易被绕过,但好歹也是SSDT Hook
caolizhen
发表于 2008-8-12 20:28:26 | 显示全部楼层

回复 8楼 rappar 的帖子

饿。。。我是说如果。。。。
caolizhen
发表于 2008-8-12 20:30:32 | 显示全部楼层

回复 8楼 rappar 的帖子

现在主动防御都是 靠SSDT Hook
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-10 03:22 , Processed in 0.132099 second(s), 17 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表