DLL注入:

1.  使用注册表注入dll

HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs

AppInit_Dlls中设置待注入的dll绝对路径

LoadAppInit_Dlls值设为1

2.  使用Windows挂钩注入dll

需要使用SetWindowsHookEx函数,MSDN定义如下:

  1. HHOOK WINAPI SetWindowsHookEx(

  2. _In_ int idHook,

  3. _In_ HOOKPROC lpfn,

  4. _In_ HINSTANCE hMod,

  5. _In_ DWORD dwThreadId

  6. );

第一个参数为挂钩类型;

第二个参数为一个函数地址,即挂钩类型事件发生时,系统应该调用的函数;

第三个参数标识一个dll,这个dll中包含第二个参数表示的函数;

第四个参数表示要给哪个线程挂钩,0表示所有运行线程

以下给出一个示例:

  1. HOOKPROC hkprcSysMsg;

  2. static HINSTANCE hinstDLL;

  3. static HHOOK hhookSysMsg;

  4. hinstDLL = LoadLibrary(TEXT("c:\\myapp\\sysmsg.dll"));

  5. hkprcSysMsg = (HOOKPROC)GetProcAddress(hinstDLL, "SysMessageProc");

  6. hhookSysMsg = SetWindowsHookEx(

  7. WH_SYSMSGFILTER,

  8. hkprcSysMsg,

  9. hinstDLL,

  10. 0);

可以使用UnhookWindowsHookEx取消挂钩:

  1. BOOL WINAPI UnhookWindowsHookEx(

  2. _In_ HHOOK hhk

  3. );

3.  使用远程线程注入dll

Dll注入的本质即让目标进程中的一个线程通过LoadLibrary()加载待注入dll文件。

通常情况下,无法控制目标进程线程,此时可以创建一个线程了实现上述目的,CreateRemoteThread便提供了此功能。

  1. HANDLE WINAPI CreateRemoteThread(

  2. _In_ HANDLE hProcess,

  3. _In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,

  4. _In_ SIZE_T dwStackSize,

  5. _In_ LPTHREAD_START_ROUTINE lpStartAddress,

  6. _In_ LPVOID lpParameter,

  7. _In_ DWORD dwCreationFlags,

  8. _Out_ LPDWORD lpThreadId

  9. );

hProcess表示待注入的目标进程;

lpStartAddress表示线程函数,此处设置为LoadLibrary();

lpParameter表示传递给线程函数的参数,此时设置为待注入的dll文件绝对路径。
使用CreateRemoteThread具体注入过程如下:

(1) 使用VirtualAllocEx在远程进程中申请一块内存空间;

(2) 使用WriteProcessMemory将Dll路径名复制到(1)中申请的地址;

(3) 使用GetProcAddress获取LoadLibraryW或LoadLibraryA的实际地址;

(4) 使用CreateRemoteThread在远程进程中创建新的线程,新线程调用LoadLibrary,并在参数中传入(1)中申请的内存地址,此时dll文件已经注入到远程线程,DllMain将执行我们设计的代码。

此时远程线程中保留一块申请的内存空间,需要对其进行释放:

(5) 使用VirtualFreeEx释放(1)中申请的内存;

(6) 使用GetProcAddress获取FreeLibrary函数实际地址;

(7) 使用CreateRemoteThread创建新的线程,调用FreeLibrary,参数传入已注入Dll的HMODULE.

4.  使用木马dll注入dll

将进程需要加载的dll文件替换掉,实现dll劫持。

例如,进程需要使用lpk.dll,通过伪造lpk.dll文件,利用windows应用程序加载dll的顺序,让其优先加载伪造的lpk.dll文件。

5.  把dll作为调试器注入

(1) DebugActiveProcess(pid)附加进程;

(2) Debug循环函数:WaitForDebugEvent等待调试事件,针对不同类型进行处理;

(3) ReadProcessMemory, WriteProcessMemory操作目标进程,钩取指定API

6.  使用CreateProcess注入代码

该方法用于向子进程注入代码:

(1) 创建子进程并挂起;

(2) 获取主线程内存地址;

(3) 保存主线程起始地址指令;

(4) 插入指令,调用LoadLibrary加载dll

(5) 子进程恢复运行;

(6) 执行插入的指令;

(7) 恢复原指令,按照原来的逻辑继续执行。

API 拦截:

1.  通过覆盖代码拦截API

(1) 获取待拦截函数地址;

(2) 保存该函数初始几个字节指令;

(3) 使用JMP替换这些指令,让其跳转到自定义的函数中,需要注意的是,自定义函数需与原函数具有相同的签名,相同的参数,相同的返回值,相同的调用约定;

(4) 程序调用被拦截函数时,将跳转到自定义函数中执行;

(5) 执行完毕后,将保存的原指令恢复到起始地址,调用函数让其按照原来的逻辑执行。

