龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 4300|回复: 1

远程线程实现DLL注入和shellcode注入以及OD调试原理

[复制链接]

7

主题

2

回帖

11

积分

编程入门

Rank: 1

龙马币
19

远程线程:
  1. #include<windows.h>
  2. #include<stdio.h>

  3. //函数地址:00C31740
  4. int main() {
  5.         
  6.         HANDLE hThread;
  7.         HANDLE hProcess;

  8.         // 1、得到要在其进程中创建线程的进程句柄
  9.         hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,10940);

  10.         if (hProcess == NULL) {
  11.                 OutputDebugString("OpenProcess fail");
  12.                 return -1;
  13.         }
  14.         // 2、通过进程句柄创建线程
  15.         hThread = CreateRemoteThread(
  16.                 hProcess,
  17.                 NULL,  //获取默认的安全描述符,当前用户的令牌权限
  18.                 0,  //使用可执行文件的默认大小
  19.                 (LPTHREAD_START_ROUTINE)0x010817E0,  // 创建线程调用的函数
  20.                 NULL,  // 传递函数中的参数
  21.                 0, //线程在创建后立即运行
  22.                 NULL // 不返回线程标识符
  23.         );

  24.         if (hThread == NULL) {
  25.                 OutputDebugString("CreateRemoteThread fail");
  26.                 CloseHandle(hProcess);
  27.                 return -1;
  28.         }

  29.         printf("线程启动!\n");

  30.         // 3、释放资源
  31.         CloseHandle(hThread);
  32.         getchar(); //进行堵塞
  33.         return 0;

  34. }
复制代码

远程线程注入:
  1. #include<Windows.h>
  2. #include<Tlhelp32.h>
  3. #include<stdio.h>
  4. /*
  5. 远程线程注入
  6. 代码写的不太严谨,大家谅解
  7. */

  8. DWORD GetOneProcessPid(const char *FileName) {
  9.         HANDLE hSnapShot;
  10.         PROCESSENTRY32 pro32;

  11.         pro32.dwSize = sizeof(PROCESSENTRY32);
  12.         // 1、获得当前进程的快照

  13.         hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

  14.         if (hSnapShot == INVALID_HANDLE_VALUE) {
  15.                 return -1;
  16.         }

  17.         bool bMore;
  18.         // 2、遍历进程的名称是否为指定名称,获取指定进程名称的PID
  19.         bMore = Process32First(hSnapShot, &pro32);
  20.         while (bMore) {
  21.                 // 3、获取指定进程名称的PID
  22.                 if (!strcmp(pro32.szExeFile, FileName)) {
  23.                         return pro32.th32ProcessID;
  24.                 }
  25.                 bMore = Process32Next(hSnapShot, &pro32);                  //遍历
  26.         }

  27.         // 4、释放资源
  28.         CloseHandle(hSnapShot);

  29.         return 0;
  30. }
  31. DWORD WINAPI ThreadProc(LPVOID lpParameter) {
  32.         return 0;
  33. }

  34. bool LoadDll(DWORD ProcessPid,const char *DllPath) {
  35.         HANDLE hProcess;
  36.         DWORD DllPathLen;
  37.         PDWORD addr;
  38.         HMODULE hModule;
  39.         PDWORD FuncAddr;

  40.         // 1、获取要注入进程的句柄
  41.         hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, ProcessPid);
  42.         if (hProcess == NULL) {
  43.                 return false;
  44.         }

  45.         // 2、获取DLL的信息
  46.         DllPathLen = strlen(DllPath) + 1; //+1的原因结尾需要\0 结尾

  47.         // 3、申请指定进程中的内存
  48.         addr = (PDWORD)VirtualAllocEx(
  49.                 hProcess, //申请指定进程的句柄
  50.                 NULL,  // 安全描述符
  51.                 DllPathLen,  // 申请内存的字节大小
  52.                 MEM_COMMIT,  //
  53.                 PAGE_READWRITE // 内存的属性
  54.         );

  55.         printf("%x", addr);

  56.         // 4、将DLL的信息写入到要注入的进程内存中
  57.         WriteProcessMemory(hProcess, addr, DllPath, DllPathLen, NULL);

  58.         // 5、要获取其进程的LoadLibraryA/W的函数地址,该函数保存在系统中的Kernel32.dll中,那么需要先获得Kernel32.dll的句柄
  59.         hModule = GetModuleHandle("Kernel32.dll");

  60.         // 6、从中获得LoadLibraryA/W的函数地址
  61.         FuncAddr = (PDWORD)GetProcAddress(hModule, "LoadLibraryA"); //返回值为函数地址
  62.         
  63.         // 7、注入到指定进程中进行加载内存中申请的DLL信息,把LoadLibraryA的地址作为函数 来加载addr,也就是DLL的路径
  64.         CreateRemoteThread(hProcess, NULL, 0, LPTHREAD_START_ROUTINE(FuncAddr), addr, 0, NULL);
  65.         
  66.         return true;
  67. }

  68. int main() {
  69.         LoadDll(GetOneProcessPid("x.exe"),"C:\\Users\\dell\\Desktop\\test\\DLL2.dll");
  70.         return 0;
  71. }
复制代码

游客,如果您要查看本帖隐藏内容请回复


0

主题

9

回帖

9

积分

编程入门

Rank: 1

龙马币
1
710774265 | 显示全部楼层
好好学习天天向上
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表