看流星社区

 找回密码
 注册账号
查看: 2238|回复: 1

C++ APC注入源码

[复制链接]

该用户从未签到

发表于 2019-7-29 16:52:21 | 显示全部楼层 |阅读模式


  1. #include "stdafx.h"

  2. #define _WIN32_WINNT 0x0400

  3. #include <windows.h>

  4. #include <TlHelp32.h>

  5. #include <iostream>

  6. #include <string>

  7. using namespace std;


  8. #define DEF_BUF_SIZE 1024


  9. // 用于存储注入模块DLL的路径全名

  10. char szDllPath[DEF_BUF_SIZE] = {0} ;


  11. // 使用APC机制向指定ID的进程注入模块

  12. BOOL InjectModuleToProcessById ( DWORD dwProcessId )

  13. {

  14. DWORDdwRet = 0 ;

  15. BOOLbStatus = FALSE ;

  16. LPVOIDlpData = NULL ;

  17. UINTuLen = strlen(szDllPath) + 1;

  18. // 打开目标进程

  19. HANDLE hProcess = OpenProcess ( PROCESS_ALL_ACCESS, FALSE, dwProcessId ) ;

  20. if ( hProcess )

  21. {

  22. // 分配空间

  23. lpData = VirtualAllocEx ( hProcess, NULL, uLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE ) ;

  24. if ( lpData )

  25. {

  26. // 写入需要注入的模块路径全名

  27. bStatus = WriteProcessMemory ( hProcess, lpData, szDllPath, uLen, &dwRet ) ;

  28. }

  29. CloseHandle ( hProcess ) ;

  30. }


  31. if ( bStatus == FALSE )

  32. return FALSE ;


  33. // 创建线程快照

  34. THREADENTRY32 te32 = { sizeof(THREADENTRY32) } ;

  35. HANDLE hThreadSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPTHREAD, 0 ) ;

  36. if ( hThreadSnap == INVALID_HANDLE_VALUE )

  37. return FALSE ;


  38. bStatus = FALSE ;

  39. // 枚举所有线程

  40. if ( Thread32First ( hThreadSnap, &te32 ) )

  41. {

  42. do{

  43. // 判断是否目标进程中的线程

  44. if ( te32.th32OwnerProcessID == dwProcessId )

  45. {

  46. // 打开线程

  47. HANDLE hThread = OpenThread ( THREAD_ALL_ACCESS, FALSE, te32.th32ThreadID ) ;

  48. if ( hThread )

  49. {

  50. // 向指定线程添加APC

  51. DWORD dwRet = QueueUserAPC ( (PAPCFUNC)LoadLibraryA, hThread, (ULONG_PTR)lpData ) ;

  52. if ( dwRet > 0 )

  53. bStatus = TRUE ;

  54. CloseHandle ( hThread ) ;

  55. }

  56. }


  57. }while ( Thread32Next ( hThreadSnap, &te32 ) ) ;

  58. }


  59. CloseHandle ( hThreadSnap ) ;

  60. return bStatus;

  61. }


  62. int _tmain(int argc, _TCHAR* argv[])

  63. {

  64. // 取得当前工作目录路径

  65. GetCurrentDirectoryA ( DEF_BUF_SIZE, szDllPath ) ;


  66. // 生成注入模块DLL的路径全名

  67. strcat_s ( szDllPath, "\\fddll" ) ;


  68. DWORD dwProcessId = 0 ;

  69. // 接收用户输入的目标进程ID

  70. while ( cout << "请输入目标进程ID:" && cin >> dwProcessId && dwProcessId > 0 )

  71. {

  72. BOOL bRet = InjectModuleToProcessById ( dwProcessId ) ;

  73. cout << (bRet ? "注入成功!":"注入失败!") << endl ;

  74. }

  75. return 0;

  76. }
复制代码

该用户从未签到

发表于 2019-8-8 19:41:34 | 显示全部楼层
过来转转,我只是路过打酱油的。
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-24 23:07

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

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