当前位置: 首页 > 后端技术 > Python

PC微信获取登录二维码

时间:2023-03-25 19:58:02 Python

看完这篇文章自己试了一下,还是找不到对应的调用。毕竟我没学过逆向,只是心血来潮想逆向微信而已。找到了关键的CALL,但是我找到了一个投机取巧的方法:因为我已经知道微信的二维码图片是PNG格式的,而PNG有一个通用的文件头,如下:89504E470D0A1A0A0000000D49484452;NG..........IHDR000000CE000000CE0802000000F97DAA;……?……?……?93000000097048597300000A7500000A;?...pHYs...u...75014A25DDFD00000C9149444154789C;D996直流2A0C45A9交流FCFF2FD77D70;$04B63FDFEF3700D09F3FB30B006E0152;鱼鹰.GX??我们可以利用这个在内存中找到二维码图片,然后在内存中写断点,找到改写二维码的代码段。首先让微信处于二维码的状态,然后我们使用CE添加微信搜索字符串IHDR,这是上面文件头格式中最明显的标识。然后把上面的地址放下,绿色的不用看,肯定不是。从那篇文章我们可以看出,微信中的图片二维码存储了一个结构体,第一个指向图片数据的指针,第二个是图片的长度。所有这些地址都必须有上层指针,所以我们逐一查找它们的上层指针(这里需要注意的是,我们查找的地址是(地址-C),不是地址栏中的地址,这是因为IHDR不是PNG文件的文件头,前面有12个字节(十六进制C)的数据,我们就是在寻找他的文件头的地址),如下:找到所有地址的上层指针如果你没有的(可以直接删除),可以直接dd查看OD中的指针,如图,也可以用dc0E782C58查看是否为PNG文件头格式。另外,一些找到的地址与这个相同。我们只需要一个以E(图中E6F)开头的三位十六进制数,对应的大小约为4K。后面只需要在二维码地址05FD3CC4下的内存中写下断点就可以知道哪里被修改了。设置好断点后,扫描二维码,返回二维码后登录,就断了,如图:扣上上面的代码可以看到movdwordptrds:[esi],0x0;此时esi的值就是我们内存断点的指针(05FD3CC4),将原始图像数据指针指向0x0movdwordptrds:[esi+0x4],0x0;而esi+0x4显然是图片的长度,这两行代码应该清空原始数据push0x1pushedicallWeChatWi.5194B3CCaddesp,0x8movdwordptrds:[esi],eax;给图片指针赋值,eax是新二维码数据的指针,但此时只是一个空指针,图片还没有赋值xorecx,ecxtesteax,eaxcmovneecx,edipopedimovdwordptrds:[esi+0x4],ecx;分配长度然后我们按F8单步执行,直到我们跳出函数,就是执行retn0x4,如刚才代码段所示WeChatWi.50D4D5D0中的代码,刚才说了,这个函数只是清空原数据然后赋空指针和长度,那么图像数据后面还要赋值,也就是图中注释的函数中。当然我们也可以看看我们一开始找到的地址05FD3CC4的偏移量。求二维码地址的偏移如果我看OD中的汇编代码来求偏移,恐怕会有些困难。所以我还是用简单的方法来找偏移量:使用CE,首先我们找到二维码的地址指针,右击它,点击对这个地址使用指针扫描(可能翻译版本不同会有一些差异)CE的,必须是pointerscanning):以上选项可以默认,扫描线程数可以适当调整,最大offset和maximumlevel允许默认。如果找不到,则需要增加它。这两个我先不解释,后面再解释。你会得到很多结果,大致如下:如何筛选,我们需要关闭微信,重新打开,重新找到二维码的地址。然后在上面的菜单栏中选择PointerScanner->Rescan...,然后输入新找到的地址,点击OK。此时,只剩下几个结果了。我们可以重复上面的操作继续选择。当然,这不是必须的,9个结果就已经很理想了。这里我们可以关联上面OD中找到的汇编代码段,见本博客最后一个OD截图50C5E27E57pushedi50C5E27F8D8E54060000leaecx,dwordptrds:[esi+0x654]50C5E285E846F3♂0call微信Wi.50FCD5D0;重新资产价值图片50C5E28A57pushedi50C5E28B53pushebx50C5E28CFFB654060000pushdwordptrds:[esi+0x654]50C5E292E81954F500callWeChatWi.51BB36B0;图片数据赋值50C5E29783C40Caddesp,0xC注意第二行和第六行OK,第二行的ecx其实就是我们要的二维码结构体指针。是通过esi+0x654的偏移量得到的,我们看一下CE扫描的结果。两个地址的偏移量最后一位是0x654,我们把所有地址都双击到地址栏,重点关注这两个地址。然后关闭微信再打开,观察这9个地址的变化。你会发现一个地址从微信开始就没有变过,而其他的会变。而这个地址恰好是上面提到的两个之一,但是这个地址虽然可以获取到二维码的数据,但是不能使用,因为当二维码没有出现在登录界面时(比如登录时已确认)这个地址也是有数据的,也是一张可以读取二维码的图片。当然,这张图是无效的。所以通常情况下,除了这个地址应该是可用的。好像开始关注的点不对。通过以上步骤,就可以直接读取找到的地址偏移量得到二维码,省去了hook注入和编写dll的麻烦。aardio保存二维码使用aardio保存地址中的图片,代码有点神奇,一开始不知道。本来一直在找怎么用aardio读取字节,后来发现也可以读取字符串保存到文件,因为string.save本来就是保存字节数据的。导入过程;导入控制台;prcs=process.find("WeChat.exe")datapointer=0x05FD3CC4//二维码结构体的地址,既然找到了偏移量,就把这个地址改成??偏移量对应的地址OKdataaddress=prcs.readNumber(datapointer)length=prcs.readNumber(datapointer+0x4)data=prcs.readString(dataaddress,length)string.save("E:\QRcode.png",data)求二维码的地址偏移量string开头提到的那篇文章也介绍了如何获取二维码字符串的数据。既然知道了结果,我觉得步骤就可以简化了。我们在CE中搜索字符串找到一部分地址,然后等待刷新排除掉一部分,应该只剩几个了,从那篇博文可以看出这个地址有一个更高级的指针,而上层指针正是在dll地址上加了一个偏移量,所以我们直接在CE中查找这个四字节地址,找到一个绿色的,就是二维码字符的基地址。我现在版本(2.8.0.121)的基地址:WeChatWin.dll+0x1635C58然后我们可以直接通过这个字符拼接出登录链接,然后利用一些网站的API把这个链接转成二维码。效果和上面的一个大圆圈加一个勾是一样的。