宝哥软件园

安卓“行动力”培训游——微信小程序反向助手插件工具开发详解.

编辑:宝哥软件园 来源:互联网 时间:2021-12-09

一、前言

前一篇文章详细介绍了微信小程序的格式。在前一篇文章中,我们还了解到小程序存储在沙盒目录中。但是为了小程序安全,微信处理了文件名,这让我们很难找到小程序对应的包文件。因此,本文将开发一个辅助插件,可以检查微信小程序的appid并快速找到对应的小程序文件,然后使用之前的分析工具直接在本地分析包。

二、添加小程序菜单

第一步是国际惯例。如果我们想要一些临时小程序的信息,包括appid、版本号、本地存储路径的文件名等。如何才能在微信页面显示?让我们首先看看小程序的页面:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图1)

然后我们开始找到这个布局菜单,添加我们想要的菜单信息。有很多方法可以找到这个条目,比如在反编译字符串信息后寻找对应的id值,或者使用ui工具直接查看id信息。这里我用这个方法:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图2)

看到id是c8p,然后反编译微信后在values/public.xml中查找这个值。记住它是type=id,name=c8p:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图3)

找到后,将id值转换成十进制,然后在Jadx中搜索。在这里,请注意,我已经说过很多次了。微信已经拆封,微信包很大。直接用Jadx打开微信会卡住,需要依次解压打开它所有的dex文件,然后在每个dex里搜索这个值:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图4)

然后继续搜索:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图5)

参考位置:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图6)

单击以查看定义:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图7)

然后我来到这个班,使用RecyclerView控件。这个类应该是初始化底部菜单的地方。我们需要找到这个控件的A。

dapter,查看如何添加菜单的,因为拆包导致这个类被分的很开,而这个类有很多内部类,所以我们依次在每个dex中查找这个包下的这个类以及他的内部类,最终在这个地方看到:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图8)

这里就要对android应用开发有点熟练了,应用开发都用过RecyclerView控件,他的adapter编写格式都是统一的,这里看到及时混淆了,一看大致逻辑就清楚了。不过可惜的是,这个地方有个很大的坑,害得我浪费很多时间:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图9)

我一直在g类中找a这个方法,但是找了好几遍都没找到,结果在smali代码中找到了:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图10)

所以说没有一个工具是万能的,千万别相信任何一个工具。被坑残了。然后我们看到返回值其实是g类的局部变量qWf,类型是com.tencent.mm.ui.base.n可以直接搜这个类看看:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图11)

看到这里就明白了,这个是微信内部的统一菜单类,有一个菜单子选项的列表,然后继续回去看g类的那个变量qWf:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图12)

看看他在哪里初始化的:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图13)

点击进行查看:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图14)

好了,在这里初始化的,所以我们就可以进行hook操作了:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图15)

hook操作就不多解释了,很简单了结合反射即可:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图16)

注意这里的菜单内容先不要关心,后面会介绍如何获取小程序的appid和版本号以及保存路径的,然后运行模块,查看添加的菜单信息:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图17)

好了到这里我们就把这三个菜单添加好了,第一个菜单是为了查看小程序的appid和版本号信息,点击可以复制,第二菜单是小程序包的保存路径,点击可以复制路径。第三个是解析小程序包源码。主要借助之前介绍的解析小程序包工具。

三、获取小程序的相关信息

那么下面继续来看如何获取小程序包的appid和版本号信息,以及本地保存的文件路径,入口也很操作,用ui工具查看当前布局即可,不过这里我在介绍新的技巧就是用adb shell dumpsys activity top命令查看view结构:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图18)

我们知道WX内部的所有WebView都是自己开发的x5内核,而小程序加载肯定得用WebView的,所以从这找到突破口,然后去Jadx找这个u类,而且在之前分析过了,微信小程序的功能都在com.tencent.mm.plugin.appbrand这个包下面的:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图19)

看到这个类果然是继承微信的内部统一WebView,然后无意中发现这个类中有appid字段了,为什么我们会按照这思路去找appid呢?因为小程序入口在webview加载的,那么肯定在这个地方用到了appid了,所以我们的思路没有问题的,继续查看这个字段的使用:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图20)

看到这个地方在构造一个webview需要加载的url信息,看到appid参与其中了,还有一个字段,其实这个就是小程序的版本号,后面我们会看到。我们可以先hook这个方法看看appid是否能获取到:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图21)

