VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 180|回复: 4

远线程注入遇到的问题

[复制链接]
82_avatar_middle
最佳答案
0 
donate_vip 发表于 2020-3-8 03:57:28 | 显示全部楼层 |阅读模式
  1. #include <iostream>
  2. #include "stdlib.h"
  3. #include <tchar.h>
  4. #include <Windows.h>

  5. bool Inject(DWORD dwId, WCHAR* szPath)//参数1:目标进程PID  参数2:DLL路径
  6. {
  7.         //一、在目标进程中申请一个空间


  8.         /*
  9.         【1.1 获取目标进程句柄】
  10.         参数1:想要拥有的进程权限(本例为所有能获得的权限)
  11.         参数2:表示所得到的进程句柄是否可以被继承
  12.         参数3:被打开进程的PID
  13.         返回值:指定进程的句柄
  14.         */
  15.         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwId);


  16.         /*
  17.         【1.2 在目标进程的内存里开辟空间】
  18.         参数1:目标进程句柄
  19.         参数2:保留页面的内存地址,一般用NULL自动分配
  20.         参数3:欲分配的内存大小,字节单位
  21.         参数4:MEM_COMMIT:为特定的页面区域分配内存中或磁盘的页面文件中的物理存储
  22.         参数5:PAGE_READWRITE 区域可被应用程序读写
  23.         返回值:执行成功就返回分配内存的首地址,不成功就是NULL
  24.         */
  25.         LPVOID pRemoteAddress = VirtualAllocEx(
  26.                 hProcess,
  27.                 NULL,
  28.                 1,
  29.                 MEM_COMMIT,
  30.                 PAGE_READWRITE
  31.                 );

  32.         //二、 把dll的路径写入到目标进程的内存空间中

  33.         DWORD dwWriteSize = 0;
  34.         /*
  35.         【写一段数据到刚才给指定进程所开辟的内存空间里】
  36.         参数1:OpenProcess返回的进程句柄
  37.         参数2:准备写入的内存首地址
  38.         参数3:指向要写的数据的指针(准备写入的东西)
  39.         参数4:要写入的字节数(东西的长度+0/)
  40.         参数5: 返回值。返回实际写入的字节
  41.         */
  42.         WriteProcessMemory(hProcess, pRemoteAddress, szPath, wcslen(szPath) * 2 + 2, &dwWriteSize);


  43.         //三、 创建一个远程线程,让目标进程调用LoadLibrary

  44.         /*
  45.         参数1:该远程线程所属进程的进程句柄
  46.         参数2:一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结构指定了线程的安全属性
  47.         参数3:线程栈初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小
  48.         参数4:在远程进程的地址空间中,该线程的线程函数的起始地址(也就是这个线程具体要干的活儿)
  49.         参数5:传给线程函数的参数(刚才在内存里开辟的空间里面写入的东西)
  50.         参数6:控制线程创建的标志。0(NULL)表示该线程在创建后立即运行
  51.         参数7:指向接收线程标识符的变量的指针。如果此参数为NULL,则不返回线程标识符
  52.         返回值:如果函数成功,则返回值是新线程的句柄。如果函数失败,则返回值为NULL
  53.         */
  54.         HANDLE hThread = CreateRemoteThread(
  55.                 hProcess,
  56.                 NULL,
  57.                 0,
  58.                 (LPTHREAD_START_ROUTINE)LoadLibrary,
  59.                 pRemoteAddress,
  60.                 NULL,
  61.                 NULL
  62.                 );
  63.         WaitForSingleObject(hThread, -1); //当句柄所指的线程有信号的时候,才会返回

  64.         /*
  65.         四、 【释放申请的虚拟内存空间】
  66.         参数1:目标进程的句柄。该句柄必须拥有 PROCESS_VM_OPERATION 权限
  67.         参数2:指向要释放的虚拟内存空间首地址的指针
  68.         参数3:虚拟内存空间的字节数
  69.         参数4:MEM_DECOMMIT仅标示内存空间不可用,内存页还将存在。
  70.         MEM_RELEASE这种方式很彻底,完全回收。
  71.         */
  72.         VirtualFreeEx(hProcess, pRemoteAddress, 1, MEM_DECOMMIT);
  73.         return 0;
  74. }


  75. int _tmain(int argc, _TCHAR * argv[])
  76. {
  77.         wchar_t wStr[] = L"E:\\code\\CreateRemoteThread\\DLL\\Debug\\DLL.dll";
  78.         DWORD dwId = 0;

  79.         //参数1:(NULL
  80.         //参数2:目标窗口的标题
  81.         //返回值:目标窗口的句柄
  82.         HWND hCalc = FindWindow(NULL, L"QQ");
  83.         printf("目标窗口的句柄为:%d\n", hCalc);

  84.         DWORD dwPid = 0;

  85.         //参数1:目标进程的窗口句柄
  86.         //参数2:把目标进程的PID存放进去
  87.         DWORD dwRub = GetWindowThreadProcessId(hCalc, &dwPid);
  88.         printf("目标窗口的进程PID为:%d\n", dwPid);

  89.         //参数1:目标进程的PID
  90.         //参数2:想要注入DLL的路径
  91.         Inject(dwPid, wStr);

  92.         return 0;
  93. }
