WeChats.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // WeChats.cpp : 定义应用程序的类行为。
  2. //
  3. #include "stdafx.h"
  4. #include "WeChats.h"
  5. #include "WeChatsDlg.h"
  6. #include "Injection.h"
  7. #ifdef _DEBUG
  8. #define new DEBUG_NEW
  9. #endif
  10. // CWeChatsApp
  11. BEGIN_MESSAGE_MAP(CWeChatsApp, CWinAppEx)
  12. ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
  13. END_MESSAGE_MAP()
  14. // CWeChatsApp 构造
  15. CWeChatsApp::CWeChatsApp()
  16. {
  17. // TODO: 在此处添加构造代码,
  18. // 将所有重要的初始化放置在 InitInstance 中
  19. }
  20. // 唯一的一个 CWeChatsApp 对象
  21. CWeChatsApp theApp;
  22. // CWeChatsApp 初始化
  23. //////////////////////////////////////////////////////////////////////////
  24. // BEGIN
  25. // killWeChatMutex函数用到的未公开的声明;
  26. typedef ULONG PPS_POST_PROCESS_INIT_ROUTINE;
  27. // 以下声明,都是系统未公开的定义;
  28. //
  29. typedef enum {
  30. ProcessBasicInformation = 0,
  31. ProcessDebugPort = 7,
  32. ProcessWow64Information = 26,
  33. ProcessImageFileName = 27,
  34. ProcessBreakOnTermination = 29,
  35. ProcessProtectionInformation = 61,
  36. }PROCESSINFOCLASS;
  37. typedef struct _PEB_LDR_DATA {
  38. BYTE Reserved1[8];
  39. PVOID Reserved2[3];
  40. LIST_ENTRY InMemoryOrderModuleList;
  41. } PEB_LDR_DATA, *PPEB_LDR_DATA;
  42. typedef struct _LDR_DATA_TABLE_ENTRY {
  43. PVOID Reserved1[2];
  44. LIST_ENTRY InMemoryOrderLinks;
  45. PVOID Reserved2[2];
  46. PVOID DllBase;
  47. PVOID EntryPoint;
  48. PVOID Reserved3;
  49. UNICODE_STRING FullDllName;
  50. BYTE Reserved4[8];
  51. PVOID Reserved5[3];
  52. union {
  53. ULONG CheckSum;
  54. PVOID Reserved6;
  55. };
  56. ULONG TimeDateStamp;
  57. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
  58. typedef struct _RTL_USER_PROCESS_PARAMETERS {
  59. BYTE Reserved1[16];
  60. PVOID Reserved2[10];
  61. UNICODE_STRING ImagePathName;
  62. UNICODE_STRING CommandLine;
  63. } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
  64. // 32位下的结构;
  65. typedef struct _PEB {
  66. BYTE Reserved1[2];
  67. BYTE BeingDebugged;
  68. BYTE Reserved2[1];
  69. PVOID Reserved3[2];
  70. PPEB_LDR_DATA Ldr;
  71. PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
  72. PVOID Reserved4[3];
  73. PVOID AtlThunkSListPtr;
  74. PVOID Reserved5;
  75. ULONG Reserved6;
  76. PVOID Reserved7;
  77. ULONG Reserved8;
  78. ULONG AtlThunkSListPtr32;
  79. PVOID Reserved9[45];
  80. BYTE Reserved10[96];
  81. PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  82. BYTE Reserved11[128];
  83. PVOID Reserved12[1];
  84. ULONG SessionId;
  85. } PEB, *PPEB;
  86. // 64位下的结构;
  87. typedef struct _PEBX64 {
  88. BYTE Reserved1[2];
  89. BYTE BeingDebugged;
  90. BYTE Reserved2[21];
  91. PPEB_LDR_DATA LoaderData;
  92. PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
  93. BYTE Reserved3[520];
  94. PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  95. BYTE Reserved4[136];
  96. ULONG SessionId;
  97. } PEBX64;
  98. typedef struct _PROCESS_BASIC_INFORMATION {
  99. PVOID Reserved1;
  100. PPEB PebBaseAddress;
  101. PVOID Reserved2[2];
  102. ULONG_PTR UniqueProcessId;
  103. PVOID Reserved3;
  104. } PROCESS_BASIC_INFORMATION;
  105. // 声音函数指针;
  106. typedef NTSTATUS (WINAPI *pfZwQueryInformationProcess)(
  107. _In_ HANDLE ProcessHandle,
  108. _In_ PROCESSINFOCLASS ProcessInformationClass,
  109. _Out_ PVOID ProcessInformation,
  110. _In_ ULONG ProcessInformationLength,
  111. _Out_opt_ PULONG ReturnLength
  112. );
  113. // END
  114. //////////////////////////////////////////////////////////////////////////
  115. NTSTATUS GetProcessModules(HANDLE hProcess, LPCTSTR lpTypName, LPCTSTR lpName)
  116. {
  117. NTSTATUS Status = 0;
  118. pfZwQueryInformationProcess ZwQueryInformationProcess = NULL;
  119. PROCESS_BASIC_INFORMATION ProcessInfo;
  120. PPEB pPeb;
  121. ZwQueryInformationProcess = (pfZwQueryInformationProcess)GetProcAddress(GetModuleHandle(_T("ntdll.dll")), "ZwQueryInformationProcess");
  122. if (ZwQueryInformationProcess == NULL)
  123. {
  124. WriteTextLog(_T("查找进程模块名称失败"));
  125. return Status;
  126. }
  127. Status = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &ProcessInfo, sizeof(ProcessInfo), NULL);
  128. if (NT_SUCCESS(Status))
  129. {
  130. pPeb = (PPEB)ProcessInfo.PebBaseAddress;
  131. for (PLIST_ENTRY pListEntry = pPeb->Ldr->InMemoryOrderModuleList.Flink;pListEntry != &pPeb->Ldr->InMemoryOrderModuleList;pListEntry = pListEntry->Flink)
  132. {
  133. //PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY, pListEntry);
  134. //wprintf(L"%s\n", pEntry->FullDllName.Buffer);
  135. WriteTextLog(_T("模块名称"));
  136. }
  137. }
  138. else
  139. WriteTextLog(_T("查找进程模块名称失败1"));
  140. CloseHandle(hProcess);
  141. return Status;
  142. }
  143. BOOL CWeChatsApp::InitInstance()
  144. {
  145. // 如果一个运行在 Windows XP 上的应用程序清单指定要
  146. // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
  147. //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
  148. INITCOMMONCONTROLSEX InitCtrls;
  149. InitCtrls.dwSize = sizeof(InitCtrls);
  150. // 将它设置为包括所有要在应用程序中使用的
  151. // 公共控件类。
  152. InitCtrls.dwICC = ICC_WIN95_CLASSES;
  153. InitCommonControlsEx(&InitCtrls);
  154. CWinAppEx::InitInstance();
  155. AfxEnableControlContainer();
  156. // 获取配置信息;
  157. GetIniInfo();
  158. GetDebugPriv();
  159. // HANDLE hObject = CreateMutex(NULL, FALSE, _T("CYLGLAppXiao"));
  160. // if (GetLastError() == ERROR_ALREADY_EXISTS)
  161. // {
  162. // return FALSE;
  163. // }
  164. // GetProcessModules(::GetCurrentProcess(), _T("Mutant"), _T("_WeChat_Instance_Identity_Mutex_Name"));
  165. // int nCount = 3;
  166. // getWeChatPath();
  167. // for (int i = 0; i < nCount; i++)
  168. // OpenWeChat();
  169. TCHAR szDllPath[MAX_PATH];
  170. ZeroMemory(szDllPath,MAX_PATH);
  171. DWORD ss = sizeof(szDllPath);
  172. DWORD sss = _tcslen(szDllPath)*sizeof(TCHAR);
  173. _stprintf_s(szDllPath, _T("%shook.dll"), g_szModulePath);
  174. vector<DWORD> vtPID = FindAllProcess(WECHAT);
  175. if (vtPID.size() != 0 )
  176. {
  177. vector<DWORD>::iterator it = vtPID.begin();
  178. //for (int i = 0; i < 1; i++)
  179. for (;it != vtPID.end(); it++)
  180. {
  181. CInjection inject(*it,szDllPath);
  182. inject.InjectDynamicLibrary();
  183. Sleep(3000);
  184. inject.EjectDynamicLibrary();
  185. }
  186. }
  187. // 标准初始化
  188. // 如果未使用这些功能并希望减小
  189. // 最终可执行文件的大小,则应移除下列
  190. // 不需要的特定初始化例程
  191. // 更改用于存储设置的注册表项
  192. // TODO: 应适当修改该字符串,
  193. // 例如修改为公司或组织名
  194. SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
  195. CWeChatsDlg dlg;
  196. m_pMainWnd = &dlg;
  197. INT_PTR nResponse = dlg.DoModal();
  198. if (nResponse == IDOK)
  199. {
  200. // TODO: 在此放置处理何时用
  201. // “确定”来关闭对话框的代码
  202. }
  203. else if (nResponse == IDCANCEL)
  204. {
  205. // TODO: 在此放置处理何时用
  206. // “取消”来关闭对话框的代码
  207. }
  208. // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
  209. // 而不是启动应用程序的消息泵。
  210. return FALSE;
  211. }