一、前言
WX小程序已经出来很久了,发展其实一般般,就我个人来说从来没用过小程序,但是最近几款小程序的出现,就带上高潮了,跳一跳游戏,包你拼,包你听等小程序,很有意思的抢红包方式。而就在这时候,突然感觉小程序的前景还是很明朗的,但是我们不会介绍小程序怎么开发,而是考虑小程序的安全问题,我们从网上大致了解了小程序的开发流程和架构,主要依赖于网页开发,以及一个企业绑定的Appid,然后生成小程序包发布,WX用户在使用小程序功能的时候,就去网络下载到本地,解压运行,基于WX的内置WebView进行解析运行。
二、分析突破口
那么如果把小程序看成一个程序包,那么他肯定也有相对应的格式,类似于apk,dex等文件。而我们之前在原生app逆向的时候都知道,必须了解这些文件的格式。所以今天我们就先来看看微信小程序包的文件格式,这一篇也是开启小程序爆破之路的开端!下面我们先来看看WX小程序包的格式解析是什么?其实在想这个问题之前,我们需要找到突破口,因为我们知道WX本地肯定也是需要解析这个包然后运行,也就是我们需要从WX的源码中找到解析格式功能。这个突破点在哪呢?第一步肯定需要知道微信小程序包的格式是什么?我们用WX的6.6.1版本,玩了一个跳一跳游戏,会发现这个游戏包不是从服务器下发的,而是就在本地,我们也知道程序包原始项目结构大致如下:
所以说,这些文件编译之后打包成固定格式,放在WX应用的某个地方,而这个地方我们最能想到的就是assets目录了,所以就解压WX应用,去assets目录下查看:
从assets目录下,可以通过分析就这几个文件目录最有可能,依次排查查看之后发现,在whatsnew_embed目录中看到类似于这个文件:
我们如果去WX后台申请过的都知道:Appid格式是wx开头,后面是一串字符格式,所以这里肯定这个文件和小程序包有非常大的关系。
三、逆向分析
为了确定是否的确是这个文件格式,我们用Jadx打开WX的dex文件,这里一定要注意:WX的这个版本的包已经非常庞大了,所以最好不要直接用Jadx打开apk,不然电脑会卡死的,我们依次打开5个dex文件即可,就这样我的电脑已经卡的不行了,但是没办法为了分析必须打开5个dex,才能搜索全!
通过搜索发现,在classes4.dex中找到了,点击进入查看保存到本地的目录:
看看a.field_pkgPath字段值如何获取:
通过ad.ae方法获取,不过这里发现点击这个类是无法跳转的,而在Jadx中这种情况一般就是这个类或者方法在其他dex中实现的,所以我们需要去其他dex中查找:
在查找之前,肯定需要知道这个类的包名,这个一般去开头的import查看即可,然后去其他dex查找:
最后找到这个方法,看到本地保存文件的路径构造,继续查看ac.VP方法,同样点击不了,所以继续查看这个类的包名:
不过在import中并没有找到这个类的包名,所以这个类应该是和ad类同包名,去其他的dex中查找:
最终在classes3.dex中找到了这个目录,到这里我们先不要继续跟入了,因为我们看到查看代码也是挺费劲的,这时候我们利用一个小技巧就是借助root之后的设备的RE管理器,直接去WX的沙盒数据目录中搜索这个目录
这个工具的搜索功能真的很好用,记住这个小技能,点击搜索查看结果:
看到了这个目录,我们直接点击进入查看:
看到目录的确是appbrand/pkg/,然后看到本地保存的程序包文件名并不是小程序appid的,而是通过hash值了,通过上面的代码也可以看出来:
WX这里应该是为了防止被人轻易看到小程序的appid,所以把文件名不要携带appid值了,所以有同学会想,既然RE有搜索功能,为什么我们不直接搜索assets目录下的小程序包名:wx7c8d593b2c3a7703_3.wxapkg呢?可以搜一下看看结果是没有的,所以我才去分析代码查找路径,所有的小程序包都会放在这个目录下:
/data/data/com.tencent.mm/MicroMsg/4d0238658a35658e7bc9597a2de4d49e/appbrand/pkg
这个目录大家一定记住,后面想要弄小程序的包直接去这个目录查找就可以了。其实到这里有的同学又想了,既然搜索全局名称找不到,那么直接搜索wxapkg可以吗?其实是可以的,这个就避免上面的繁琐查看代码步骤:
点击搜索,发现有点耗时,不过有搜索结果出现:
发现了吧的确是可以搜到的,我们也发现了这个RE工具的搜索功能的确很好用。记住这个小技能!
到这里我们就分析完了WX会把小程序包放在沙盒的指定目录下,文件格式依然是wxapkg,那么不管是从网络下载还是在本地的assets目录下,最终都会拷贝到沙盒目录中,然后进行后续的操作。那么下面继续来看WX内部是如何解析这个程序包的。突破口就很简单了,我们知道上面的小程序包本地路径是用a.field_pkgPath字段值来进行保存的,那么如果要执行小程序,肯定需要利用这个字段来读取包文件然后进行解析,所以继续去Jadx中搜索这个值:
每个包都能搜到结果,但是最终定位分析,在classes3.dex中用到解析了,这里不要纠结怎么定位的,通过大致代码阅读就可以分析出来:
看到这个WxaPkgWrappingInfo类,很像是解析文件格式的包裹器,继续查找这个类:
最终在classes.dex中找到这个类的定义:
继续查看ab这个类,方法依然和之前一样,找到import中的包名,然后去查找这个类定义:
到这里就找到了,这个解析小程序包的类了:
这里是解析头部信息的的,下面是解析数据信息:
四、编写解析工具
这块代码,没有混淆严重,我们就用Java写一个解析工具,对照着这两块代码来进行操作,首先是头部信息:
这里需要注意在WX代码中把文件个数那个字段归到索引段中了,这里为了方便就把他移动到头部信息中了,然后就是两个校验文件的魔数信息,继续查看索引段信息:
主要是解析小程序包中的文件元信息,包括文件名,文件在数据段中的偏移值和长度。有了这两个数据结构之后,就可以开始解析wxapkg文件了:
解析完文件的所有索引段信息保存起来,然后去数据段进行文件保存操作:
有了文件的名称,偏移值,长度,直接去数据段保存数据即可,我们用京东小程序作为案例进行操作,有的同学好奇,怎么拿到京东小程序的wxapkg包呢?这个我们现在有一个笨办法就是可以先把沙盒中的所有小程序包删除,然后在WX中打开京东小程序,再去沙盒小程序保存目录看就一个wxapkg文件,那肯定就是京东小程序的了,其实这个后面等获取小程序的appid之后可以很快找到程序包的!下面来看看解析的结果:
看到了吧,解析了京东小程序中所有的代码资源等信息。查看解压后的文件:
解析完了,我们开发过小程序都知道,所有的页面都在app-config.json中配置的,我们把这文件格式看看:
当然我们也可以把解压的项目导入到小程序开发工具中:
看到了,这里总共四个页面,这里有一个重要的信息就是pagePath路径,这个就是可以在WX公众号中跳转的关键信息,如果还有京东的appid的话,就可以在微信公众号绑定京东小程序,然后在文章中进行跳转操作。我们也知道公众号正文内容是不允许外链跳转的,但是小程序是可以的,如果这个可以操作对于公众号中的部分操作转化率有很大的提高,同时个人觉得未来如果小程序发展很好,程序和程序之间也是应该支持跳转的。那么应该也是基于这个路径和appid来进行操作的。而我们在上面看到WX认为现在公开小程序的appid是不安全的,但是我们是有办法获取到的,具体方案就是下一篇文章需要介绍的内容。
上面为了操作方便,就做了一个脚本文件,一键化操作即可,工具操作非常简单,直接把需要解压的wxapkg文件拖动到wxapkgparse.cmd上即可。解压后的目录是wxapkg文件名。
我们可以使用010Editor工具直接打开京东的wxapkg文件:
感兴趣的同学可以写一个010Editor的wxapkg文件解析模板造福后人!
到这里我们就把WX的小程序包文件格式解析完毕了,开始我们需要找到WX内部是如何解析的代码,那么先要找到WX的小程序包格式是什么,通过跳一跳游戏在assets目录下找到突破口,然后去代码搜索找到入口,一步一步跟踪之后找到小程序在沙盒目录保存位置,然后在更具这个位置去找解析代码。根据解析代码我们自己写一个解析工具,下面就把上面的文件格式做了一张图:
注意:WX代码中的文件格式FileCount字段是放在索引段中的,这里为了方便就把它归纳到头部信息中了!
五、技术总结
通过本文我们了解了WX的文件格式,对于后面爆破其他小程序功能是一个基石,大家也一定弄清楚这个格式,下一篇我们介绍如何获取小程序的appid和页面路径。而我们从上面的代码可以看到,WX现在并没有对wxapkg文件做加密操作,其实未来就不一定了,可以把WX看成一个运行系统,小程序就是一个独立程序,那么类似于现在的原生应用加固操作。一定需要对wxapkg文件进行加密操作了。那么这时候唯一不同的是WX一家操作,因为他具备掌控权,不过这都是未来的事,谁都说不准,搞不好哪天WX也会过时了。下面来总结一下本文掌握的知识点:
- 第一、我们在看到用Jadx来分析WX代码的痛苦之处就是包太大,导致电脑死机,只能分开打开dex,而dex文件又很多,所以查到类和类之间的引用,方法调用等往往在一个dex中无法做到快速定位,只能在每个dex中查找定位。
- 第二、本文看到一个利用RE工具的搜索功能,非常好用可以快速定位到我们想要的结果。
- 第三、WX的小程序包在应用沙盒存放目录为:/data/data/com.tencent.mm/MicroMsg/4d0238658a35658e7bc9597a2de4d49e/appbrand/pkg
- 第四、如果拿到小程序的appid和指定页面路径,我们能做的事很多。