输入法注入的原理
- 输入法注入:利用Windows系统中在切换输入字符时,系统就会把这个输入法所需要的ime文件装载到当前进程中,而由于这个ime文件本质上就是存放在C:\windows\System32目录下的特殊的dll文件,因此我们可以利用这个特性,在IME文件中使用Loadlibrary()函数替代注入的dll文件
Inline Hook的实现流程
简述ssdt hook
- SSDT是最常见的内核层 HOOK。SSDT的全称是系统服务描述符表(System Services Descriptor Table)。SSDT是关联ring3的Win32 API和ring0的内核API的重要数据结构,它存储着Windows把需要调用的所有内核API地址。SSDTHOOK原理是将内核层API地址修改为指向其位于Ring0层的驱动入口,这样每次系统执行到这个函数时,都会通过SSDT表将原始调用引向修改后的模块中
什么是远程注入?还有哪些注入方式?
- 远程注入是将一个dll注入到目标进程的技术 除此之外还有
- APC注入
- 注册表注入
- 全局钩子注入
- 输入法注入
零环的HOOK都有哪些,如何实现?
1. SSDT HOOK
SSDT是最常见的内核层HOOK。SSDT的全称是系统服务描述符表(System Services Descriptor Table)。SSDT是关联ring3的Win32 API和ring0的内核API的重要数据结构,它存储着Windows把需要调用的所有内核API地址。SSDT HOOK原理是将内核层API地址修改为指向其位于Ring0层的驱动入口,这样每次系统执行到这个函数时,都会通过SSDT表将原始调用引向修改后的模块中
2. IDT HOOK
3. SYSENTRY HOOK
SYSENTRY是Windows XP之后的操作系统进入ring0的函数。Win2000中通过int2e系统调用机制,涉及到的Interrupt/Exception Handler的调用都是通过call/trap/task这一类的gate来实现的,这种方式会进行栈切换,并且系统 栈的地址等信息由TSS提供,可能会引起多次内存访问 (来获取这些切换信息),系统开销较大。SYSENTER通过汇编指令实现快速系统调用机制。SYSENTER HOOK的原理是首先Ntdll加载相应的请求服务号到EAX寄存器中,同时EDX寄存器存贮当前的栈指针ESP,然后Ntdll发出SYSENTER指令,该指令转移控制权到寄存器IA32_SYSENTER_EIP存贮的地址中[21],通过修改这个地址,可实现相应的挂接
4. Inline HOOK
inline hook是直接在以前的函数体内修改指令,用一个跳转或者其他指令来实现挂钩的目的。 而普通的hook只是修改函数的调用地址,而不是在原来的函数体里面做修改。Inline hook原理是解析函数开头的几条指令,把他们Copy到数组保存起来,然后用一个调用我们的函数的几条指令来替换,如果要执行原函数,则在我们函数处理完毕,再执行我们保存起来的开头几条指令,然后调回我们取指令之后的地址执行。它需要在程序中嵌入汇编代码(Inline Assembly)以操作堆栈和执行内核API对应的部分汇编指令。
5. OBJECT HOOK
OBJECT HOOK是相对于IAT HOOK之类的API HOOK而言,API HOOK是挂钩应用层函数,而OBJECT HOOK是挂钩内核层函数。其原理与API HOOK类似。
6. IRP HOOK
IRP是I/O request packets,在Windows中几乎所有的I/O都是通过包(packet)驱动的,每个单独的I/O由一个工作命令描述,此命令将会告诉驱动程序需要一些什么操作,并通过I/O子系统跟踪处理过程。这些工作命令就表现为一个个被称为IRP的数据结构。IRP HOOK原理是拦截管理器发向文件或网络系统等驱动程序的IRP。一般通过创建一个上层过滤器设备对象并将之加入系统 设备所在的设备堆栈中。也有部分IRPHOOK通过拦截传递IRP请求包的函数IofCallDriver或MajorFunction函数表来实现的
什么是DLL注入技术?
DLL注入简单来说就是将代码插入/注入到正在运行的进程中的过程 注入的代码是动态链接库(DLL)的形式
APC注入流程
1.通过 OpenProcess 函数打开目标进程 获取目标进程句柄
2.遍历线程 获取目标进程的所有线程ID
3.使用 VirtualAllocEx 在目标进程中申请内存,并通过 WriteProcessMemory 函数向内存中写入DLL的绝对路径
4.最后 遍历获取到的线程ID,并调用 OpenThread 函数打开线程拿到线程句柄,并调用 QueueUserAPC 函数向线
程插入APC函数
远程线程注入流程
- OpenProcess打开注入进程 获取进程句柄
2.在注入进程中申请内存 向申请的内存中写入DLL的绝对路径
3.获取LoadLibrary的函数地址
4.创建远程线程,调用LoadLibrary,实现dll注入
5.关闭句柄
远程线程注入的原理?
远程线程注入是使用关键函数CreateRemoteThread+LoadLibrary在其他进程空间中创建一个线程 并且执行DLL中的
代码 因为CreateRemoteThread需要传一个函数地址和多线程参数 而LoadLibrary正好只有一个参数 所以只要将
CreateRemoteThread+LoadLibrary结合 就能在目标进程注入DLL了
关键在于获取目标进程中某个DLL路径字符串的地址和LoadLibrary的地址
关于LoadLibrary的地址 虽然windows引入了随机基址的安全机制 但是系统的DLL的加载基址是固定的 所以
Kernel32.dll里的LoadLibrary和自己程序空间的地址是一样的
关于DLL路径字符串的地址 可以直接调用VirtualAllocEx在目标进程空间申请内存 再调用WriteProcessMemory函数
将指定的DLL路径写入目标进程空间就可以了
消息钩子注入的原理?
使用Windows提供的SetWindowsHookEx可以设置消息钩子,系统维护了一个钩子链。 设置完成之后,操作系统会
自动帮你安装钩子到钩子链头部,当对应的事件发生的时候 系统就会先启动对应的回调函数,把DLL加载到发生事件
的进程中,这样就实现了DLL注入。
什么是Hook技术?
Hook技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时
钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉
出来变成我们自己执行代码片段
inline-Hook的原理 如何检测?
原理:修改函数的前五个字节为jmp XXX跳转到自己的函数地址
检测函数的前五个字节是否为EB E9 EA
对比函数所在的PE文件在本地和内存中的数据
校验代码段的HASH值
IAT-Hook的原理 如何检测?
修改导入函数地址表中的地址 使调用该函数时跳转到自己的函数地址
检测方法:
- 1.在程序运行之前枚举导入表 然后使程序运行 读取文件再次枚举导入表 比较两个表中的FOA和RVA
- 2.查找导入表中INT的函数名称 使用LoadLibrary+GetProcAddress手动加载函数地址得到的是真正的函数地址 然
后跟IAT表的函数地址做比较