易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 311|回复: 2

Ring3 DLL注入总结及编程实现带源码

[复制链接]
发表于 2018-2-28 11:45:52 | 显示全部楼层 |阅读模式

Ring3注入总结

导入表注入
        静态注入的方法。修改PE文件,添加一个新节,修改导入表添加一个新的DLL实现注入。

挂起线程注入
        OpenThread-->SuspendThread-->GetThreadContext-->获取EIP-->修改EIP-->SetThreadContext-->ResumeThread

挂起进程注入
      CreateProcess注入方法之一,CREATE_SUSPENDED以挂起的方式打开进程,写入ShellCode注入。

调试器注入
       CreateProcess注入方法之二,DEBUG_ONLY_THIS_PROCESS以调试的方法打开进程,利用CREATE_PROCESS_DEBUG_EVENT,向目标程序中写入我们的ShellCode完成相应功能,并且我们的ShellCode中写入以CC断点,代码执行指令时触发EXCEPTION_DEBUG_EVENT事件,在EXCEPTION_DEBUG_EVENT的处理函数中回到原来的执行流程。

注册表注入

全局的注入方式:
修改:
HKEY_LOCAL_MACHINE/Software/Microsoft/WindowsNT/CurrentVersion/Windows/AppInit_DLLs的键值为我们DLL的路径,只要使用了user32.dll的程序都会加载这个目录下的DLL。

钩子注入
        利用SetWindowsHookEx拦截消息进行注入。

APC注入
        APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的。利用QueueUserAPC()可以向APC队列投入Loadlibrary函数指针完成注入,其实这种方法配合CreateProcess使用注入最为简单,先挂起打开线程,再QueueUserAPC(),再恢复线程,完成注入。

远程线程注入
        老的套路,主要是用到CreateRemoteThread这个API,通过它可以打开目标进程中的远程线程,然后跑我们的代码完成注入。

输入法注入
        利用输入法在工作时需要向进程中加载Ime文件(其实就是个Dll),我们构造自己的Ime文件,在Ime文件注入对方进程的时候加载我们自己的DLL完成注入

DLL劫持
       简单来说就是自己实现应用程序的某些DLL,完成导出函数,替换DLL实现注入。

关于Ring3下的反注入思路
反注入的方法大牛应该都是在Ring0下面玩,我只了解一些三环下的反注入思路,这里只聊3环下的反注入思路。

导入表注入
毕竟是静态修改文件的方法注入DLL,可以对自身PE文件求校验值判断是否被修改。

钩子注入
(1)HOOK自身进程的LoadLibraryExW这个函数,判断调用是否来自user32.dll,因为钩子注入时LoadLibraryExW的调用者为user32.dll,HOOK关键代码如下
  1. HMODULE WINAPI newLoadLibraryExW(LPCWSTR  lpLibFileName,HANDLE hFile,DWORD dwFlags)
  2. {
  3. //get the return address
  4. DWORD dwCaller;
  5.         //ebp+4返回上层调用者的地址
  6. __asm push dword ptr [ebp+4]
  7. __asm pop  dword ptr [dwCaller]
  8. if(dwCaller > m_dwUser32Start && dwCaller < m_dwUser32End)
  9. {
  10.        return FALSE;
  11. }   
  12. return rawLoadLibraryExW(lpLibFileName,hFile,dwFlags);
  13. }
复制代码


(2)安装WH_DEBUG消息钩子,在WH_DEBUG钩子的消息回到中屏蔽消息钩子,回调
  1. LRESULT CALLBACK DebugProc(  
  2.    int nCode,  
  3.      WPARAM wParam,  
  4.      LPARAM lParam  
  5. )
复制代码


其中第三个参数 lParam  指向DEBUGHOOKINFO结构体如下:
  1. typedef struct   
  2. {  
  3.      DWORD idThread;  //安装WH_DEBUG钩子的线程ID。
  4.      DWORD idThreadInstaller;  //当前即将被调用的钩子所在的线程ID。
  5.      LPARAM lParam;  
  6.      WPARAM wParam;  
  7.      int code;  
  8. } DEBUGHOOKINFO, *PDEBUGHOOKINFO;  
复制代码


判断这两个idThread与idThreadInstaller是否相等即可判断是自己进程的钩子

远程线程注入
当程序被远程线程被注入时候,线程的入口点一定为LoadLibraryA或者LoadLibraryW,我们用判断线程的入口点是不是LoadLibraryA或者LoadLibraryW,是就干掉。拿到线程入口点的方法是通过为公开的API --GetThreadStartAddress
关键代码如下:
  1. typedef enum _THREADINFOCLASS {
  2.     ThreadBasicInformation,
  3.     ThreadTimes,
  4.     ThreadPriority,
  5.     ThreadBasePriority,
  6.     ThreadAffinityMask,
  7.     ThreadImpersonationToken,
  8.     ThreadDescriptorTableEntry,
  9.     ThreadEnableAlignmentFaultFixup,
  10.     ThreadEventPair_Reusable,
  11.     ThreadQuerySetWin32StartAddress,
  12.     ThreadZeroTlsCell,
  13.     ThreadPerformanceCount,
  14.     ThreadAmILastThread,
  15.     ThreadIdealProcessor,
  16.     ThreadPriorityBoost,
  17.     ThreadSetTlsArrayAddress,
  18.     ThreadIsIoPending,
  19.     ThreadHideFromDebugger,
  20.     ThreadBreakOnTermination,
  21.     MaxThreadInfoClass
  22. } THREADINFOCLASS;

  23. typedef LONG (WINAPI *NtQueryInformationThreadProc)(
  24.     _In_       HANDLE ThreadHandle,
  25.     _In_       THREADINFOCLASS ThreadInformationClass,
  26.     _Inout_    PVOID ThreadInformation,
  27.     _In_       ULONG ThreadInformationLength,
  28.     _Out_opt_  PULONG ReturnLength
  29.     );

  30. NtQueryInformationThreadProc   NtQueryInformationThread = NULL;
  31. hNtdll                      = GetModuleHandleW(L"ntdll.dll");
  32. NtQueryInformationThread    = (NtQueryInformationThreadProc)GetProcAddress(hNtdll, "NtQueryInformationThread");

  33. HANDLE  hThread = NULL;
  34. PVOID   pvStart = NULL;
  35. hThread = OpenThread(THREAD_QUERY_INFORMATION | THREAD_TERMINATE, FALSE, te32.th32ThreadID);
  36. NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &pvStart, sizeof(pvStart), NULL);
复制代码


④DLL劫持
DLL的防御姿势我能想到就是对自己进程每个要加载的DLL求一个校验值,程序运行过程中进行校验

其他的防御姿势坐等各位指教。。。。。

源码与文档下载:
游客,如果您要查看本帖隐藏内容请回复

发表于 2018-5-29 23:42:46 | 显示全部楼层
: Ring3 DLL注入总结及编程实现带源
发表于 2018-8-18 14:03:48 | 显示全部楼层
人才辈出人才辈出
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|看流星社区  |网站地图

GMT+8, 2018-9-25 20:11 易语言论坛 易语言导航

Powered by 看流星社区 X3.2

©2011-2016 最好的辅助编程技术论坛

快速回复 返回顶部 返回列表