1. // Win32Project2.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. ///////////////////////////////////////////////////////////////////////////////////////////////////////
  4. /*
  5.  
  6. DLL名称劫持注入法
  7.  
  8. 当游戏运行加载一个重要的的DLL模块时,我们让他来加载我们需要注入的DLL和原来那个必须加载的游戏DLL模块。
  9.  
  10. 比如说一些游戏加载游戏本身DLL“client.dll”。
  11. 游戏DLL“client.dll”重命名为“client- original.dll”。
  12. 把我们需要注入的DLL重命名成“client.dll”,并把2个DLL放在一起。
  13. 把下面源码的client.exe更换成你需要注入的游戏的进程名。
  14.  
  15. 原理:
  16. 游戏运行时先加载我们伪造的DLL“client.dll”,但由于关键函数还在原来的client.dll中。
  17. 所以先将自身复制为临时文件“client - temp.dll”
  18. 加载后然后卸载本身。替换原来的“client.dll”并加载。
  19. 然后,它运行一个bat脚本,将等待游戏退出,一旦游戏退出。
  20. bat脚本将复制临时文件“client - temp.dll”到“client.dll”,
  21. 这样它就会在下次游戏启动时继续加载。
  22.  
  23. */
  24. #include "stdafx.h"
  25. #include "fstream"
  26. using namespace std;
  27.  
  28. void 替换(char* szBuffer, size_t bufferSize, char* from, char* to)
  29. {
  30. char* szpTemp,
  31. *szpTempBuffer,
  32. *szpCurrentBuffer;
  33.  
  34. szpCurrentBuffer = szBuffer;
  35. szpTempBuffer = new char[bufferSize];
  36.  
  37. while (true)
  38. {
  39. szpTemp = strstr(szpCurrentBuffer, from);
  40.  
  41. if (szpTemp != NULL)
  42. {
  43. if (strlen(szBuffer) - strlen(from) + strlen(to) < bufferSize)
  44. {
  45. strcpy(szpTempBuffer, szpTemp + strlen(from));
  46.  
  47. *szpTemp = '\0';
  48. strcat(szpTemp, to);
  49. szpCurrentBuffer = szpTemp + strlen(to);
  50. strcat(szpTemp, szpTempBuffer);
  51. }
  52. else
  53. break;
  54. }
  55. else
  56. break;
  57. }
  58.  
  59. delete[] szpTempBuffer;
  60. }
  61.  
  62. DWORD WINAPI ThreadMain(LPVOID lpvParam)
  63. {
  64. MessageBox(, "劫持注入成功", "hello", );
  65.  
  66. return ;
  67. }
  68.  
  69. BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpvReserved)
  70. {
  71. BYTE* pCave;
  72.  
  73. ifstream in;
  74.  
  75. ofstream out;
  76.  
  77. BOOL bLoad;
  78.  
  79. FARPROC targetFunction;
  80.  
  81. HMODULE hTargetModule;
  82.  
  83. char* szpName;
  84.  
  85. char szFileName[MAX_PATH],
  86. szBuffer[MAX_PATH],
  87. szTempBuffer[MAX_PATH];
  88.  
  89. char* szpTargetModule;
  90.  
  91. STARTUPINFO si = { sizeof(STARTUPINFO) };
  92.  
  93. PROCESS_INFORMATION pi;
  94.  
  95. char szCmdLine[MAX_PATH];
  96.  
  97. bLoad = FALSE;
  98.  
  99. if (dwReason == DLL_PROCESS_ATTACH)
  100. {
  101. GetModuleFileName(hModule, szFileName, sizeof(szFileName));
  102. strcpy(szBuffer, szFileName);
  103.  
  104. // 判断自身是否为临时文件,如果不是临时文件将创建并加载
  105. if (strstr(szFileName, " - temp.dll") == NULL)
  106. {
  107. 替换(szBuffer, sizeof(szBuffer), ".dll", " - temp.dll");
  108.  
  109. if (CopyFile(szFileName, szBuffer, FALSE) != NULL)
  110. {
  111. szpTargetModule = (char*)VirtualAlloc(NULL, , MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  112.  
  113. strcpy(szpTargetModule, szBuffer);
  114.  
  115. hTargetModule = GetModuleHandle("Kernel32.dll");
  116. targetFunction = GetProcAddress(hTargetModule, "LoadLibraryA");
  117.  
  118. pCave = (BYTE*)VirtualAlloc(NULL, 0x10, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  119. *pCave++ = 0x68;
  120. *(DWORD*)pCave = (DWORD)szpTargetModule;
  121. pCave += ;
  122. *pCave++ = 0xe8;
  123. *(DWORD*)pCave = (DWORD)((DWORD)targetFunction - (DWORD)pCave - );
  124. pCave += ;
  125. *pCave++ = 0xc2;
  126. *pCave++ = 0x04;
  127. *pCave++ = 0x00;
  128. pCave -= ;
  129.  
  130. CreateThread(, , (LPTHREAD_START_ROUTINE)pCave, , , );
  131. }
  132. }
  133. else
  134. {
  135. // 如果是临时的DLL
  136. 替换(szBuffer, sizeof(szBuffer), " - temp.dll", ".dll");
  137.  
  138. // 等待遊戲主進程是否佔用此DLL 等待寫入權限
  139. do
  140. {
  141. in.open(szBuffer, ios::out);
  142.  
  143. if (in.is_open() == true)
  144. {
  145. in.close();
  146. break;
  147. }
  148.  
  149. Sleep();
  150. } while (true);
  151.  
  152. // 写一个bat脚本,一旦游戏退出,恢复自身文件名,下次可以继续加载
  153. //// 把下面的client.exe改成你需要注入的游戏进程名
  154. out.open("bat.bat", ios::out);
  155.  
  156. if (out.is_open() == true)
  157. {
  158. out << ":WAITLOOP" << endl;
  159. out << "tasklist /FI \"IMAGENAME eq Client.exe\" 2>NUL | find /I /N \"Client.exe\">NUL" << endl;
  160. out << "if \"%ERRORLEVEL%\"==\"0\" goto RUNNING" << endl;
  161. out << "goto NOTRUNNING" << endl;
  162.  
  163. out << ":RUNNING" << endl;
  164. out << "timeout /t 2" << endl;
  165. out << "goto WAITLOOP" << endl;
  166.  
  167. out << ":NOTRUNNING" << endl;
  168. out << "copy \"" << szFileName << "\" \"" << szBuffer << "\"" << endl;
  169. out.close();
  170.  
  171. strcpy(szTempBuffer, szFileName);
  172. *strrchr(szTempBuffer, '\\') = '\0';
  173.  
  174. sprintf(szCmdLine, "cmd.exe /C \"%s\\bat.bat\"", szTempBuffer);
  175.  
  176. CreateProcess(NULL, szCmdLine, , , FALSE, CREATE_UNICODE_ENVIRONMENT, NULL, , &si, &pi);
  177. }
  178.  
  179. 替换(szFileName, sizeof(szFileName), " - temp.dll", " - original.dll");
  180. CopyFile(szFileName, szBuffer, FALSE);
  181.  
  182. LoadLibrary(szBuffer);
  183.  
  184. CreateThread(, , ThreadMain, , , );
  185. bLoad = TRUE;
  186. }
  187. }
  188.  
  189. return bLoad;
  190. }

DLL另類劫持注入法的更多相关文章

  1. 注入技术--LSP劫持注入

    1.原理 简单来说,LSP就是一个dll程序. 应用程序通过winsock2进行网络通信时,会调用ws2_32.dll的导出函数,如connect,accept等. 而后端通过LSP实现这些函数的底层 ...

  2. 安全之路 —— 借助DLL进行远程线程注入实现穿墙与隐藏进程

    简介        大多数后门或病毒要想初步实现隐藏进程,即不被像任务管理器这样典型的RING3级进程管理器找到过于明显的不明进程,其中比较著名的方法就是通过远程线程注入的方法注入将恶意进程的DLL文 ...

  3. Sqli labs系列-less-5&6 报错注入法(下)

    我先输入 ' 让其出错. 然后知道语句是单引号闭合. 然后直接 and 1=1 测试. 返回正常,再 and 1=2 . 返回错误,开始猜表段数. 恩,3位.让其报错,然后注入... 擦,不错出,再加 ...

  4. Sqli labs系列-less-5&6 报错注入法(上)

    在我一系列常规的测试后发现,第五关和第六关,是属于报错注入的关卡,两关的区别是一个是单引号一个是双引号...当然我是看了源码的.... 基于报错注入的方法,我早就忘的差不多了,,,我记的我最后一次基于 ...

  5. DLL注入技术之劫持进程创建注入

    劫持进程创建注入原理是利用Windows系统中CreateProcess()这个API创建一个进程,并将第6个参数设为CREATE_SUSPENDED,进而创建一个挂起状态的进程,利用这个进程状态进行 ...

  6. 老树开新花:DLL劫持漏洞新玩法

    本文原创作者:丝绸之路 <img src="http://image.3001.net/images/20150921/14428044502635.jpg!small" t ...

  7. 36.浅谈DLL劫持

    最近在搞内网,需要实现免杀后门,大佬推荐了dll劫持,DLL劫持后,能干很多事情,比如杀软对某些厂商的软件是实行白名单的,你干些敏感操作都是不拦截,不提示的.还有留后门,提权等等.本文主要介绍如何检测 ...

  8. Dll劫持漏洞详解

      一.dll的定义 DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型.在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分 ...

  9. 关于dll劫持我的奇思妙想(一)

    0x00  前言 前段时间在研究着windows底层的一些东西,发现这个dll劫持一直没有做过,根据倾旋师傅的视频和文章做了一系列的研究,然后就突发来了兴致研究一些dll劫持提权. 0x01   了解 ...

随机推荐

  1. MySQL 安装方法

    所有平台的Mysql下载地址为: MySQL 下载. 挑选你需要的 MySQL Community Server 版本及对应的平台. Linux/UNIX上安装Mysql Linux平台上推荐使用RP ...

  2. ACM MM | 中山大学等提出HSE:基于层次语义嵌入模型的精细化物体分类

    细粒度识别一般需要模型识别非常精细的子类别,它基本上就是同时使用图像全局信息和局部信息的分类任务.在本论文中,研究者们提出了一种新型层次语义框架,其自顶向下地由全局图像关注局部特征或更具判别性的区域. ...

  3. Glusterfs3.3.1DHT(hash分布)源代码分析

    https://my.oschina.net/uvwxyz/blog/182224 1.DHT简介 GlusterFS使用算法进行数据定位,集群中的任何服务器和客户端只需根据路径和文件名就可以对数据进 ...

  4. Intro.js的简介和用法

    Intro.js 是用于向首页使用网站或者移动应用添加漂亮的分布指南效果,引导用户的js框架.支持使用键盘的前后方向键导航,使用 Enter 和 ESC 键推出指南.Intro.js 是 GitHub ...

  5. video元素和audio元素

    内容: 1.video元素 2.audio元素 注:这两个元素均是HTML5新增的元素 1.video元素 (1)用途 <video> 标签定义视频,比如电影片段或其他视频流 (2)标签属 ...

  6. JavaScript字符串练习

    题目: 预备代码: // 自定义输出 var log = function () { console.log.apply(this, arguments); }; // ====== // 测试 // ...

  7. Eclipse配置Tomcat,访问404错误

    我从官网上面下载的tomcat6,直接启动发现正常使用,但是在Eclipse绑定后启动,访问localhost:8080,本来应该是tomcat的主页,但是却报了404错误. 百度搜索了一下,原来是t ...

  8. 好久没玩laravel了,5.6玩下(三)

    好了,基础的测试通了,咱们开始增删改了 思路整理 先创建项目功能控制器 然后设置路由访问规则 然后开发项目的增删改功能 1 先创建项目的控制器 php artisan make:controller ...

  9. vue pm2守护进程

    Linux 创建一个.sh可执行脚本,例如hexo.sh 代码 12 #!/usr/bin/env bashhexo server 使用pm2 start hexo.sh执行脚本 Windows 创建 ...

  10. TDictionary 是delphi用的,c++builder用起来太吃力。

    TDictionary 是delphi用的,c++builder用起来太吃力.c++还是用std::map代替.c++d map很好用啊.https://blog.csdn.net/ddkxddkx/ ...