远程线程注入

远程线程注入不只是写了一两遍的玩意,没想到被问到流程的时候还是惨不忍睹,下面就重新记录一遍吧(这次一定要记住,加油),流程如下:

  1. 打开目标进程,获取目标进程句柄
  2. 在目标进程中申请空间
  3. 将要注入的Dll路径写入刚申请的空间中
  4. 获取LoadLibrary函数地址
  5. 在目标进程中创建线程,线程回调函数就是LoadLibrary函数,回调函数的参数就是要注入的dll路径
  6. 等待线程结束
  7. 清理环境

至于远程线程注入失败的原因,有如下几点(如有不足,不吝赐教):

  1. 会话(Session)隔离由于从Windows Vista 开始,微软为了增强系统的安全性,对系统服务和登录用户进行了会话(Session)隔离,系统服务属于会话0,登录的第一个用户属于会话1,之前系统服务和第一个登录用户都属于会话0。此方法并不能突破SESSION 0隔离。原因是在CreateRemoteThread 函数中对此进行了检查,如果不在同一会话中,调用 CsrClientCallServer 为新进程进行登记的操作就会失败,这就直接导致了线程创建的失败。
  2. dll与待注入重新的版本不同(32位与64位)
  3. 权限不够

最后复习下远程线程注入的原理:
远程线程注入是使用关键函数CreateRemoteThread+LoadLibrary在其他进程空间中创建一个线程 并且执DLL中的代码 因为CreateRemoteThread需要传一个函数地址和多线程参数 而LoadLibrary正好只有一个参数 所以只要将CreateRemoteThread+LoadLibrary结合 就能在目标进程注入DLL了
关键在于获取目标进程中某个DLL路径字符串的地址和LoadLibrary的地址
关于LoadLibrary的地址 虽然windows引入了随机基址的安全机制 但是系统的DLL的加载基址是固定的 所以Kernel32.dll里的LoadLibrary和自己程序空间的地址是一样的
关于DLL路径字符串的地址 可以直接调用VirtualAllocEx在目标进程空间申请内存 再调用WriteProcessMemory函数,将指定的DLL路径写入目标进程空间就可以了