WeChats.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  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. typedef enum {
  29. ProcessBasicInformation = 0,
  30. ProcessDebugPort = 7,
  31. ProcessWow64Information = 26,
  32. ProcessImageFileName = 27,
  33. ProcessBreakOnTermination = 29,
  34. ProcessProtectionInformation = 61,
  35. }PROCESSINFOCLASS;
  36. typedef struct _PEB_LDR_DATA {
  37. BYTE Reserved1[8];
  38. PVOID Reserved2[3];
  39. LIST_ENTRY InMemoryOrderModuleList;
  40. } PEB_LDR_DATA, *PPEB_LDR_DATA;
  41. typedef struct _LDR_DATA_TABLE_ENTRY {
  42. PVOID Reserved1[2];
  43. LIST_ENTRY InMemoryOrderLinks;
  44. PVOID Reserved2[2];
  45. PVOID DllBase;
  46. PVOID EntryPoint;
  47. PVOID Reserved3;
  48. UNICODE_STRING FullDllName;
  49. BYTE Reserved4[8];
  50. PVOID Reserved5[3];
  51. union {
  52. ULONG CheckSum;
  53. PVOID Reserved6;
  54. };
  55. ULONG TimeDateStamp;
  56. } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
  57. typedef struct _RTL_USER_PROCESS_PARAMETERS {
  58. BYTE Reserved1[16];
  59. PVOID Reserved2[10];
  60. UNICODE_STRING ImagePathName;
  61. UNICODE_STRING CommandLine;
  62. } RTL_USER_PROCESS_PARAMETERS, *PRTL_USER_PROCESS_PARAMETERS;
  63. // 32位下的结构;
  64. typedef struct _PEB {
  65. BYTE Reserved1[2];
  66. BYTE BeingDebugged;
  67. BYTE Reserved2[1];
  68. PVOID Reserved3[2];
  69. PPEB_LDR_DATA Ldr;
  70. PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
  71. PVOID Reserved4[3];
  72. PVOID AtlThunkSListPtr;
  73. PVOID Reserved5;
  74. ULONG Reserved6;
  75. PVOID Reserved7;
  76. ULONG Reserved8;
  77. ULONG AtlThunkSListPtr32;
  78. PVOID Reserved9[45];
  79. BYTE Reserved10[96];
  80. PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  81. BYTE Reserved11[128];
  82. PVOID Reserved12[1];
  83. ULONG SessionId;
  84. } PEB, *PPEB;
  85. // 64位下的结构;
  86. typedef struct _PEBX64 {
  87. BYTE Reserved1[2];
  88. BYTE BeingDebugged;
  89. BYTE Reserved2[21];
  90. PPEB_LDR_DATA LoaderData;
  91. PRTL_USER_PROCESS_PARAMETERS ProcessParameters;
  92. BYTE Reserved3[520];
  93. PPS_POST_PROCESS_INIT_ROUTINE PostProcessInitRoutine;
  94. BYTE Reserved4[136];
  95. ULONG SessionId;
  96. } PEBX64;
  97. typedef struct _PROCESS_BASIC_INFORMATION {
  98. PVOID Reserved1;
  99. PPEB PebBaseAddress;
  100. PVOID Reserved2[2];
  101. ULONG_PTR UniqueProcessId;
  102. PVOID Reserved3;
  103. } PROCESS_BASIC_INFORMATION;
  104. // 声音函数指针;
  105. typedef NTSTATUS (WINAPI *pfZwQueryInformationProcess)(
  106. _In_ HANDLE ProcessHandle,
  107. _In_ PROCESSINFOCLASS ProcessInformationClass,
  108. _Out_ PVOID ProcessInformation,
  109. _In_ ULONG ProcessInformationLength,
  110. _Out_opt_ PULONG ReturnLength
  111. );
  112. // END
  113. //////////////////////////////////////////////////////////////////////////
  114. NTSTATUS GetProcessModules(HANDLE hProcess, LPCTSTR lpTypName, LPCTSTR lpName)
  115. {
  116. NTSTATUS Status = 0;
  117. pfZwQueryInformationProcess ZwQueryInformationProcess = NULL;
  118. PROCESS_BASIC_INFORMATION ProcessInfo;
  119. PPEB pPeb;
  120. ZwQueryInformationProcess = (pfZwQueryInformationProcess)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "ZwQueryInformationProcess");
  121. if (ZwQueryInformationProcess == NULL)
  122. {
  123. WriteTextLog(_T("查找进程模块名称失败"));
  124. return Status;
  125. }
  126. Status = ZwQueryInformationProcess(hProcess, ProcessBasicInformation, &ProcessInfo, sizeof(ProcessInfo), NULL);
  127. if (NT_SUCCESS(Status))
  128. {
  129. pPeb = (PPEB)ProcessInfo.PebBaseAddress;
  130. for (PLIST_ENTRY pListEntry = pPeb->Ldr->InMemoryOrderModuleList.Flink;pListEntry != &pPeb->Ldr->InMemoryOrderModuleList;pListEntry = pListEntry->Flink)
  131. {
  132. //PLDR_DATA_TABLE_ENTRY pEntry = CONTAINING_RECORD(pListEntry, LDR_DATA_TABLE_ENTRY, pListEntry);
  133. //wprintf(L"%s\n", pEntry->FullDllName.Buffer);
  134. WriteTextLog(_T("模块名称"));
  135. }
  136. }
  137. else
  138. WriteTextLog(_T("查找进程模块名称失败1"));
  139. CloseHandle(hProcess);
  140. return Status;
  141. }
  142. BOOL CWeChatsApp::InitInstance()
  143. {
  144. // 如果一个运行在 Windows XP 上的应用程序清单指定要
  145. // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
  146. //则需要 InitCommonControlsEx()。否则,将无法创建窗口。
  147. INITCOMMONCONTROLSEX InitCtrls;
  148. InitCtrls.dwSize = sizeof(InitCtrls);
  149. // 将它设置为包括所有要在应用程序中使用的
  150. // 公共控件类。
  151. InitCtrls.dwICC = ICC_WIN95_CLASSES;
  152. InitCommonControlsEx(&InitCtrls);
  153. CWinAppEx::InitInstance();
  154. AfxEnableControlContainer();
  155. // 获取配置信息;
  156. GetIniInfo();
  157. GetDebugPriv();
  158. // HANDLE hObject = CreateMutex(NULL, FALSE, _T("CYLGLAppXiao"));
  159. // if (GetLastError() == ERROR_ALREADY_EXISTS)
  160. // {
  161. // return FALSE;
  162. // }
  163. // GetProcessModules(::GetCurrentProcess(), _T("Mutant"), _T("_WeChat_Instance_Identity_Mutex_Name"));
  164. #if _DEBUG // 创建进程,并挂起;
  165. getWeChatPath();
  166. for (int i = 0; i < 10; i++)
  167. OpenWeChat();
  168. #endif
  169. #if !_DEBUG
  170. TCHAR szDllPath[MAX_PATH];
  171. ZeroMemory(szDllPath,MAX_PATH);
  172. DWORD ss = sizeof(szDllPath);
  173. DWORD sss = _tcslen(szDllPath)*sizeof(TCHAR);
  174. _stprintf_s(szDllPath, _T("%shook.dll"), g_szModulePath);
  175. vector<DWORD> vtPID = FindAllProcess(WECHAT);
  176. if (vtPID.size() != 0 )
  177. {
  178. for (int i = 0; i < 100; i++)
  179. {
  180. CInjection inject(*vtPID.begin(),szDllPath);
  181. inject.InjectDynamicLibrary();
  182. inject.EjectDynamicLibrary();
  183. Sleep(3000);
  184. }
  185. }
  186. #endif
  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. }