这里做了一个处理,就是把appid分离出来以及版本号,然后保存到全局变量中,用于菜单显示使用,我们运行模块,看看运行结果:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图22)

我们知道小程序的appid都是wx开头的,这里可以看到的确拿到了appid值,那么第二个到底是不是版本号呢?后面会说,先来看看如何获取小程序包路径信息,这里我们这么操作,因为我们在之前已经知道了小程序包都是放在这个目录下:

/data/data/com.tencent.mm/MicroMsg/4d0238658a35658e7bc9597a2de4d49e/appbrand/pkg/

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图23)

我们全局搜索wxapkg,看看这个文件名是如何定义的:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图24)

找到这个地方,格式和我们看到的很类似,这样我们直接hook这个方法,看看返回值路径是什么,以及传入的参数是啥:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图25)

运行模块查看结果:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图26)

看到这里发现第一个参数就是小程序appid,第二个参数很有可能就是版本号,返回的路径也是上面我们知道的,那么有的同学好奇了,这里直接hook然后保存一下路径不就可以了吗?其实我们在hook发现,这个方法只有首次加载程序包会调用。但是我们想要的效果是每次打开小程序点击菜单都能看到。如果保存很不方便。所以这里我们直接用appid和版本号进行构造,构造方式如下:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图24)

小程序appid字符串的hashCode值和版本号即可。有了之前的固定路径那么就可以了。下面再来看一下这个参数到底是不是版本号呢?查看这个ae方法的调用地方:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图28)

这里通过字段名称就可以看到就是版本号了。所以到这里我们就把小程序的appid,版本号,路径构造方法获取到了,下面操作就简单了。需要hook上面继承webview类的u类的aeN方法即可,然后通过分解获取到appid和版本号,上面已经运行有结果了,这里不在演示了:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图29)

看到这个方法是每次打开小程序都会调用,我们只要做个简单判断,有appid和版本号就保存到全局变量。然后在打开菜单的时候,把这两个信息放到菜单中,然后在利用这两个字段构造出本地小程序包的路径放在第二菜单中。最后一个菜单就是解析小程序了。这里我们的操作很简单了,先把沙盒中的wxapkg拷贝到SD卡下的指定目录,然后在借助之前写的解析小程序包工具直接解析即可。

四、添加菜单点击事件

下面还有一个问题就是菜单的点击事件,这个我们还是要回到之前的g类中以及内部类中进行查看,最终找到这个类,因为g类和内部类不是很多,按个找dex很快就定位到了:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图30)

然后我们拦截这个onItemClick方法,处理0,1,2这三个我们添加的菜单点击事件即可:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图31)

这样我们就处理了三个菜单选项的点击事件了,菜单名称使用之前hook成功的appid值,路径构造是appid值和版本号即可,主要说一下最后的解析工作:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图32)

先把wxapkg包从沙盒中拷贝到SD卡的指定目录中,然后传入路径,开始执行我之前写的解析小程序包的工具即可。

严重声明

本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。鉴于安全问题,样本和源码都去编码美丽小密圈自取!微信扫一扫进入小密圈:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图33)

五、总结

好了到这里,我们就把整个工具插件写完了,我们主要分为三部分:

第一部分:添加菜单用于展示小程序的信息,包括appid,版本号,本地程序包路径。

第二部分:通过分析获取到小程序的appid,版本号信息保存用于第一步的菜单内容展示。

第三部分:添加子菜单的点击事件,路径和appid点击就是赋值信息。解析小程序包直接调用之前的工具即可。

而在这三部分的突破口都是利用界面View分析获取到的,有两种方式:一种是借助UI分析工具,一种是利用adb命令;两种方式都是可以操作使用的。下面来看看我们操作的效果吧:

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图34)

复制路径和appid值

Android"挂逼"修练之行--微信小程序逆向辅助插件工具开发详解 ...(图35)

解析程序包到本地

到这里我们就完成了本次操作,大家可以看到这个插件对于小白用户没啥用途,但是对于我们后续的逆向操作非常有用的,我们如果想逆向哪个小程序,直接解压看源码即可。也可以拷贝到电脑上进行分析更方便了。其实每次写微信插件都很费劲的,原因就在于微信包太大了,导致电脑非常的卡。所以写个插件不容易,喜欢的就点个赞分享吧!

更多资讯
游戏推荐
更多+