2.  通过修改IAT拦截API

每一个导入的dll文件对应一个IMAGE_IMPORT_DESCRIPTOR结构:

  1. typedef struct _IMAGE_IMPORT_DESCRIPTOR {

  2. union {

  3. DWORD Characteristics; // 0 for terminating null import descriptor

  4. DWORD OriginalFirstThunk; // RVA to original unbound IAT (PIMAGE_THUNK_DATA)

  5. } DUMMYUNIONNAME;

  6. DWORD TimeDateStamp; // 0 if not bound,

  7. // -1 if bound, and real date\time stamp

  8. // in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)

  9. // O.W. date/time stamp of DLL bound to (Old BIND)

  10. DWORD ForwarderChain; // -1 if no forwarders

  11. DWORD Name;

  12. DWORD FirstThunk; // RVA to IAT (if bound this IAT has actual addresses)

  13. } IMAGE_IMPORT_DESCRIPTOR;

其中成员变量FirstThunk指向一个IMAGE_THUNK_DATA结构体数组,数组中每一项对应一个导入函数:

  1. typedef struct _IMAGE_THUNK_DATA32 {

  2. union {

  3. DWORD ForwarderString; // PBYTE

  4. DWORD Function; // PDWORD

  5. DWORD Ordinal;

  6. DWORD AddressOfData; // PIMAGE_IMPORT_BY_NAME

  7. } u1;

  8. } IMAGE_THUNK_DATA32;

  9. typedef IMAGE_THUNK_DATA32 * PIMAGE_THUNK_DATA32;

  10. typedef IMAGE_THUNK_DATA32 IMAGE_THUNK_DATA;

  11. typedef PIMAGE_THUNK_DATA32 PIMAGE_THUNK_DATA;

因此,IAT HOOK的主要思路为:

(1) 遍历IMAGE_IMPORT_DESCRIPTOR数组,找到name为需要hook的dll;

(2) 遍历FirstThunk指向的IMAGE_THUNK_DATA,判断Function是否为待hook的API,若是,则替换为新的API.

以下是《Windows核心编程》中作者给出的实现函数:

  1. void ReplaceIATEntryInOneMod(PCSTR pszCalleeModName, //被调模块

  2. PROC pfnCurrent, //待HOOK原函数

  3. PROC pfnNew, //替换新函数

  4. HMODULE hmodCaller //调用新函数的模块

  5. ) {

  6. // Get the address of the module's import section

  7. ULONG ulSize;

  8. // An exception was triggered by Explorer (when browsing the content of

  9. // a folder) into imagehlp.dll. It looks like one module was unloaded...

  10. // Maybe some threading problem: the list of modules from Toolhelp might

  11. // not be accurate if FreeLibrary is called during the enumeration.

  12. PIMAGE_IMPORT_DESCRIPTOR pImportDesc = NULL;

  13. __try {

  14. pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(

  15. hmodCaller, TRUE, IMAGE_DIRECTORY_ENTRY_IMPORT, &ulSize);

  16. }

  17. __except (InvalidReadExceptionFilter(GetExceptionInformation())) {

  18. // Nothing to do in here, thread continues to run normally

  19. // with NULL for pImportDesc

  20. }

  21. if (pImportDesc == NULL)

  22. return; // This module has no import section or is no longer loaded

  23. // Find the import descriptor containing references to callee's functions

  24. for (; pImportDesc->Name; pImportDesc++) {

  25. PSTR pszModName = (PSTR) ((PBYTE) hmodCaller + pImportDesc->Name);

  26. if (lstrcmpiA(pszModName, pszCalleeModName) == 0) {

  27. // Get caller's import address table (IAT) for the callee's functions

  28. PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)

  29. ((PBYTE) hmodCaller + pImportDesc->FirstThunk);

  30. // Replace current function address with new function address

  31. for (; pThunk->u1.Function; pThunk++) {

  32. // Get the address of the function address

  33. PROC* ppfn = (PROC*) &pThunk->u1.Function;

  34. // Is this the function we're looking for?

  35. BOOL bFound = (*ppfn == pfnCurrent);

  36. if (bFound) {

  37. if (!WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,

  38. sizeof(pfnNew), NULL) && (ERROR_NOACCESS == GetLastError())) {

  39. DWORD dwOldProtect;

  40. if (VirtualProtect(ppfn, sizeof(pfnNew), PAGE_WRITECOPY,

  41. &dwOldProtect)) {

  42. WriteProcessMemory(GetCurrentProcess(), ppfn, &pfnNew,

  43. sizeof(pfnNew), NULL);

  44. VirtualProtect(ppfn, sizeof(pfnNew), dwOldProtect,

  45. &dwOldProtect);

  46. }

  47. }

  48. return; // We did it, get out

  49. }

  50. }

  51. } // Each import section is parsed until the right entry is found and patched

  52. }

  53. }

