参考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”
就可以用函数来实现,为了整齐和模块化,所有要输出字符串的功能,我们都交给一个函数,这样还很方便
函数有的带有参数,有的不带参数,参数是函数执行时,传给它的需要使用信息
比如:屠宰函数,我们必须传给它一只猪(一群),或者一只牛啥的,当我们传参数错了,传给它一个美女
那么它工作就不正常了
函数也有返回值(也可以什么都不返回,就纯屠宰),就是执行完毕后返回给咱一个值
如上面,我们传猪完毕,屠宰函数执行,返回成品肉
传美女,屠宰异常,返回一个错误信息“你丫还有没有人性?!”
这里的猪和美女,就是不同的参数类型
一只牛和一群猪,代表参数可以有多个
成品肉和错误信息,代表不同返回值
API 例子GetSystemTime,这个返回值就是系统时间了
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 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等
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,没有导出,这两者都是一个结构体。
它将Win32 API和ring0的内核API联系起来。
当系统需要使用一个本机API的时候,就会去查找SSDT这个表(KeServiceDescriptorTable)。
攻击者进入WINDOWS核心(R2层驱动或者RING 0级数)后,找到SSDT地址。然后把SSDT中一个特定函数的地址为自己定义的函数入口,截获了系统调用,一次HOOK就完成了。
主动防御为什么对恶意软件有威慑力(或者说,病毒为什么要反击) --------------------- 参考X'con07
行为:
自启动
绕过软件防火墙
密码截取
释放文件
执行程序
加载内核驱动,或者加载ROOTKIT
其它要修改注册表的行为:浏览器加载项,SHELL扩展项(如右键菜单)
操作物理内存
以上行为,大部分都会被主防拦截到
重要的一点,对于安装驱动,肯定是要报的
对于常规防范,大家看看 “目前流行木马病毒技术原理及防范概观”一文吧,作者:闪电风暴,搜索吧
大四了,如果谁能完善下,就来吧,魔法学徒学长,我整理了2次,还是这个样子
学徒学长,我把重复杂乱的内容删了