微信过低版本限制逆向分析
文章目录
- 微信过低版本逆向分析
- 一、一些常规的思路
- 二、冻手
- 修改关键文件
- 放弃微信协议突破
- 从微信版本算法突破
- 1)找到突破点
- 2)Patch
- 三、总结
微信过低版本逆向分析
有些微信机器人使用的协议或者Hook基于较低版本,所以过微信的低版本验证也称为了一种比较常见的需求,并且个人认为学会过版本验证应该是逆向人员应该了解并且掌握的意向基本功,文章比较适合初学者学习。
笔者文笔较差,如有讲的不太清楚得地方,欢迎私信,另外笔者水平有限,文章如有问题,还请不吝赐教,给予指导
文章如有造成侵权,请及时联系作者处理。
文章仅供学习使用,切勿用于非法用途。
微信2.6.2.31下载:链接:https://pan.baidu.com/s/1kTkye-rPv9-byGQvSJd6Lg?pwd=aqzv
提取码:aqzv供学习使用
一、一些常规的思路
软件实现过低版本检测通常情况下有以下几种思路
- 软件从重要文件中获取版本信息,即
GetFileVersionInfoW
,可以尝试找到重要文件使用ResourceHacker(资源修改工具)尝试对版本信息进行修改。或者通过下断GetFileVersionInfoW
这类API找到关键位置进行Patch - 软件的版本信息通过一些算法生成(后面得出来的结论是,压根没有算法),相对来说比较安全,但是可能不太容易找到突破点的地方
- 再者,可以尝试找到网络协议中的发送版本信息的位置尝试修改,可想而知,这样做非常不理想。
二、冻手
修改关键文件
WeChatWin.dll
对微信的重要程度已经众人皆知了,尝试对GetFileVersionInfoW
下断点也给你足够的理由重视它。这里就不再赘述。
我们使用resourceHacker
中首先找到一个可以正常登录的WeChatWin.dll
的版本信息
复制版本信息在低版本中修改,对ResourceHacker了解较少的朋友需要注意替换版本信息的时候要先编译再保存,如下图
操作完成之后运行发现行不通,意料之中。基本上非常简单的软件可能成功
放弃微信协议突破
从微信版本算法突破
1)找到突破点
可能一些大型软件会在重要文件保留关于版本信息的字符串,我们尝试在IDA中搜索
可以看到有很多相关字符串,我们可以在Xdbg中再搜索字符串,对其全部下段,过滤一些不重要的断点,看看有没有线索
在调试器中搜索字符串,注意最好要在WeChatWIn中搜索,因为他是我们的主要关注点,只在WeChatWIn中搜索可以过滤掉很多无用信息。
尝试过滤无用信息后,我们注意到一个比较有意思的点,如下图
这里有ClientVersion,这给我们足够的里有关注这个函数,但是他却对应了一个非常奇怪的字符串0x6206021C
,很可能这就是我们需要关照的点。我们在IDA中转到此位置,RVA:94D907,VA:55AED907,如下图
根据字符串能提供的信息,当前位置应该在腾讯开发的mars组件里,很可能附近涉及协议相关内容,我们先在只能祈求0x6206021C
的获取不在协议内部。
经过简单的向上溯源,注意到字符串来自于RVA:94D8F0,VA:55AED8F0,如下图
我们在IDA中跟进,奇怪的字符串来自如下所指处:
我们在xdbg中跟进,来到RVA:2D6940,VA:55476940,如下图
让人兴奋的是字符串未格式化之前来自于一个固定的内存位置0x5618D344
,这是我们非常乐意看到的。
因为我们想要知道这个内存位置在哪里被写入(找到内容的由来),所以我们尝试0x5618D344
下内存写入断点,我们不必关注重定向的问题,xdbg替我们解决了这个问题。
对其下内存写入断点,重启微信。成功断下,如下图,RVA:33528,VA:551D3528
我们在IDA中跟进,如下图
可以看到有一个异或操作,我们对其下断,重启微信发现那个字符串的未格式化形式(在上面的分析中有一个简单的函数将内存中的十六进制数据格式为字符串)就是通过这个简单的异或得到的,那我们的关注点就来到了函数sub_413810()
,这个函数返回了一个简单的数据:0x1C,如下图
0x1C与0x62060200进行异或,我们跟进这个函数。
我们可以大概了解这个函数的行为,大概就是获取WeChatWIn.dll的版本信息,然后从版本信息的根
开始查找,然后经过简单的运算v6 = *((unsigned __int16 *)lpBuffer + 6);
,并将v6返回,下面将简单解释:
我们在上图VerQueryValueW
位置下断点,重启断下后如下图:
对比IDA中,VerQueryValueW
的第一个参数对应的是GetFileVersionInfoW
返回的版本信息,我们查看VerQueryValueW
的函数签名如下图:
第二个参数为\
,便是从根块查询资源信息,那么我们查看VS_FIXEDFILEINFO的结构,如下:
typedef struct tagVS_FIXEDFILEINFO {DWORD dwSignature;DWORD dwStrucVersion;DWORD dwFileVersionMS;DWORD dwFileVersionLS;DWORD dwProductVersionMS;DWORD dwProductVersionLS;DWORD dwFileFlagsMask;DWORD dwFileFlags;DWORD dwFileOS;DWORD dwFileType;DWORD dwFileSubtype;DWORD dwFileDateMS;DWORD dwFileDateLS;
} VS_FIXEDFILEINFO;
在xbg中的v6中(即版本信息块中)对比找到结构,根据成员dwSignature
可以很快的定位结构,其有以下特征:
我们再次在IDA中关注v6 = *((unsigned __int16 *)lpBuffer + 6);
,v6作为返回值,来自lpBuffer 也即来自VS_FIXEDFILEINFO
结构,需要注意到的是lpBuffer被强转为(unsigned __int16 *),则lpBuffer+6即lpBuffer向后寻址12字节,对应下图
对应结构中的 DWORD dwFileVersionLS;
字段,是文件版本的低32位,如下图
对应的,因为之前笔者对wechatwin.dll的文件信息做了更改,改为3.9.0.28,转为版本号形式:0003 0009 0000 001C,
0x1C 对应的就是28,所以我们可以得出结论,微信的版本计算用版本号的最后一字节的值来异或一个固定的值得到结果。
那么问题又来了,既然之前笔者已经成功替换了版本信息,这里的最后一个字节也已经变化,为什么版本验证没有成功呢。读者可以猜到,问题就出在那个固定值0x62060200
,为了验证,笔者从微信版本3.9.0.28
中找到版本验证的位置比较,在对应版本中,我们发现如下特征:
我们比较0x62060200
和0x63090000
,发现3.9是我们分析的比较新的微信主版本号,而2.6是我们分析的旧微信的主版本号,所以之所以修改wechatwin的版本信息后并没有通过验证的原因大致我们也可以推测,因为主版本号仍是旧版本,异或之后得到的版本信息仍然是以旧主版本信息为主,所以验证会不通过,我们尝试在旧版本中修改主版本号信息来验证:
运行,成功通过验证并登录,如下图:
2)Patch
这种情况下过验证比较简单的方法就是修改WeChatWin.dll的版本信息并且Patch那个主版本号信息,修改WeChatWIn.dll的流程不再赘述,下面在dbg中:
保存后替换原WeChatWIn.dll即可实现过版本验证
三、总结
- 字符串搜索
ClientVersion
,可以找到关于版本信息调用。 - 微信的版本号计算方式是:
0x60000000^主版本号^版本号最后一个字节(本例中的0x1C)
非常简单
后来从网上查阅相关文章,发现 揰掵佲 师傅在21年就已经对相关内容做了总结,只不过大佬用的是从系统API下手,也是完全可行的,也是常见的追版本信息的方式,并且微信对版本验证做了一点微乎其微的加强:
在 揰掵佲 师傅的文章中,版本信息通过在内存中动态的计算0x0x60000000^主版本号^版本号最后一个字节
,来计算版本信息,而主版本号是运行时获取的,所以修改wechatwin.dll的版本信息很容易就能达到绕过版本验证,在这里有一点安全性加强,只能说聊胜于无。
下面给出 揰掵佲 师傅的文章
微信低版本的分析 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
微信过低版本限制逆向分析相关推荐
- 红米android版本,微信红米低版本下载
微信红米低版本是适用于红米手机的低版本微信软件,此版本为7.0.0版,安装包不到一百兆,该有的功能也都挺齐全,很多用户对于微信新版本的内存占用不堪重负,那么这个历史低版本就很适合你,红米手机也能轻松兼 ...
- android版本低无法安装微信,解决低版本安卓4.4.4无法安装微信的问题
今天给一台旧手机刷机之后,发现应用商店没有微信安装了,就算去官网下载安装包,安装的时候也提示不匹配系统,无法安装!这是因为微信的v7以上版本已经不支持安卓4.4.x系统了,直接抛弃低系统手机了,但是我 ...
- 【CSS】清除浮动 ③ ( 清除浮动 - 使用 after 伪元素 | 语法简介 | 兼容低版本浏览器 | 原理分析 )
文章目录 一.清除浮动 - 使用 after 伪元素 ( 最流行写法 ) 1.额外标签法 和 overflow 样式法弊端 2.after 伪元素清除浮动简介 3.after 伪元素清除浮动核心代码 ...
- 在电脑端微信或低版本ios,使用微信自带浏览器打开网页不显示
使用了es6的let,不解析let... 把let去掉或者使用工具把es6转为es5
- iOS逆向开发,突破微信强制升级,让低版本的iPhone也能正常使用
(1)安装与运行 在网上搜索微信的历史版本,下载一个兼容多开的版本(实际上是bundleID不一样),比如5.0版本.当然也可以通charles等,在AppStore上下载微信旧版本,再重签名. 通过 ...
- 从微信扔骰子看iOS应用安全与逆向分析
前言 在之前<免越狱调试与分析黑盒iOS应用>以及前几篇文章中已经介绍了如何开始分析iOS应用,不过都是基于非越狱的机器,其本意是为了能够在自己的主力设备中进行简单的分析和调试.但是执着于 ...
- Android数据库加解密逆向分析(三)——微信数据库密码破解
接着上一篇文章,在上一篇文章中我们通过对Line数据库加密的逆向分析,了解到了对要写入到数据库中的数据加密,读取时再将读取出的数据解密这种Android上的数据库加密方式.这篇文章来通过介绍对微信数据 ...
- 微信视频号逆向分析+核心爬虫代码
基于微信7.0.12版本,请自寻下载对应微信版本.打开jadx反编译工具自行比对,主要怕你以为我骗你.至于这个爬虫代码如何运行,请关注我的逆向工作台hooker项目:https://github.co ...
- 微信小程序、微信低版本兼容
基础库低版本兼容 小程序的功能不断的增加,但是旧版本的微信客户端并不支持新功能,所以在使用这些新能力的时候需要做兼容. 1版本号比较 js_getuserinfo() {// 4 13// 2.10. ...
最新文章
- 文本处理工具之grep和egrep
- [内部项目]i前端如何增加一个页面
- JAVA SE学习day_03:包装类、文件操作——file
- 使用Aspose.Cells的基础知识整理
- .net后台获取html控件值的2种方法
- 一文弄懂神经网络中的反向传播法——BackPropagation【转】
- 逆向 EasyBase64
- 首次公开!《阿里计算机视觉技术精选》揭秘前沿落地案例
- android 方法超时,android socket.io中的发出或确认超时处理?
- 补习系列(15)-springboot 分布式会话原理
- cuda stream
- 现在学python2还有意义吗_现在学python该学python2还是python3?
- google protobuf_websoket解析protobuf协议
- python运维实战pdf_python运维实例.pdf
- 09年河南高考零分作文:兔子,你就是一个傻B
- 基于李雅普诺夫函数的跟踪控制(三)
- web前端-微信小程序开发学习
- 荀子《劝学》原文及翻译
- js中对象的可枚举和不可枚举属性
- 2017年 第8届 蓝桥杯 Java B组 省赛真题详解及总结
热门文章
- java研发常用软件下载与研发环境配置
- SQLSTATE=2300
- Python学习笔记(13)-Python类与对象示例
- 小程序:通过小程序wx.getLocation接口审核的经验总结
- 乔利斯基三角分解_杜利特尔及乔利斯基三角分解
- DOS、DDOS、CC等完整解决方案
- Gerrit3.4.1安装使用
- macos支持exfat吗_[启动盘制作]如何在 Windows 下制作苹果 macOS 启动盘
- Unity 报错之 InvalidProgramException: Invalid IL code in CC_Ctrl:getFixByPlatForm ():IL_0008: ldc.i4.5
- python爬虫爬商品库存_python爬虫实践——爬取京东商品信息