找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7782|回复: 1

[分享] 创建远程线程,稍稍修改即可实现远程DLL注入

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2010-1-27 21:06:42 | 显示全部楼层 |阅读模式
本文写的很好,有一个小的笔误我已经更正过来了,原文出处已经找不到啦~~~~
另外提出一个问题,如果咱不Load user32.dll,咱Load一个自定义的Dll,然后让他运行自定义的Dll中的代码,可以吗?
开始满怀信心的写代码了,写好了,发现他总是崩溃,搞的我都快崩溃了,后来想想了,自定义的DLL是不能这样注入的。因为如果目标程序没有加载自定义的DLL的话,那个通过GetProcessAddress得到的地址是无效的,肯定会崩溃。
所以实现远程的DLL注入的DLL是经过精心设计的,在DllMain函数的 初始化里写要注入的代码。因为LoadLibrary这个DLL后就会执行这些代码,从而达到DLL注入的目的。
  1. 创建远程线程

  2. // _remotethreaddemo.cpp : Defines the entry point for the console application.
  3. // Author:秋镇菜

  4. #include "stdafx.h"
  5. #include "windows.h"


  6. // ========== 定义一个代码结构,本例为一个对话框============
  7. struct MyData
  8. {
  9. char sz[64]; // 对话框显示内容
  10. DWORD dwMessageBox; // 对话框的地址
  11. };

  12. // ========== 远程线程的函数 ==============================
  13. DWORD __stdcall RMTFunc(MyData *pData)
  14. {
  15. typedef int(__stdcall*MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT);
  16. MMessageBox MsgBox = (MMessageBox)pData->dwMessageBox;
  17. MsgBox(NULL, pData->sz, NULL, MB_OK);
  18. return 0;
  19. }
  20. int main(int argc, char* argv[])
  21. {
  22. // ===== 获得需要创建REMOTETHREAD的进程句柄 ===============================
  23. HWND hWnd = FindWindow("notepad", NULL); // 以NOTEPAD为例 //此处加一些返回值的判断会更好一些
  24. DWORD dwProcessId;
  25. ::GetWindowThreadProcessId(hWnd, &dwProcessId);
  26. HANDLE hProcess = OpenProcess(
  27. PROCESS_ALL_ACCESS,
  28. FALSE,
  29. dwProcessId);

  30. // ========= 代码结构 ================================================
  31. MyData data;
  32. ZeroMemory(&data, sizeof (MyData));
  33. strcat(data.sz, "对话框的内容.");
  34. HINSTANCE hUser = LoadLibrary("user32.dll");
  35. if (! hUser)
  36. {
  37. printf("Can not load library.\n");
  38. return 0;
  39. }
  40. data.dwMessageBox = (DWORD)GetProcAddress(hUser, "MessageBoxA");
  41. FreeLibrary(hUser);
  42. if (! data.dwMessageBox)
  43. return 0;

  44. // ======= 分配空间 ===================================================
  45. void *pRemoteThread
  46. = VirtualAllocEx(hProcess, 0,
  47. 1024*4, MEM_COMMIT|MEM_RESERVE,
  48. PAGE_EXECUTE_READWRITE);
  49. if (! pRemoteThread)
  50. return 0;
  51. if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, 1024*4, 0))
  52. return 0;

  53. MyData *pData
  54. = (MyData*)VirtualAllocEx(hProcess, 0,
  55. sizeof (MyData), MEM_COMMIT,
  56. PAGE_READWRITE);
  57. if (!pData)
  58. return 0;

  59. if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0))
  60. return 0;

  61. // =========== 创建远程线程 ===========================================
  62. HANDLE hThread
  63. = CreateRemoteThread(hProcess, 0,
  64. 0, (LPTHREAD_START_ROUTINE)pRemoteThread,
  65. pData, 0, 0);
  66. if (! hThread)
  67. {
  68. printf("远程线程创建失败");
  69. return 0;
  70. }
  71. CloseHandle(hThread);//这个CloseHandle是不会关掉远程线程的,TerminateThread能关掉
  72. VirtualFreeEx(hProcess, pRemoteThread, 1024*4, MEM_RELEASE);
  73. VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE);
  74. CloseHandle(hProcess);
  75. printf("Hello World!\n");
  76. return 0;
  77. }
复制代码
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

1

主题

3

回帖

0

精华

初来乍到

积分
18
发表于 2012-6-2 03:47:15 | 显示全部楼层
杰哥啊 能带下么???
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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