反射式dll注入(ReflectiveDLLInjection)

学习基于stephenfewer大佬的项目:ReflectiveDLLInjection
有兴趣的同学可以下载研究

常规的dll注入姿势:

  1. VirtualAllocEx 在目标进程内存空间申请内存,WriteProcessMemory 写入dll路径,CreateRemoteThread 创建远程线程调用 LoadLibrary 加载dll;
    CreateRemoteThread 可被 替换为其他创建线程的API(例如:RtlCreateUserThread,或者挂起线程修改线程上下文再还原等等),减少被拦截的风险
  2. 替换程序运行时会加载的dll;
  3. 修改注册表键值AppInit_dll,程序启动时如果加载了USER32.dll,就会自动加载该键值下的有效dll;
  4. SetWindowsHookEx挂钩,IAT_HOOK,InLine_HOOK等(本质也是让目标进程执行自己的代码)(x86与x64下InLine_HOOK略有不同);
  5. dll加载顺序挟持(Dll Search Order Hijacking);

反射式注入相比常规注入有何不同:

  1. 内存中直接展开,无需.dll文件存在;
  2. 没有通过LoadLibrary等API加载,ProcessExplorer、procexp64等工具无法检测到这个dll;
  3. 更容易免杀;

反射式注入思路:

  1. 根据需要注入的进程,向服务器申请dll下发;
  2. 将下发的数据解密后,直接写入申请的堆中;
  3. 打开进程(OpenProcess)、分配内存(VirtualAllocEx)、将堆中的数据写入内存(WriteProcessMemory);
  4. 获取 RtlCreateUserThread 函数指针
  5. RtlCreateUserThread = (PRTL_CREATE_USER_THREAD)(GetProcAddress(GetModuleHandle(TEXT(“ntdll”)), “RtlCreateUserThread”));
  6. 通过 RtlCreateUserThread 创建线程,调用 目标进程 内存中的 ReflectiveLoader;
  7. ReflectiveLoader 将dll在内存中展开,修复重定位、导入表(类似ShellCode);
  8. ReflectiveLoader 调用dll入口点

ReflectiveLoader 实现:

以下,需要对PE文件格式 及 ShellCode有了解;

  1. 线程在调用ReflectiveLoader时,dll还没有被加载,就有很多限制,例如:无法使用全局变量等;
  2. ReflectiveLoader 必须是地址无关的;
  3. 获取自身位置
    __declspec(noinline) ULONG_PTR caller( VOID ) { return (ULONG_PTR)_ReturnAddress(); }
    返回 caller 的下一条指令的地址;
  4. 获取所需的一些API地址,通过PEB PEB_LDR_DATA结构体 LIST_ENTRY链表,找到其他模块基址,再根据导出表找到函数地址,这里我们需要用的API有 VirtualAlloc、LoadLibrary 等;
  5. VirtualAlloc 分配内存,大小为扩展头中的 SizeOfImage,
  6. 根据内存对齐,拷贝DOS头、NT头、文件头、扩展头、区段头,再根据区段头拷贝各个区段;
  7. 修复导入表与重定位;
  8. 调用dll入口点,地址在扩展头的AddressOfEntryPoint,它会完成C运行库的初始化,执行安全检查,调用dllmain;

参考

https://bbs.pediy.com/thread-227075.htm
https://www.freebuf.com/articles/system/151161.html
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页