|
@@ -0,0 +1,236 @@
|
|
|
+#include "StdAfx.h"
|
|
|
+#include "WxGlobal.h"
|
|
|
+
|
|
|
+#include <io.h>
|
|
|
+// 获取文件版本号函数头文件;
|
|
|
+#include <WinVer.h>
|
|
|
+#pragma comment(lib,"version.lib")
|
|
|
+using namespace std;
|
|
|
+#include <psapi.h>
|
|
|
+#pragma comment(lib,"Psapi.lib")
|
|
|
+
|
|
|
+HMODULE g_hCurModule = NULL;
|
|
|
+
|
|
|
+/************************************************************************/
|
|
|
+/* 函数:WriteTextLog[7/28/2016 IT];
|
|
|
+/* 描述:写文本日志;
|
|
|
+/* 参数:;
|
|
|
+/* [IN] :;
|
|
|
+/* 返回:void;
|
|
|
+/* 注意:;
|
|
|
+/* 示例:;
|
|
|
+/*
|
|
|
+/* 修改:;
|
|
|
+/* 日期:;
|
|
|
+/* 内容:;
|
|
|
+/************************************************************************/
|
|
|
+void WriteTextLog(const TCHAR *format, ...)
|
|
|
+{
|
|
|
+ // 解析出日志路径;
|
|
|
+ TCHAR szlogpath[MAX_PATH] = { 0 };
|
|
|
+ static TCHAR szModulePath[MAX_PATH] = { 0 };
|
|
|
+ static TCHAR szFna[MAX_PATH] = { 0 };
|
|
|
+ if (szModulePath[0] == _T('\0'))
|
|
|
+ {
|
|
|
+ TCHAR szDrive[MAX_PATH] = { 0 };
|
|
|
+ TCHAR szDir[MAX_PATH] = { 0 };
|
|
|
+ TCHAR szExt[MAX_PATH] = { 0 };
|
|
|
+ ::GetModuleFileName(g_hCurModule, szModulePath, sizeof(szModulePath) / sizeof(TCHAR));
|
|
|
+ _tsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
|
|
|
+ _tcscpy_s(szModulePath, szDrive);
|
|
|
+ _tcscat_s(szModulePath, szDir);
|
|
|
+ }
|
|
|
+
|
|
|
+ _stprintf_s(szlogpath, _T("%s%s.txt"), szModulePath, szFna);
|
|
|
+ // 打开或创建文件;
|
|
|
+ FILE *fp = NULL;
|
|
|
+ //if (_taccess(szlogpath, 0) != -1)
|
|
|
+#ifndef UNICODE
|
|
|
+ if (_access(szlogpath, 0) != -1)
|
|
|
+#else
|
|
|
+ if (_taccess(szlogpath, 0) != -1)
|
|
|
+#endif
|
|
|
+ {// 存在;
|
|
|
+ fp = _tfopen(szlogpath, _T("a+"));
|
|
|
+ // 移动到末尾;
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 不存在;
|
|
|
+ fp = _tfopen(szlogpath, _T("w+"));
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( fp == NULL )
|
|
|
+ return;
|
|
|
+
|
|
|
+ // 格式化前设置语言区域;
|
|
|
+ TCHAR* old_locale = _tcsdup(_tsetlocale(LC_CTYPE, NULL));
|
|
|
+ _tsetlocale(LC_CTYPE, _T("chs"));//设定中文;
|
|
|
+
|
|
|
+ // 格式化日志内容;
|
|
|
+ va_list args = NULL;
|
|
|
+ int len = 0;
|
|
|
+ TCHAR *buffer = NULL;
|
|
|
+ va_start(args, format);
|
|
|
+ // _vscprintf doesn't count. terminating '\0'
|
|
|
+ len = _vsctprintf(format, args) + 1;
|
|
|
+ buffer = (TCHAR*)malloc(len * sizeof(TCHAR));
|
|
|
+ _vstprintf_s(buffer, len, format, args);
|
|
|
+ // 将日志内容输入到文件中;
|
|
|
+ // 获取今年年份;
|
|
|
+ __time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
|
|
|
+ struct tm gmtm = {0};
|
|
|
+ localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
|
|
|
+ _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);
|
|
|
+
|
|
|
+ // 关闭文件,释放资源并设置回原语言区域;
|
|
|
+ free(buffer);
|
|
|
+ fclose(fp);
|
|
|
+ _tsetlocale(LC_CTYPE, old_locale);
|
|
|
+ free(old_locale);//还原区域设定;
|
|
|
+}
|
|
|
+
|
|
|
+void WriteTextLogW(const WCHAR *format, ...)
|
|
|
+{
|
|
|
+ // 解析出日志路径;
|
|
|
+ WCHAR szlogpath[MAX_PATH] = { 0 };
|
|
|
+ static WCHAR szModulePath[MAX_PATH] = { 0 };
|
|
|
+ static WCHAR szFna[MAX_PATH] = { 0 };
|
|
|
+ if (szModulePath[0] == L'\0')
|
|
|
+ {
|
|
|
+ WCHAR szDrive[MAX_PATH] = { 0 };
|
|
|
+ WCHAR szDir[MAX_PATH] = { 0 };
|
|
|
+ WCHAR szExt[MAX_PATH] = { 0 };
|
|
|
+ ::GetModuleFileNameW(g_hCurModule, szModulePath, sizeof(szModulePath) / sizeof(WCHAR));
|
|
|
+ _wsplitpath_s(szModulePath, szDrive, szDir, szFna, szExt);
|
|
|
+ wcscpy_s(szModulePath, szDrive);
|
|
|
+ wcscat_s(szModulePath, szDir);
|
|
|
+ }
|
|
|
+
|
|
|
+ swprintf_s(szlogpath, L"%s%s.txt", szModulePath, szFna);
|
|
|
+ // 打开或创建文件;
|
|
|
+ FILE *fp = NULL;
|
|
|
+ if (_waccess(szlogpath, 0) != -1)
|
|
|
+ {// 存在;
|
|
|
+ fp = _wfopen(szlogpath, L"a+");
|
|
|
+ // 移动到末尾;
|
|
|
+ fseek(fp, 0, SEEK_END);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {// 不存在;
|
|
|
+ fp = _wfopen(szlogpath, L"w+");
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( fp == NULL )
|
|
|
+ return;
|
|
|
+
|
|
|
+ // 格式化前设置语言区域;
|
|
|
+ WCHAR* old_locale = _wcsdup(_wsetlocale(LC_CTYPE, NULL));
|
|
|
+ _wsetlocale(LC_CTYPE, L"chs");//设定中文;
|
|
|
+
|
|
|
+ // 格式化日志内容;
|
|
|
+ va_list args = NULL;
|
|
|
+ int len = 0;
|
|
|
+ WCHAR *buffer = NULL;
|
|
|
+ va_start(args, format);
|
|
|
+ // _vscprintf doesn't count. terminating '\0'
|
|
|
+ len = _vscwprintf(format, args) + 1;
|
|
|
+ buffer = (WCHAR*)malloc(len * sizeof(WCHAR));
|
|
|
+ vswprintf_s(buffer, len, format, args);
|
|
|
+ // 将日志内容输入到文件中;
|
|
|
+ // 获取今年年份;
|
|
|
+ __time64_t gmt = time(NULL);// 获取当前日历时间(1900-01-01开始的Unix时间戳);
|
|
|
+ struct tm gmtm = {0};
|
|
|
+ localtime_s(&gmtm, &gmt); // 时间戳转成本地时间;
|
|
|
+ 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);
|
|
|
+
|
|
|
+ // 关闭文件,释放资源并设置回原语言区域;
|
|
|
+ free(buffer);
|
|
|
+ fclose(fp);
|
|
|
+ _wsetlocale(LC_CTYPE, old_locale);
|
|
|
+ free(old_locale);//还原区域设定;
|
|
|
+}
|
|
|
+
|
|
|
+BOOL GetWxInfo(WxInfo &wxInfo)
|
|
|
+{
|
|
|
+ HMODULE hWeChatWin = GetModuleHandle(_T("WeChatWin.dll"));
|
|
|
+ if ( hWeChatWin == NULL )
|
|
|
+ {
|
|
|
+ WriteTextLog(_T("找不到WeChatWin.dll"));
|
|
|
+ return FALSE;
|
|
|
+ }
|
|
|
+
|
|
|
+ DWORD dwWeChatWinAddr = DWORD(hWeChatWin);
|
|
|
+ TCHAR szTemp[MAX_PATH] = {0};
|
|
|
+#if 0
|
|
|
+ // 两种方式;
|
|
|
+ _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131B90);
|
|
|
+#else
|
|
|
+ memcpy(szTemp, (LPVOID)(dwWeChatWinAddr+0x1131B90), MAX_PATH);
|
|
|
+#endif
|
|
|
+ WriteTextLog(_T("微信账号:%s"), szTemp);
|
|
|
+
|
|
|
+ _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131B78)));
|
|
|
+ WriteTextLog(_T("微信ID:%s"), szTemp);
|
|
|
+ _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131BEC)));
|
|
|
+ WriteTextLog(_T("微信ID:%s"), szTemp);
|
|
|
+
|
|
|
+
|
|
|
+ _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131C64);
|
|
|
+ WriteTextLog(_T("微信昵称:%s"), szTemp);
|
|
|
+#if 1
|
|
|
+ // 微信昵称采用的是宽字符;
|
|
|
+ WCHAR wszTemp[MAX_PATH] = {0};
|
|
|
+ //wprintf_s(wszTemp, L"%s", dwWeChatWinAddr + 0x1131C64);
|
|
|
+ memcpy(wszTemp, LPVOID(dwWeChatWinAddr + 0x1131C64), MAX_PATH*sizeof(WCHAR));
|
|
|
+ WriteTextLogW(L"微信昵称:%s", wszTemp);
|
|
|
+#endif
|
|
|
+ _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131C98);
|
|
|
+ WriteTextLog(_T("微信手机:%s"), szTemp);
|
|
|
+
|
|
|
+ _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131D50);
|
|
|
+ WriteTextLog(_T("微信省:%s"), szTemp);
|
|
|
+
|
|
|
+ _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1131D68);
|
|
|
+ WriteTextLog(_T("微信市:%s"), szTemp);
|
|
|
+
|
|
|
+ _stprintf_s(szTemp, _T("%s"), dwWeChatWinAddr + 0x1132030);
|
|
|
+ WriteTextLog(_T("微信手机设备:%s"), szTemp);
|
|
|
+
|
|
|
+ _stprintf_s(szTemp, _T("%s"), *(LPDWORD(dwWeChatWinAddr + 0x1131C80)));
|
|
|
+ WriteTextLog(_T("微信邮箱:0x%p, 0x%p"), dwWeChatWinAddr + 0x1131C80, *(LPDWORD(dwWeChatWinAddr + 0x1131C80)) );
|
|
|
+ WriteTextLog(_T("微信邮箱:%s"), szTemp);
|
|
|
+
|
|
|
+
|
|
|
+ return TRUE;
|
|
|
+}
|
|
|
+
|
|
|
+// 获取本进程的模块地址;
|
|
|
+HMODULE FindModuleEx(LPCTSTR lpModuleName)
|
|
|
+{
|
|
|
+ HMODULE hMods[1024] = {0};
|
|
|
+ DWORD cbNeeded = 0;
|
|
|
+ TCHAR szModName[MAX_PATH];
|
|
|
+ BOOL Wow64Process;
|
|
|
+
|
|
|
+ HANDLE hProcess = ::GetCurrentProcess();
|
|
|
+ IsWow64Process(hProcess, &Wow64Process); //判断是32位还是64位进程
|
|
|
+ if ( EnumProcessModulesEx(hProcess, hMods, sizeof(hMods), &cbNeeded, Wow64Process?LIST_MODULES_32BIT:LIST_MODULES_64BIT) )
|
|
|
+ {
|
|
|
+ for (UINT i = 0; i < (cbNeeded / sizeof(HMODULE)); i++ )
|
|
|
+ {
|
|
|
+ GetModuleFileNameEx(hProcess, hMods[i], szModName, _countof(szModName));
|
|
|
+
|
|
|
+ WriteTextLog(szModName);
|
|
|
+ if (_tcsicmp(lpModuleName, szModName) == 0)
|
|
|
+ {
|
|
|
+ CloseHandle(hProcess);
|
|
|
+ return hMods[i];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ CloseHandle(hProcess);
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|