输入法注入的原理

  • 输入法注入:利用Windows系统中在切换输入字符时,系统就会把这个输入法所需要的ime文件装载到当前进程中,而由于这个ime文件本质上就是存放在C:\windows\System32目录下的特殊的dll文件,因此我们可以利用这个特性,在IME文件中使用Loadlibrary()函数替代注入的dll文件

Inline Hook的实现流程

  • 用MessageBoxA做例子

    开启HOOK

      1. 获取MessageBoxA在user32.dll里的函数地址
      1. 保存MessageBoxA函数的前五个字节
      1. 获得进程ID
      1. 修改进程MessageBoxA的前五个字节的属性为可写
      1. 修改进程MessageBoxA的前五个字节为JMP到MyMessageBoxA
      1. 修改进程MessageBoxA的前五个字节的属性为原来的属性

        卸载HOOK

      1. 修改进程MessageBoxA的前五个字节的属性为可写
      1. 修改进程MessageBoxA的前五个字节为原来的五个字节
      1. 修改进程MessageBoxA的前五个字节的属性为原来的属性

简述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函数

远程线程注入流程

  1. 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表的函数地址做比较