鱼C论坛

 找回密码
 立即注册
查看: 2261|回复: 4

[已解决]远程代码注入成功运行后进程异常退出

[复制链接]
发表于 2022-9-22 20:25:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
《逆向工程核心原理》里面的一个注入代码小练习。。
使用的是CreateRemoteThread,尝试注入消息框代码,注入后消息框成功显示,进程也能够正常运行。但是关闭消息框之后进程卡住,一会儿异常退出,显示线程的返回代码为0xC0000409
之前试过对X64的计算器进行代码注入,一切正常。这次是X86,就不行了。。(系统WIN10,解决方案平台X86还是X64啥的没有设置错)
跪求大佬解答
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <stdlib.h>

  4. int MsgBoxInject(int procID);
  5. int LocateProcID(char* str);

  6. typedef struct DATAPAK                //待注入的数据包
  7. {
  8.         FARPROC FuncAddr[3];        //ABC三个函数的地址
  9.         char str[4][128];                //字符串集
  10. }DATAPAK;

  11. static int CodetoInject(LPVOID DataAddr)        //待注入的代码
  12. {
  13.         DATAPAK *dat = DataAddr;
  14.         HMODULE hMod;

  15.         HMODULE(*FuncA)(char* str);                                //函数声明,A函数LoadLibraryA,B函数GetProcAddress,C函数MessageBoxA,D函数FreeLibrary。
  16.         FARPROC(*FuncB)(HMODULE hMod, char* str);
  17.         int(*FuncC)(HWND hWnd, char* str, char* strl, int style);
  18.         void(*FuncD)(HMODULE hMod);

  19.         FuncA = (void*)dat->FuncAddr[0];        //设置函数地址
  20.         FuncB = (void*)dat->FuncAddr[1];
  21.         FuncD = (void*)dat->FuncAddr[2];
  22.         hMod = FuncA(dat->str[3]);
  23.         FuncC = (void*)FuncB(hMod, dat->str[2]);

  24.         FuncC(NULL, dat->str[1], dat->str[0], MB_OK | MB_ICONERROR);
  25.         FuncD(hMod);
  26.         return 0;
  27. }

  28. static void End()
  29. {
  30.         ;
  31. }

  32. int main()
  33. {
  34.         char* str = L"TraceMe 动态分析技术";                        //窗口字符串。
  35.         printf("[INFO] 正在尝试注入消息窗口。。。\n");
  36.         int procID = 0;                                                                        //进程ID,没有设置就调用函数获取
  37.         if (!procID)        procID=LocateProcID(str);
  38.         int result = MsgBoxInject(procID);                                //注入消息框
  39.         printf("[DEBUG] result = 0x%X\n", result);

  40.         return 0;
  41. }

  42. int LocateProcID(char* str)
  43. {
  44.         HWND hWnd = 0;
  45.         UINT ProcID, ThreadID;
  46.         hWnd = FindWindowW(NULL, str);
  47.         if (hWnd)
  48.         {
  49.                 printf("[INFO] 窗口定位成功。\n");
  50.         }
  51.         ThreadID = GetWindowThreadProcessId(hWnd, &ProcID);
  52.         return ProcID;
  53. }

  54. int MsgBoxInject(int procID)
  55. {
  56.         HANDLE hProc;
  57.         HANDLE hMod;
  58.         DATAPAK dat;
  59.         LPVOID DataAddr;
  60.         LPVOID CodeAddr;
  61.         HANDLE hThread;
  62.         DWORD ExitCode=0x0;
  63.         //int result=1;
  64.         int CodeSize = (int)End - (int)CodetoInject;
  65.         printf("[INFO] 待注入的代码大小为:%dB。\n", CodeSize);


  66.         hMod = GetModuleHandleA("kernel32.dll");
  67.         dat.FuncAddr[0] = GetProcAddress(hMod, "LoadLibraryA");
  68.         dat.FuncAddr[1] = GetProcAddress(hMod, "GetProcAddress");
  69.         dat.FuncAddr[2] = GetProcAddress(hMod, "FreeLibrary");
  70.         //printf("0x%X\n", dat.FuncAddr[2]);
  71.         strcpy(dat.str[0], "未知错误");
  72.         strcpy(dat.str[1], "警告,该进程可能被注入恶意代码!");
  73.         strcpy(dat.str[2], "MessageBoxA");
  74.         strcpy(dat.str[3], "user32.dll");
  75.        
  76.         hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procID);        //打开进程
  77.         if (GetLastError()) printf("[ERROR] 获取内存读写操作权限失败,错误代码为:%d。\n", GetLastError());
  78.         else printf("[INFO] 获取内存读写操作权限成功。\n");

  79.         DataAddr = VirtualAllocEx(hProc, NULL, sizeof(DATAPAK), MEM_COMMIT, PAGE_READWRITE);        //申请内存空间
  80.         CodeAddr = VirtualAllocEx(hProc, NULL, CodeSize, MEM_COMMIT, PAGE_READWRITE);
  81.         if (GetLastError()) printf("[ERROR] 申请内存失败。异常代码为:%d\n", GetLastError());
  82.         else printf("[INFO] 申请内存成功。\n");

  83.         WriteProcessMemory(hProc, DataAddr, &dat, sizeof(DATAPAK), NULL);                                //写入内存
  84.         WriteProcessMemory(hProc, CodeAddr, CodetoInject, CodeSize, NULL);
  85.         if (GetLastError()) printf("[ERROR] 写入过程中出现异常。异常代码为:%d\n", GetLastError());
  86.         else printf("[INFO] 代码成功写入内存。\n");

  87.         hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)CodeAddr, DataAddr, 0, NULL);
  88.         if (hThread) printf("[INFO] 创建远程线程成功。\n");
  89.         else printf("[ERROR] 创建远程线程失败。\n");

  90.         WaitForSingleObject(hThread, INFINITE);
  91.         GetExitCodeThread(hThread, &ExitCode);
  92.         printf("[INFO] 进程已退出,退出码为:0x%X\n", ExitCode);
  93.         VirtualFreeEx(hProc, CodeAddr, 0, MEM_RELEASE);
  94.         VirtualFreeEx(hProc, DataAddr, 0, MEM_RELEASE);
  95.         CloseHandle(hThread);
  96.         CloseHandle(hProc);
  97.         return ExitCode;
  98. }
复制代码
最佳答案
2022-9-23 20:40:16
玛丽亚在伯大尼 发表于 2022-9-23 18:25
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败 ...

一个思路,自己写一个被注入的程序一起调试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-9-23 18:25:14 | 显示全部楼层
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-23 20:40:16 | 显示全部楼层    本楼为最佳答案   
玛丽亚在伯大尼 发表于 2022-9-23 18:25
顺便,想请教一下各位大佬,远程代码注入后如何进行调试。。(试过用OD运行然后注入代码,但是打开进程失败 ...

一个思路,自己写一个被注入的程序一起调试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 20:59:24 | 显示全部楼层
远程线程函数的参数DataAddr是指向第一个成员的地址。。所以我觉得在远程线程中使用结构体指针进行定位有点不妥。。。(结构体指针指向的好像不是第一个成员地址)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-23 21:00:56 | 显示全部楼层
jhq999 发表于 2022-9-23 20:40
一个思路,自己写一个被注入的程序一起调试

行,问题解决,感谢回复
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-23 11:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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