当前位置:首页 > 科技  > 软件

利用C++的HashMap结构实现一个多DLL注入器

来源: 责编: 时间:2024-01-16 17:33:26 153观看
导读1.技术实现背景在C++代码中, 如果要实现将一个Dll高效的注入到多个进程中, 可以定义一个HashMap结构, 在该结构中, 键名用来保存多个进程的名称, 而对应的键值可以对应的保存一个或多个DLL路径, 这个HashMap结构定义

3kM28资讯网——每日最新资讯28at.com

1.技术实现背景

在C++代码中, 如果要实现将一个Dll高效的注入到多个进程中, 可以定义一个HashMap结构, 在该结构中, 键名用来保存多个进程的名称, 而对应的键值可以对应的保存一个或多个DLL路径, 这个HashMap结构定义如下:3kM28资讯网——每日最新资讯28at.com

unordered_map<string, vector<string>> injectionMap;

而向其填充的键和键值参考如下:3kM28资讯网——每日最新资讯28at.com

injectionMap["taskmgr.exe"] = { "C://Users//Public//mscde.dll","C://Users//Public//msc23.dll"}; injectionMap["explorer.exe"] = { "C://Users//Public//mscde.dll" }; injectionMap["regedit.exe"] = { "C://Users//Public//mscde.dll" }; injectionMap["notepad.exe"] = { "C://Users//Public//mscde.dll" };

在该结构中, 每个进程可以对应注入的一个或多个Dll, 实际上键值是一个字符串数组。3kM28资讯网——每日最新资讯28at.com

这里设计一个多DLL注入器的函数如下:3kM28资讯网——每日最新资讯28at.com

int injectDlls(unordered_map <string, vector<string>> injectionMap) { for (auto& injectRow : injectionMap) {  for (auto& vectorDLL : injectRow.second) {           injectDLL(vectorDLL, getPIDbyProcName(injectRow.first));        }  cout << endl; } return 0;}

该函数实现的功能如下:3kM28资讯网——每日最新资讯28at.com

  • 参数接收一个HashMap结构, 其中键保存了要注入的所有进程名称, 其值保存了要注入到进程的DLL全路径字符串。
  • 循环遍历该结构, 取出键中的进程名传给getPIDbyProcName()函数获取该进程名对应的PID; 取出键值中的DLL全路径传给injectDLL()函数的第一个参数, 将获取的PID作为injectDLL()函数的第二个参数传入。
  • 最终由injectDLL()函数完成进程DLL注入。

3kM28资讯网——每日最新资讯28at.com

2.实现通过进程名获取PID

通过进程名获取PID的C++参考代码如下:3kM28资讯网——每日最新资讯28at.com

int getPIDbyProcName(const string& procName) {    int pid = 0;    HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);    PROCESSENTRY32W pe32;    pe32.dwSize = sizeof(PROCESSENTRY32W);    if (Process32FirstW(hSnap, &pe32) != FALSE) {        while (pid == 0 && Process32NextW(hSnap, &pe32) != FALSE) {            wstring wideProcName(procName.begin(), procName.end());            if (wcscmp(pe32.szExeFile, wideProcName.c_str()) == 0) {                pid = pe32.th32ProcessID;            }        }    }    CloseHandle(hSnap);    return pid;}

以上代码属于常规操作, 不再赘述。3kM28资讯网——每日最新资讯28at.com

3kM28资讯网——每日最新资讯28at.com

3.实现DLL远程注入

实现远程DLL注入的injectDLL() 函数参考代码如下:3kM28资讯网——每日最新资讯28at.com

bool injectDLL(string dllPath, int pid) { char* dllPathChar = new char[dllPath.length() + 1]; strcpy_s(dllPathChar, dllPath.length() + 1, dllPath.c_str()); dllPathChar[dllPath.length()] = '/0'; HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid); if (hProc == NULL) {  cout << "OpenProcess failed" << endl;  return false; } LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA"); if (LoadLibAddr == NULL) {  cout << "GetProcAddress failed" << endl;  return false; } LPVOID dereercomp = VirtualAllocEx(hProc, NULL, strlen(dllPathChar), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); if (dereercomp == NULL) {  cout << "VirtualAllocEx failed" << endl;  return false; } if (WriteProcessMemory(hProc, dereercomp, dllPathChar, strlen(dllPathChar), NULL) == 0) {  cout << "WriteProcessMemory failed" << endl;  return false; } HANDLE hThread = CreateRemoteThread(hProc, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, NULL, NULL); if (hThread == NULL) {  cout << "CreateRemoteThread failed" << endl;  return false; } CloseHandle(hProc); CloseHandle(hThread);  return true;}

远程DLL注入函数injectDLL() 主要完成了以下工作:3kM28资讯网——每日最新资讯28at.com

  • 接收两个参数, dllPath是要注入的DLL全路径, pid是目标进程的ID。
  • 在目标进程中调用VirtualAllocEx函数分配内存,需要传入DLL全路径。
  • 调用WriteProcessMemory函数将DLL全路径写入到分配的内存中。
  • 动态获取kernel32.dll中的LoadLibraryA函数地址。
  • 在目标进程中通过CreateRemoteThread创建一个远程线程, 将入口点设置为LoadLibraryA函数, 并将参数指向目标进程中的DLL路径。
  • 关闭进程和远程线程句柄。
  • 如果注入成功返回true, 否则返回false。

3kM28资讯网——每日最新资讯28at.com

4.注意事项

以上代码在布满实时监控检测的机器上已经不再适用于各种非法用途, 但DLL注入仍然在很多场景被用到, 例如: 软件调试、逆向工程、辅助工具开发等。上面的代码实现主要是为了分享对DLL注入的技术细节理解和参考。3kM28资讯网——每日最新资讯28at.com

3kM28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-62791-0.html利用C++的HashMap结构实现一个多DLL注入器

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 2023 年顶级前端工具,你都用了哪些呢?

下一篇: C++方差的运算:方差求解以及方差的增量计算

标签:
  • 热门焦点
  • 红魔电竞平板评测:大屏幕硬实力

    红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • Golang 中的 io 包详解:组合接口

    Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • SpringBoot中使用Cache提升接口性能详解

    SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 三言两语说透设计模式的艺术-单例模式

    三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 只需五步,使用start.spring.io快速入门Spring编程

    只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 网红炒股不为了赚钱,那就是耍流氓!

    网红炒股不为了赚钱,那就是耍流氓!

    来源:首席商业评论6月26日高调宣布入市,网络名嘴大v胡锡进居然进军了股市。在一次财经媒体峰会上,几个财经圈媒体大佬就&ldquo;胡锡进炒股是否知道认真报道&rdquo;展开讨论。有
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top