进程注入和API HOOK原理介绍

Download Report

Transcript 进程注入和API HOOK原理介绍

进程注入和API HOOK原理介
绍
主要内容
• 基础知识回顾(PE文件, 汇编执行流程…..)
• 进程注入方式介绍
• API HOOK原理介绍
。
本次培训只针对应用层使用场景。
PE文件格式及内存分布
1.
2.
PE文件中的数据按照磁盘数据标准存, 以0x200(512)byte 为基本单位组织,
当一个数据节不足0x200时,不足地方被0x00填充, 超过0x200时, 下一个
0x200将分配给这个节使用. PE文件数据节永远都是0x200的整数倍.
当代码装入内存后,按照内存标准存放,以0x1000(4096)为基本单位进行组
织.(类似文件补全规则).内存中的节总是0x1000的整数倍.
节(section)
.text
相对偏移
0x00001000
文件偏移
0x0000400
.rdata
0x00007000
0x0006200
函数调用指令
• 几个重要的寄存器ESP,EBP,EIP.
• ESP:存放一个指针值 , 永远指向系统栈的
最顶栈帧的栈顶.
• EBP:存放一个指针值, 永远指向系统栈的最
顶栈帧的底部(不是系统栈的栈底).
• EIP:存放一个指针值,永远指向下一条执行
的指令.
• 函数调用约定(C/C++:__cdecl __stdcall
__thiscall ,__fastcall)
进程注入
何为代码注入,代码注入解决了什么问题
• 所谓代码注入,简单来说,就是把自己编写的代码,强迫
加载到第三方进程中,并强迫第三方进程执行我们的代码;
• 使用代码注入的场合有很多,如可以使用代码注入技术来
对第三方进程打补丁;通过注入代码实现问题的定位;但
也有病毒通过代码注入来实现病毒体的隐藏等;早期的病
毒,滥用了代码注入技术,使得很多杀软封杀代码注入,
也使得很多人认为代码注入是流氓行为
•
•
•
•
注入形式
(一) 直接代码注入, shellcode
(二) DLL注入
优缺点
shellcode
• 比较粗暴的方式:
直接淹没EBP, 返回地址
• 优雅一点的方式:
跳板方式 jmp esp
• exploit 精确制导。
• 例子:最简单的shellcode
DLL注入方式
•
•
•
•
•
•
AppInit_Dlls
消息钩子/事件钩子
远线程注入, APC注入
导入表注入
赛门铁克注入方案
迅影优化注入方案
AppInit_Dlls
• AppInit_DLLs值位于以下注册表项中:
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Current
Version\Windows
此值中指定的所有 Dll 都加载每个 Microsoft 当前已登录会话上运行的
基于 Windows 的应用程序。
• 在加载user32.dll 的 DLL_PROCESS_ATTACH 加载 AppInit_DLLs
不加载User32.dll的就不会被注入。
Note This feature may not be available in future versions of the Windo
ws operating system
SetWindowsHookEx
• 1.在成功调用 SetWindowsHookEx 后,系统自动映射
DLL 到钩子作用的线程地址空间,但不会立即发生映射。
• 因为 Windows 钩子都是消息,DLL 在消息事件发生前并
没有产生实际的映射。比如:如果你安装一个钩子监控某
些线程(WH_CALLWNDPROC)的非队列消息,在消息
被实际发送到(某些窗口的)钩子作用的线程之前,该
DLL 是不会被映射到远程进程的。换句话说,如果
UnhookWindowsHookEx 在某个消息被发送到钩子作用
的线程之前被调用,DLL 根本不会被映射到远程进程(即
使 SetWindowsHookEx 本身调用成功)。为了强制进行
映射,在调用 SetWindowsHookEx 之后马上发送一个事
件到相关的线程。
CreateRemoteThread
• 主要利用线程函数体 与 loadlibraryA声明相同。
• 比较常见
• 很多病毒都用此方法, 使得许多安全类软件对该函数很
敏感。
• 例子。
导入表注入
•
•
•
•
安全桌面使用的注入方式之一
进一步理解PE文件结构
自已控制加载顺序
微软的Detours库其实就是利用了这点原理;Detours库可
以修改子进程的导入表:把你所需要注入的DLL,放在导
入表的最开头位置,这样可以确保需要注入的DLL,优先
于其他DLL加载;
• 安全桌面代码参考。
• 实战:winhex手动修改PE文件 增加注入DLL
赛门铁克注入方案
•
这种方法的思想是:父进程创建子进程时,先把子进程
挂起,然后往子进程中写入一段机器码,这段机器码的作
用是加载我们需要注入的DLL,机器码写进去后,修改子
进程主线程的EIP指针,使得指针指向我们构造的机器码
;最后恢复子进程,让其继续运行;子进程被恢复后,先
去初始化导入表,导入表初始化完毕后,就会执行我们的
机器码了,这样,待注入的DLL就会成功的注入到子进程
中;
• 安全桌面代码参考
API HOOK
• Inline HOOK (detourd)
• Jmp hook(IAT)
• MS detourd库考虑了多种应用情况,多线程,父子进程,
通过修改后可以HOOK64位程序。