微信版本
查找微信名
首先用CE附加微信
输入自己的微信名,然后选择类型为字符串,点击搜索,在众多搜索结果中找到最下方唯一一个绿色的地址,这个就是微信名的基址
既然找到了微信名,那么微信号,头像等信息肯定是在同一片内存区域挨着的,所以只要找到这个基址我们就可以搜索出后面的数据
点击查看内存,然后按Ctrl+G,输入刚才找到的微信名的地址5B33D91C
可以看到出现了手机号和微信号等信息
查找头像
此时我们已经看到了所有的数据,如果想要拿到地址,使用OD会方便一点。
同样,在数据窗口Ctrl+G找到这个地址,我们要在附加找到保存头像的指针,头像一般是以一个网址的形式保存的,一直往下拉,就能找到一个指向http字符串的指针
那么怎么验证呢?直接数据窗口跟随
复制下这个网址,然后用浏览器打开
说明这个确实是我们头像的地址
计算微信头像偏移
找到地址了我们需要记录这个地址在模块中的偏移,还是通过微信名
首先找到这个模块的基址
点击手动加入地址,输入模块名
这个0x510F0000就是我们要的基址。由于ASLR机制的存在,这个地址在每次电脑重新启动后都会改变。
接着用微信头像的指针地址减去模块基址就能得到微信的头像偏移,我这里是0x126DBE4。利用基址+偏移的方式存储地址只要微信的版本不更新,那么下次机器重启这个地址内的数据就依旧是有效的。
查找微信号
用同样的方法找到到微信ID的地址
接着添加地址,如果你的地址找的是正确的话,那么输入地址之后,等号右边的编辑框显示的也会是正确的微信号然后用微信号的地址减去模块基址算出偏移,另外剩余的手机号 地区和登陆设备可以用同样的方法查找到
替换地址类型
接下来将所有的CE的数据地址替换成模块地址+偏移的形式,不能用固定的地址值。因为模块基址在每次开启重启之后都会改变
校验地址的有效性
此时我们直接退出微信,地址数据消失,然后再次点击登陆
保留地址代码列表,如果你的所有数据都找对了的话,那么右边的数值应该是和退出微信之前是一致的
模块的地址我们可以动态获取到,偏移是不变的。自然我们找到的地址不管微信是否退出应该都是有效的。既然找到了有效的地址数据,那么写一个程序用于获取这些数据当然也就不成问题了。
编写代码读取微信数据
接着我们编写一个dll,注入到微信进程空间,去拿到微信的个人数据。dll的部分代码如下:
void ReadWeChatData(HWND hWnd)
{//拿到模块基址
DWORD WeChatWinAddr = GetWeChatWinAddr(); //获取微信昵称并显示
charnickName[0x100] = { 0};
sprintf_s(nickName,"%s", WeChatWinAddr+ 0x126D91C);
SetDlgItemText(hWnd, IDC_NICKNAME, nickName); //获取微信账号并显示
charusername[0x100] = { 0};
sprintf_s(username,"%s", WeChatWinAddr + 0x126DA80);
SetDlgItemText(hWnd, IDC_USERNAME, username); //获取微信头像并显示
charHeaderPic[0x100] = { 0};
DWORD pPic = WeChatWinAddr + 0x126DBE4;
sprintf_s(HeaderPic,"%s", *((DWORD*)pPic));
SetDlgItemText(hWnd, IDC_HEADER_PIC, HeaderPic); //获取微信登录设备并显示
charmachine[0x100] = { 0};
sprintf_s(machine,"%s", WeChatWinAddr + 0x126DD48);
SetDlgItemText(hWnd, IDC_MACHINE, machine); //获取微信手机号并显示
charphoneNumber[0x100] = { 0};
sprintf_s(phoneNumber,"%s", WeChatWinAddr + 0x126D950);
SetDlgItemText(hWnd, IDC_PHONE, phoneNumber);
}
将编写的DLL注入到微信,实际效果如图所示:
目前微信机器人的成品已经发布,需要代码请移步Github。还请亲们帮忙点个star
https://GitHub.com/TonyChen56/WeChatRobot
作者鬼手56
文由汉客儿