当前位置:   article > 正文

无模块注入示例

无模块注入

原出处不详,作者见谅。

  1. #include <Windows.h>
  2. typedef struct _REMOTE_PARAMETERS
  3. {
  4. HWND hwnd;
  5. LPSTR lpszText;
  6. LPSTR lpszCaption;
  7. int nType;
  8. }REMOTE_PARAMETERS,*PREMOTE_PARAMETERS;
  9. //提升权限
  10. BOOL GetdebugPrivilege()
  11. {
  12. BOOL bResult = FALSE;
  13. HANDLE hToken;
  14. TOKEN_PRIVILEGES TokenPrivileges;
  15. if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken))
  16. {
  17. TokenPrivileges.PrivilegeCount = 1;
  18. LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &TokenPrivileges.Privileges[0].Luid);
  19. TokenPrivileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
  20. bResult = AdjustTokenPrivileges(hToken, FALSE, &TokenPrivileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL);
  21. CloseHandle(hToken);
  22. }
  23. return bResult;
  24. }
  25. int _tmain(int argc, _TCHAR* argv[])
  26. {
  27. DWORD dwoffset = 0;
  28. DWORD dwsize = 0;
  29. _asm jmp LOOP2
  30. _asm
  31. {
  32. LOOP1:
  33. mov eax,[esp+4] //取地址,即指向PREMOTE_PARAMETERS的指针
  34. mov ebx,[eax + 0xC]
  35. push ebx
  36. mov ebx,[eax+8]
  37. push ebx
  38. mov ebx,[eax+4]
  39. push ebx
  40. mov ebx,dword ptr[eax]
  41. push ebx
  42. mov eax, 0X75c4ea71 //硬编码 MessageBoxA函数地址
  43. push 0X77490571 //硬编码 ExitThread函数地址
  44. push eax
  45. ret
  46. // 最后两个PUSH的意思是汇编的一些技巧
  47. // 先PUSH ExitThread的地址,再PUSH MessageBoxA的地址
  48. // ret 是让调用者进行堆栈平衡,所以ret后,堆栈只POP最上面一个地址(即MessageBoxA)
  49. // 也就是跳转到MessageBoxA,此时堆栈中的数据和正常调用MessageBoxA是一致的
  50. // 最上面的返回地址是ExitThread
  51. // MessageBoxA调用结束,跳转到ExitThread中。
  52. LOOP2:
  53. lea eax, LOOP1
  54. mov dwoffset, eax
  55. lea eax, LOOP2
  56. sub eax, offset LOOP1
  57. mov dwsize, eax
  58. }
  59. //GetdebugPrivilege();
  60. DWORD dwThreadId;
  61. DWORD dwNumberOfBytesWritten;
  62. PREMOTE_PARAMETERS lpParamaters = new REMOTE_PARAMETERS;
  63. // initialize lpParamaters
  64. memset(lpParamaters,0,sizeof(REMOTE_PARAMETERS));
  65. // get handle of target process
  66. HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,16420); //进程ID
  67. // 在目标进程中分配300字节的空间
  68. LPVOID lpszDes = VirtualAllocEx(hProcess,
  69. 0,
  70. 300,
  71. MEM_COMMIT,
  72. PAGE_EXECUTE_READWRITE);
  73. printf("lpszDes: 0x%X\n", lpszDes);
  74. // 向目标进程中写入汇编指令,起始地址为lpszDes,大小为100
  75. WriteProcessMemory(hProcess,
  76. lpszDes,
  77. (char*)dwoffset,
  78. 100,
  79. &dwNumberOfBytesWritten); //写入代码
  80. // 向目标进程中写入字符串数据,起始地址为lpszDes + 100,大小为100
  81. WriteProcessMemory(hProcess,
  82. ((char*)lpszDes + 100),
  83. "Hello QQ\r\n",
  84. 100,
  85. &dwNumberOfBytesWritten); //写入弹出字符串
  86. lpParamaters->hwnd = 0;
  87. lpParamaters->lpszText = (LPSTR)((char*)lpszDes + 100);
  88. lpParamaters->lpszCaption = (LPSTR)((char*)lpszDes + 100);
  89. lpParamaters->nType = MB_OKCANCEL|MB_ICONQUESTION;
  90. // 向目标进程中写入MessageBox的参数,起始地址为lpszDes + 200,大小为结构体大小
  91. WriteProcessMemory(hProcess,
  92. ((char*)lpszDes + 200),
  93. lpParamaters,
  94. sizeof(REMOTE_PARAMETERS),
  95. &dwNumberOfBytesWritten); //写入参数
  96. // 在目标进程中执行刚刚注入的代码
  97. HANDLE hRemoteThread = CreateRemoteThread(hProcess,
  98. NULL,
  99. 0,
  100. (LPTHREAD_START_ROUTINE)(lpszDes),
  101. ((char*)lpszDes + 200),
  102. NULL,
  103. &dwThreadId);
  104. WaitForSingleObject(hRemoteThread,INFINITE);
  105. VirtualFreeEx(hProcess, lpszDes, 0, MEM_RELEASE);
  106. system("pause");
  107. return 0;
  108. }


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/204217
推荐阅读
相关标签
  

闽ICP备14008679号