复制代码


当我用LoadLibrary导入DLL的时候如果我dll通过dllmain.cpp这里生成的.dll文件导入就可以成功注入到qq进程
但是我自己创建空项目生成的.dll文件就无法注入到qq进程当中,dll文件路径设置正确的
.cpp文件
  1. #include <Windows.h>
  2. #include "DLL.h"
  3. #include <stdlib.h>
  4. void Ject()
  5. {
  6.         MessageBox(NULL, L"test", L"Test", MB_OKCANCEL);
  7.         system("pause");
  8. }
复制代码

.h文件
  1. #pragma once
  2. extern "C" _declspec(dllexport) void Ject();
复制代码


12.png




上一篇:谁有win驱动模板啊 winxp的 应该是7600
下一篇:这个要怎么办啊
82_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-8 21:16:36 | 显示全部楼层
Syc 发表于 2020-3-8 13:43
楼主是通过什么判断你的DLL是否注入到QQ进程的?
如果 Ject 是作为导出函数的话,那么必须在进程中调用 ...

原来如此,注入到其中要调用才行,明白了,感谢
51_avatar_middle
最佳答案
82 
online_admins 发表于 2020-3-8 08:11:33 | 显示全部楼层
当我用LoadLibrary导入DLL的时候如果我dll通过dllmain.cpp这里生成的.dll文件导入就可以成功注入到qq进程
但是我自己创建空项目生成的.dll文件就无法注入到qq进程当中,dll文件路径设置正确的

没太懂楼主的意思。。。自己创建空项目生成的.dll文件,这个是什么意思?
82_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-3-8 12:42:59 | 显示全部楼层
Syc 发表于 2020-3-8 08:11
当我用LoadLibrary导入DLL的时候如果我dll通过dllmain.cpp这里生成的.dll文件导入就可以成功注入到qq进程
...

就是我那个注入代码,需要dll文件路径嘛,我dll代码就是messagebox弹窗。我想注入到qq进程。

如果我把messagebox代码写在自己创建空文件通过extern "C" _declspec(dllexport) void Ject();导出的DLL就无法注入进去,

但是我写DLL的时候直接写在maindll.cpp的
switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
                MessageBoxA(NULL, "一寸一叶\n", "by 一寸一叶", MB_OKCANCEL);
我在这里面编译生成的DLL文件,就能注入进去
51_avatar_middle
最佳答案
82 
online_admins 发表于 2020-3-8 13:43:50 | 显示全部楼层
yicunyiye 发表于 2020-3-8 12:42
就是我那个注入代码,需要dll文件路径嘛,我dll代码就是messagebox弹窗。我想注入到qq进程。

如果我把 ...

楼主是通过什么判断你的DLL是否注入到QQ进程的?
如果 Ject 是作为导出函数的话,那么必须在进程中调用才能弹窗,默认被其他进程加载的话是不调用的
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-26 05:47

Powered by CcTry.CoM

© 2009-2020 cctry.com

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