严重声明
本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。
同样以微信7.0.3为例:
其实之前做微信消息监控的时候做过红包监控,大概知道Hook点,要改很容易,但从读者的角度讲清楚流程就有些费时费力了,只好尽量讲清楚了。
红包详情页
红包金额的显示就在红包详情页LuckyMoneyDetailUI,不管是收到红包后第一次点击,还是再次点击,终归会进入到红包详情页。
所以重点就在LuckyMoneyDetailUI这个页面。jadx打开apk后搜索类LuckyMoneyDetailUI。
打开后变量下就是十几二十个匿名内部类,直接跳过寻找onCreate方法。
数据来源
可以看到有很多getIntent()方法的调用。
一般情况下我看到很多getIntent()就会打印一下数据,能传过来的大部分都是有用的。
[Java] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 | findAndHookMethod( "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI" , loadPackageParam.classLoader, "onCreate" , Bundle. class , new XC_MethodHook() { @Override protected void beforeHookedMethod( final MethodHookParam param) throws Throwable { super .beforeHookedMethod(param); Bundle bundle=((Activity)param.thisObject).getIntent().getExtras(); StringBuffer buffer= new StringBuffer( "onCreate--" ); for (String s : bundle.keySet()) { buffer.append( "-key=" +s+ "=value=" ); buffer.append(bundle.get(s)+ "\n" ); } log(buffer.toString()); } }); |
可以看到打印数据如下:
可以看到detail_info这个bit数组是很可疑的。继续跟踪:
可以看到获取到bit数组后会转化为一个数据类对象。如果这个对象是null的话就直接finish掉了。
由此可见这个数据类对象是很重要的。
可以看到这个数据类中的变量都是基础数据类型,我们可以把这个数据类对象打印一下,因为这个对象不为null的时候传入了m21242a方法,所以直接hook a方法的参数:
[Java] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | final Class<?> modelClass = XposedHelpers.findClass( "com.tencent.mm.plugin.luckymoney.model.j" , loadPackageParam.classLoader); findAndHookMethod( "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI" , loadPackageParam.classLoader, "a" , modelClass, new XC_MethodHook() { @Override protected void beforeHookedMethod( final MethodHookParam param) throws Throwable { super .beforeHookedMethod(param); log( "LuckyMoneyDetailUI-" + Tools.beanToString(param.args[ 0 ])); } }); public static String beanToString(Object object) { if (object== null ){ return "null" ; } return ( new Gson()).toJson(object); } |
拦截到的数据类打印结果如下:
这是两次红包的数据,对比如下:
因为第一次收到红包金额是0.01,第二次是0.03,所以第一次是1第二次是3的数据就比较可疑。
可以看到有三个字段是可疑的,至于nuf中的list集合为什么不计入其中,因为这个数据既是单人红包也是多人红包,list集合就是展示所有抢了这个红包的人的信息的。
所以只分析前三个字段直接在页面搜索.cGT .ntR .ntS
只有cGT有使用到
可以看到cGT在某个位置赋值给了field_receiveAmount,代表了收到的金额数,而且在this.npx.setText(C9368e.m15470F(((double) c45587j.cGT) / 100.0d));更可以确定是金额格式化后进行setText展示。
Xposed修改
直接修改cGT这一变量。
[Java] 纯文本查看 复制代码
01 02 03 04 05 06 07 08 09 10 11 | findAndHookMethod( "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI" , loadPackageParam.classLoader, "a" , modelClass, new XC_MethodHook() { @Override protected void beforeHookedMethod( final MethodHookParam param) throws Throwable { super .beforeHookedMethod(param); log( "LuckyMoneyDetailUI-" + Tools.beanToString(param.args[ 0 ])); XposedHelpers.setLongField(param.args[ 0 ], "cGT" ,100000000L); } }); |
直接修改为100W。