Sometimes, the use of knowledge is for free, but the discovery of knowledge is usually costly. There must be someone to pay for it.
周末发现家里有部淘汰的Android手机,里面有个微信。微信打开需要登录,账号早就废弃了。好奇心来了,突然很想知道以前聊了些什么。周末闲着也是闲着,开干。
以下内容仅供学习参考,请勿作他用。
关键步骤:
root手机
反编译微信App最新版本7.0.3,分析信息存储和加密原理
获取手机IMEI(International Mobile Equipment Identity)
获取UIN(User Information)
计算MD5,数据库密码为MD5(IMEI + UIN)取前7位
使用SQLCipher数据库工具读取EnMicroMsg.db
破解微信数据库的方法,网上有很多教程,基本上都是巴拉巴拉给了结论。基本都没有回答如下几个问题:
为什么是IMEI?
为什么是UIN?
为什么是MD5算法?
为什么是Hash值取前7位?
为什么是EnMicroMsg.db?
因此,本文重点分享分析过程和解密方法。这样,即便微信哪天修改了加密策略,也还可以依据原理,完成破解。
聊天记录在哪里?
微信离线状态下也可以查看聊天记录,那么微信消息必然存在手机本地,可能是数据库,也可能是某种形式的缓存。先从微信本地安装目录分析/data/data/com.tencent.mm/:
上图仅保留有用的文件夹和文件。初步分析确定关键文件就是EnMicroMsg.db,最初注意到这个文件是因为命名,EnMicroMsg大概就是Encrypted Micro Message。想要验证也很简单,在手机上生成大量聊天记录,然后对比文件大小变化即可。尝试用数据库软件打开,打不开,应该是加密了。
密码是什么?
想解密,就必须知道密码。废话!不知道密码,知道加密方式也是极好的。怎么知道加密方式呢?废话,当然是查看微信源码啦!怎么查看源码呢?当然得先加入微信团队了!这个真的有点难!换条路,尝试一下反编译微信App?话不多说,盘她。
反编译不是本文的重点,推荐个工具,github搜索onekey-decompile-apk。可别去pornhub搜。
反编译后发现她长这样:
先走马观花看看有没有和存储相关的文件夹或者文件名。mm文件夹里面很快找到了storage文件夹,里面找到bj.java文件,发现下面这段代码:
关键词"CREATE TABLE","message",貌似找到核心代码了。果不其然,这个文件里包含了message表的更新、删除、插入等常规操作。
用关键词“EnMicroMsg.db”搜索整个文件夹,找到了下面这段可疑代码:
这是个生成Key的操作,用q.Kc()+paramLong通过com.tencent.mm.a包中u方法计算出一个值,然后取其前7位作为Key值。
u方法是什么?盘呗。
这货原来就是MD5加密。
q.Kc()是什么?找到下面这一段代码:
好吧,q.Kc()等于设备的IMEI或者字符串“1234567890ABCDEF”。
paramLong是什么?继续分析代码调用关系,找到了如下代码:
str1为存储聊天记录的文件夹路径,原来那个很长的文件夹名称(cbe911a09272f16c7ce36cb207e1c0ed)是这么计算出来的,文件夹名称=MD5("mm"+ i)。这段代码可以看出paramLong = l3 = i = b.a(euJ)。
到此,其实已经不用再深挖了,目前已知MD5("mm" + b.a(euJ)) = cbe911a09272f16c7ce36cb207e1c0ed,b.a(euJ)为一个integer整型,已知条件已经可以暴力破解出b.a(euJ)的值了。
当然,能用脑子解决的问题,就绝对不使用暴力。再分析b.a(euJ)是什么?找到了下面这段代码:
b.a(euJ) = this.uin,而这个uin是从配置文件system_config_prefs.xml中读取key为“default_uin”的字段。查看从手机获取的配置文件:
果不其然,正是微信的User Information。既然是UIN,那获取这个值的方法就太多了,微信安装文件夹多处存储这个值,当然也可以通过抓包获取。
IMEI怎么获取?方法很多,手机拨号*#06#,查看手机贴标,或者从微信安装目录文件读取:
这个IMEI_DENGTA就是手机的IMEI。计算MD5的工具有很多,最简单的就是网上在线生成,只要输入IMEI + UIN就可以很轻松算出Hash值了。
一般的数据库软件不支持带密码打开数据库,这里推荐使用SQLCipher(SQLCipher extends the SQLite database library to add security enhancements)。
SQLCipher是个开源软件,提供了基于Android的解密库,我尝试基于SQLCipher开发了一款读取和修改微信数据的软件,只要获取root权限,或者共享systemID,微信的聊天记录就再也不是什么秘密了。
导出message表的聊天记录长这样:
破译以后可以干什么?比如说修改聊天记录、篡改系统消息、在聊天记录中插入聊天记录、仿造语音信息,根据msgId字段的自增特性,还可以查证是否有删除过聊天记录的操作。
微信安装目录以及反编译的代码还有很多可以挖掘的东西。有机会再分享吧。
伪造退款等通知信息:
伪造微信团队服务号信息:
小结
Android手机不要root,root之后相当于裸奔。微信消息不要涉密,因为即便手机没有root,也可以通过OEM系统版本编译出提权App(共享system权限),同样可以践踏微信聊天记录。
微信作为拥有10亿DAU(Daily Active User)的现象级应用,还是应该在用户隐私安全方面多下点功夫的。App源码包含大量的言简意赅的Log信息,这些字符串很容易被原原本本的反编译出来,大大降低了分析反编译代码的难度。除此之外,大厂的代码一般命名规范,层次分明,基本上是见名知意,这也降低了解读代码的难度。
推荐:可乐的小程序
后台回复『微信』获取破解攻略。喜欢就点『好看』或者『分享』吧!