查看: 3657|回复: 0

C语言编写的DLL注入工具源代码

[复制链接]
       
灌水成绩
主题
帖子
积分
等级头衔
ID:112405
等级:勇者魔法师
头衔:易语言霸主Ysjt、凌何
积分成就
威望:70
贡献:0
种子:6
在线时间:181 小时
注册时间:2019-6-5
最后登录:2023-12-30
勋章

萌新普通会员小哥哥源码大师破解大师黄金会员百万富豪主题王在线达人全能王灌水之王热心肠问题少年安全之心

联系方式
发表于 2019-6-14 22:29:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x

C语言编写的DLL注入工具源代码

C语言编写的DLL注入工具源代码 C语言源代码,C语言70源代码,TC辅助网www.tcsq1.com2673



注入方式使用的是代码注入,参考了《逆向工程核心原理》中的相关代码。代码注入占用内存少并难以查找痕迹,在代码量小的时候比较合适。

不过这边有一个问题就是在执行用户选择的启动函数时我
  1. // 参数类型
  2. typedef struct _INJECTTHREAD_PARAM
  3. {
  4.         FARPROC pFunc[3];
  5.         char szBuf[2][128];
  6. } INJECTTHREAD_PARAM, *PINJECTTHREAD_PARAM;

  7. // 此函数以代码形式注入目标进程
  8. DWORD WINAPI InjectThreadProc(LPVOID param)
  9. {
  10.         PINJECTTHREAD_PARAM pParam = (PINJECTTHREAD_PARAM)param;
  11.         HMODULE hModule;
  12.         FARPROC pFunc;
  13.         HANDLE hThread;

  14.         // 注入的代码里不能直接调用API函数
  15.         // LoadLibraryA(szDllPath)
  16.         hModule = ((PFLOADLIBRARYA)pParam->pFunc[0])(pParam->szBuf[0]);
  17.         if (!hModule)
  18.         {
  19.                 return 1;
  20.         }

  21.         // GetProcAddress(hModule, szFunc)
  22.         pFunc = ((PFGETPROCADDRESS)pParam->pFunc[1])(hModule, pParam->szBuf[1]);
  23.         if (!pFunc)
  24.         {
  25.                 return 1;
  26.         }

  27.         // CreateThread()执行加载时要运行的函数, 不知道使用这种方式合不合适
  28.         hThread = ((PFCREATETHREAD)pParam->pFunc[2])(NULL, 0, (LPTHREAD_START_ROUTINE)pFunc, NULL, 0, NULL);

  29.         return 0;
  30. }

  31. BOOL InjectDll(DWORD dwPID, LPCSTR szDllPath, LPCSTR szFunc)
  32. {
  33.         HMODULE hModule;
  34.         INJECTTHREAD_PARAM param;
  35.         HANDLE hProcess;
  36.         HANDLE hThread;
  37.         LPVOID pRemoteBuf[2];
  38.         DWORD dwSize;

  39.         hModule = GetModuleHandleW(L"kernel32.dll");
  40.         memset(¶m, 0, sizeof(INJECTTHREAD_PARAM));
  41.         // 要进行代码注入, 就必需要把要调用参数先写入目标进程
  42.         param.pFunc[0] = GetProcAddress(hModule, "LoadLibraryA");
  43.         param.pFunc[1] = GetProcAddress(hModule, "GetProcAddress");
  44.         param.pFunc[2] = GetProcAddress(hModule, "CreateThread");
  45.         strcpy_s(param.szBuf[0], strlen(szDllPath) + 1, szDllPath);
  46.         strcpy_s(param.szBuf[1], strlen(szFunc) + 1, szFunc);

  47.         if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)))
  48.         {
  49.                 return FALSE;
  50.         }

  51.         // 判断环境
  52.         if (Is64BitProcess(GetCurrentProcess()) != Is64BitProcess(hProcess))
  53.         {
  54.                 MessageBox(NULL, TEXT("打开动态链接库文件失败"), TEXT("提示"), MB_ICONERROR | MB_OK);
  55.                 CloseHandle(hProcess);
  56.                 return FALSE;
  57.         }

  58.         dwSize = sizeof(INJECTTHREAD_PARAM);
  59.         if (!(pRemoteBuf[0] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_READWRITE)))
  60.         {
  61.                 return FALSE;
  62.         }
  63.         // 将全部的参数作为结构体整个写入
  64.         if (!WriteProcessMemory(hProcess, pRemoteBuf[0], (LPVOID)¶m, dwSize, NULL))
  65.         {
  66.                 return FALSE;
  67.         }

  68.         dwSize = (DWORD)InjectDll - (DWORD)InjectThreadProc;
  69.         if (!(pRemoteBuf[1] = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE)))
  70.         {
  71.                 return FALSE;
  72.         }
  73.         // 再将InjectThreadProc的函数代码写入目标进程
  74.         if (!WriteProcessMemory(hProcess, pRemoteBuf[1], (LPVOID)InjectThreadProc, dwSize, NULL))
  75.         {
  76.                 return FALSE;
  77.         }

  78.         // pRemoteBuf[1]就是InjectThreadProc在目标进程中的起始地址, 已经被写入, pRemoteBuf[0]则是写入的参数地址
  79.         if (!(hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)pRemoteBuf[1], pRemoteBuf[0], 0, NULL)))
  80.         {
  81.                 return FALSE;
  82.         }

  83.         WaitForSingleObject(hThread, INFINITE);

  84.         VirtualFreeEx(hProcess, pRemoteBuf[0], 0, MEM_RELEASE);
  85.         VirtualFreeEx(hProcess, pRemoteBuf[1], 0, MEM_RELEASE);

  86.         CloseHandle(hThread);
  87.         CloseHandle(hProcess);

  88.         return TRUE;
  89. [align=left]
  90. }
复制代码

选择让目标进程使用CreateThread来调用dll的导出函数,这样做是否合适?测试了一些暂时还没发现什么问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|TC辅助网 |网站地图

GMT+8, 2024-11-10 10:19 , Processed in 0.074417 second(s), 27 queries , MemCached On.

powered by 屠城社区! X3.4

© 2001-2019 屠城辅助网.

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