WxGlobal.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "StdAfx.h"
  2. #include "WxGlobal.h"
  3. #include <io.h>
  4. // 获取文件版本号函数头文件;
  5. #include <WinVer.h>
  6. #pragma comment(lib,"version.lib")
  7. using namespace std;
  8. #include <psapi.h>
  9. #pragma comment(lib,"Psapi.lib")
  10. #include "EncodingConversion.h"
  11. HMODULE g_hCurModule = NULL;
  12. /************************************************************************/
  13. /* 函数:WriteTextLog[7/28/2016 IT];
  14. /* 描述:写文本日志;
  15. /* 参数:;
  16. /* [IN] :;
  17. /* 返回:void;
  18. /* 注意:;
  19. /* 示例:;
  20. /*
  21. /* 修改:;
  22. /* 日期:;
  23. /* 内容:;
  24. /************************************************************************/
  25. void WriteTextLog(const TCHAR *format, ...)
  26. {
  27. // 解析出日志路径;
  28. TCHAR szlogpath[MAX_PATH] = { 0 };
  29. static TCHAR szModulePath[MAX_PATH] = { 0 };
  30. static TCHAR szFna[MAX_PATH] = { 0 };
  31. if (szModulePath[0] == _T('\0'))
  32. {
  33. TCHAR szDrive[MAX_PATH] = { 0 };
  34. TCHAR szDir[MAX_PATH] = { 0 };
  35. TCHAR szExt[MAX_PATH] = { 0 };
  36. ::GetModuleFileName(g_hCurModule, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
  37. _tsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
  38. _tcscpy_s(szModulePath, szDrive);
  39. _tcscat_s(szModulePath, szDir);
  40. }
  41. _stprintf_s(szlogpath, _T("%s%s.txt"), szModulePath, szFna);
  42. // 打开或创建文件;
  43. FILE *fp = NULL;
  44. //if (_taccess(szlogpath, 0) != -1)
  45. #ifndef UNICODE
  46. if (_access(szlogpath, 0) != -1)
  47. #else
  48. if (_taccess(szlogpath, 0) != -1)
  49. #endif
  50. {// 存在;
  51. fp = _tfopen(szlogpath, _T("a+"));
  52. // 移动到末尾;
  53. fseek(fp, 0, SEEK_END);
  54. }
  55. else
  56. {// 不存在;
  57. fp = _tfopen(szlogpath, _T("w+"));
  58. }
  59. if ( fp == NULL )
  60. return;
  61. // 格式化前设置语言区域;
  62. TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
  63. _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
  64. // 格式化日志内容;
  65. va_list args = NULL;
  66. int len = 0;
  67. TCHAR *buffer = NULL;
  68. va_start(args, format);
  69. // _vscprintf doesn't count. terminating '\0'
  70. len = _vsctprintf(format, args) + 1;
  71. buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
  72. _vstprintf_s(buffer, len, format, args);
  73. // 将日志内容输入到文件中;
  74. // 获取今年年份;
  75. __time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
  76. struct tm gmtm = {0};
  77. localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
  78. _ftprintf(fp, _T("%04d-%02d-%02d %02d:%02d:%02d %s\n"), gmtm.tm_year+1990, gmtm.tm_mon+1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
  79. // 关闭文件,释放资源并设置回原语言区域;
  80. free(buffer);
  81. fclose(fp);
  82. _tsetlocale(LC_CTYPE, old_locale);
  83. free(old_locale);//还原区域设定;
  84. }
  85. void WriteTextLogW(const WCHAR *format, ...)
  86. {
  87. // 解析出日志路径;
  88. WCHAR szlogpath[MAX_PATH] = { 0 };
  89. static WCHAR szModulePath[MAX_PATH] = { 0 };
  90. static WCHAR szFna[MAX_PATH] = { 0 };
  91. if (szModulePath[0] == L'\0')
  92. {
  93. WCHAR szDrive[MAX_PATH] = { 0 };
  94. WCHAR szDir[MAX_PATH] = { 0 };
  95. WCHAR szExt[MAX_PATH] = { 0 };
  96. ::GetModuleFileNameW(g_hCurModule, szModulePath, sizeof(szModulePath) / sizeof(WCHAR));
  97. _wsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
  98. wcscpy_s(szModulePath, szDrive);
  99. wcscat_s(szModulePath, szDir);
  100. }
  101. swprintf_s(szlogpath, L"%s%s.txt", szModulePath, szFna);
  102. // 打开或创建文件;
  103. FILE *fp = NULL;
  104. if (_waccess(szlogpath, 0) != -1)
  105. {// 存在;
  106. fp = _wfopen(szlogpath, L"a+");
  107. // 移动到末尾;
  108. fseek(fp, 0, SEEK_END);
  109. }
  110. else
  111. {// 不存在;
  112. fp = _wfopen(szlogpath, L"w+");
  113. }
  114. if ( fp == NULL )
  115. return;
  116. // 格式化前设置语言区域;
  117. WCHAR* old_locale = _wcsdup(_wsetlocale(LC_CTYPE, NULL));
  118. _wsetlocale(LC_CTYPE, L"chs");//设定中文;
  119. // 格式化日志内容;
  120. va_list args = NULL;
  121. int len = 0;
  122. WCHAR *buffer = NULL;
  123. va_start(args, format);
  124. // _vscprintf doesn't count. terminating '\0'
  125. len = _vscwprintf(format, args) + 1;
  126. buffer = (WCHAR*)malloc(len * sizeof(WCHAR));
  127. vswprintf_s(buffer, len, format, args);
  128. // 将日志内容输入到文件中;
  129. // 获取今年年份;
  130. __time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
  131. struct tm gmtm = {0};
  132. localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
  133. fwprintf(fp, L"%04d-%02d-%02d %02d:%02d:%02d %s\n", gmtm.tm_year+1990, gmtm.tm_mon+1, gmtm.tm_mday, gmtm.tm_hour, gmtm.tm_min, gmtm.tm_sec, buffer);
  134. // 关闭文件,释放资源并设置回原语言区域;
  135. free(buffer);
  136. fclose(fp);
  137. _wsetlocale(LC_CTYPE, old_locale);
  138. free(old_locale);//还原区域设定;
  139. }
  140. BOOL GetWxInfo(WxInfo &wxInfo)
  141. {
  142. HMODULE hWeChatWin = GetModuleHandle(_T("WeChatWin.dll"));
  143. if ( hWeChatWin == NULL )
  144. {
  145. WriteTextLog(_T("找不到WeChatWin.dll"));
  146. return FALSE;
  147. }
  148. DWORD dwWeChatWinAddr = DWORD(hWeChatWin);
  149. TCHAR szTemp[MAX_PATH] = {0};
  150. #if 0
  151. // 两种方式;
  152. _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131B90);
  153. #else
  154. memcpy(szTemp, (LPVOID)(dwWeChatWinAddr+0x1131B90), MAX_PATH);
  155. #endif
  156. WriteTextLog(_T("微信账号:%s"), szTemp);
  157. _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131B78)));
  158. WriteTextLog(_T("微信ID:%s"), szTemp);
  159. _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131BEC)));
  160. WriteTextLog(_T("微信ID:%s"), szTemp);
  161. // 微信中文不是宽字符,而是URL编译的UTF8格式;
  162. string str;
  163. _stprintf_s(szTemp, _T("%s"), LPDWORD(dwWeChatWinAddr + 0x1131C64));
  164. EncodingConverion::DeCode_URLUTF8(szTemp,str);
  165. WriteTextLog(_T("微信昵称:%s"), str.c_str());
  166. _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131C98);
  167. WriteTextLog(_T("微信手机:%s"), szTemp);
  168. _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131D50);
  169. WriteTextLog(_T("微信省:%s"), szTemp);
  170. _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131D68);
  171. WriteTextLog(_T("微信市:%s"), szTemp);
  172. _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1132030);
  173. WriteTextLog(_T("微信手机设备:%s"), szTemp);
  174. _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131C80)));
  175. WriteTextLog(_T("微信邮箱:0x%p, 0x%p"), dwWeChatWinAddr + 0x1131C80, *(LPDWORD(dwWeChatWinAddr + 0x1131C80)) );
  176. WriteTextLog(_T("微信邮箱:%s"), szTemp);
  177. _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131F2C)));
  178. WriteTextLog(_T("微信大头像:%s"), szTemp);
  179. _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131F44)));
  180. WriteTextLog(_T("微信小头像:%s"), szTemp);
  181. return TRUE;
  182. }