Hello Baby Dex
jeb反编译发现不少第三方库,其中一个com.meituan.robust包搜索一下可以发现是美团开发的一个开源热更新框架
参照使用教程可以发现补丁的位置在PatchExecutor类调用的PatchManipulateImp类中的fetchPatchList方法中调用的setLocalPath方法处设置
于是跟着去找
cn.chaitin.geektan.crackme.PatchManipulateImp.fetchPatchList
方法
这里可以发现读取了GeekTan.BMP的数据
setLocalPath在下面一点儿,同样也是将GeekTan设置为文件路径
于是去assets文件夹中把这个文件扒出来,查看发现是zip结构,解压得到DEX文件
(话是这么说,能塞私货的地方其实也只有assets文件夹了。所以作为题目而言看到热补丁就可以直接去这找,反正又不可能联网更新233)
处理dex文件,用jeb/dex2jar+jd-gui都可以
再往下分析补丁,大部分教程的方法都是借助插件直接生成Patch.jar,而不提及具体内部原理,因此要分析补丁还是要找原理解析的文章
PatchExecutor开启一个子线程,通过指定的路径去读patch文件的jar包,patch文件可以为多个,每个patch文件对应一个 DexClassLoader 去加载,每个patch文件中存在PatchInfoImp,通过遍历其中的类信息进而反射修改其中 ChangeQuickRedirect 对象的值。
在补丁中的PatchInfoImp中找到这样两句,说明了补丁的类分别是MainActivity和MainAcitivity$1
localArrayList.add(new PatchedClassInfo("cn.chaitin.geektan.crackme.MainActivity", "cn.chaitin.geektan.crackme.MainActivityPatchControl"));
localArrayList.add(new PatchedClassInfo("cn.chaitin.geektan.crackme.MainActivity$1", "cn.chaitin.geektan.crackme.MainActivity$1PatchControl"));
PatchControl类用来控制Patch,没有具体方法,可以忽略
两个Patch类中则是关键的更新方法
首先是MainActivity$1中的onClick方法
发现有很多EnhancedRobustUtils.invokeReflectMethod
搜索一下可以发现解释
EnhancedRobustUtils是一个对反射的封装类,可以反射指定对象的指定字段和方法。比如说((In