Windows Dll注入与API HOOK相关推荐

  1. Windows Dll Injection、Process Injection、API Hook、DLL后门/恶意程序入侵技术

    catalogue 1. 引言 2. 使用注册表注入DLL 3. 使用Windows挂钩来注入DLL 4. 使用远程线程来注入DLL 5. 使用木马DLL来注入DLL 6. 把DLL作为调试器来注入 ...

  2. CFF Explorer实现Windows 7下API HOOK

    关于API HOOK,就是截获API调用的技术,在对一个API调用之前先执行自己设定的函数,根据需要可以再执行缺省的API或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socket ...

  3. redistemplate注入为null_Windows DLL 注入技术

    Windows DLL 注入技术 本文主要介绍四种常见的 Windows DLL 注入技术. 分别为全局钩子.远线程钩子.突破 SESSION 0 隔离的远线程注入和 APC 注入. 全局钩子注入 W ...

  4. API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)

    一个完整的hook,如果hook程序是以dll形式生成的,是分两步:1.完成dll本身的设计和生成,2.完成dll注入程序的设计和生成 本文完成第一步. 第二步在http://blog.csdn.ne ...

  5. 2020-11-23(Windows系统的dll注入 )

    一.什么是dll注入 在Windows操作系统中,运行的每一个进程都生活在自己的程序空间中(保护模式),每一个进程都认为自己拥有整个机器的控制权,每个进程都认为自己拥有计算机的整个内存空间,这些假象都 ...

  6. Windows核心编程_远线程方式实现Dll注入

    之前有介绍过HOOK的方式注入,这次介绍以其它方式注入,而无须HOOK,要知道在Windows这个浩荡的海洋里,API就是宝藏,找到足够多的宝藏那么你就是海贼王~! 实现思路如下: 首先打开一个进程的 ...

  7. DELPHI 键盘HOOK,DLL注入,带窗口DLL注入及释放

    -----------DLL的创建退出过程---------- 新建的DLL内 procedure DllEnterProc(reason:integer); begin case reason of ...

  8. Windows注入与拦截(3) -- 使用钩子方式完成DLL注入

    一. 钩子技术介绍 前面介绍了< Windows注入与拦截(2) – 使用注册表方式完成DLL注入>,本文介绍使用钩子的方式将DLL注入到进程的地址空间中. Windows提供了3个API ...

  9. Windows 钩子,基本的dll注入

    Windows操作系统是基于钩子完成的消息传递与用户交互,它以事件驱动的方式运行.每一个窗口都拥有自己的消息队列,当外部设备触发消息时,消息被发送到系统消息队列,再有操作系统安排将消息发送到特定进程上 ...

最新文章

  1. Sharding-Jdbc 实现读写分离 + 分库分表,写得太好了!
  2. 5G改变物联网解决方案的6种方式
  3. mysql实战33 | 我查这么多数据,会不会把数据库内存打爆?
  4. yum 安装 phpmyadmin
  5. gojs 部分功能实现
  6. 区域卫生数据用于临床疗效分析的可用性研究
  7. C语言以数据块的形式读写文件
  8. 第四周 项目中的白盒测试
  9. mysql如何从两个表取出内容_如何从mysql中的两个表中获取数据?
  10. java如何防止sql注入
  11. 利用DirectoryEntry获取域内计算机以及共享资源
  12. Linux基础知识练习题
  13. Vista 自动激活工具(最新 最权威 所有版本 可升级)
  14. maya中英文对照_maya2011中英文对照表
  15. ESP32设备驱动-MicroSD Card驱动
  16. 10a大电流稳压芯片_高压dc48v降12v10a大电流降压ic详解
  17. 阀门定位器的三种维护方式
  18. fk算法绘制层状介质理论地震图
  19. Unitary matrix 幺正矩阵
  20. erp5开源制造业erp主要业务会计分录处理

热门文章

  1. 【SQL开发实战技巧】系列(九):一个update误把其他列数据更新成空了?Merge改写update!给你五种删除重复数据的写法!
  2. GCC编译器——GCC编译器的简介
  3. 解决:pip 下载太慢以及超时(timeout)
  4. ArcGIS Engine怎样快速合并一个图层的所有线面要素
  5. python字典对象的方法返回字典的值列表_python对象转字典的两种实现方式示例
  6. Linux下gcc交叉编译工具链制作实例详细总结(附下载地址)
  7. 蚂蚁课堂史上最全SpringBoot视频教程
  8. 常见代码审计工具,代码审计为什么不能只用工具?
  9. 大学c语言程序设计期末试题,北京理工大学《C语言程序设计》期末试题.pdf
  10. 深入浅出MFC-学习笔记 Day 2