Android Hotpatch系列之-给release包打Patch
2015-09-08 16:11
549 查看
在打release包时,在build/outputs/mapping/release/下面有mapping.txt,这个里面记录了混淆以前的类和混淆以后的类的一一对应关系(所以叫mapping.txt),所以每次发版以后要保留好mapping.txt文件,以便以后编写Patch。
在https://github.com/fengcunhan/Hotpatch-Sample项目中的dexposedexamples,下面新定义了一个Test类:
这个类在TestFragment中使用到,发了版本以后,发现需要将业务的逻辑改成a<=0都返回PatchSuccess,然后就坑爹了,只能发布一个Patch来做这个事情,有两种Patch编写方式都可以达到上述目的。
1.XC_MethodHook 中重写beforeHookedMethod方法,在这个里面修改传入方法的参数,如果a<0,那就设置a==0,不用改变原先方法的逻辑,就可以达成目的。
2.替换原先方法。XC_MethodReplacement,重写 replaceHookedMethod 方法,在这个方法中实现你想要的逻辑。
下面以第二种方式来编写例子。编写Patch,要替换Test类中的getHello()方法,首先要找到release包下面Test类,然后替换掉getHello方法。在mapping.txt文件中找到了Test类以及对应混淆后的新类名和方法名:
TestPatch编写如下:
注意:
1.如果是在debug下测试,因为Test class没有混淆,Patch包这边的类名就应该是com.taobao.model.Test,方法名也应该还是getHello。
2.release包的签名一定要和patch的签名一样(线上情况),如果没有这个检测,那你的应用就很不安全,恶意攻击者可以随意load一个Patch进去,后果不可想象。
3.有问题可以加入Hotpatch QQ群:254384686
在https://github.com/fengcunhan/Hotpatch-Sample项目中的dexposedexamples,下面新定义了一个Test类:
package com.taobao.model; public class Test { public String getHello(int a){ if(a==0){ return "PatchSuccess"; } return "hello"; } }
这个类在TestFragment中使用到,发了版本以后,发现需要将业务的逻辑改成a<=0都返回PatchSuccess,然后就坑爹了,只能发布一个Patch来做这个事情,有两种Patch编写方式都可以达到上述目的。
1.XC_MethodHook 中重写beforeHookedMethod方法,在这个里面修改传入方法的参数,如果a<0,那就设置a==0,不用改变原先方法的逻辑,就可以达成目的。
2.替换原先方法。XC_MethodReplacement,重写 replaceHookedMethod 方法,在这个方法中实现你想要的逻辑。
下面以第二种方式来编写例子。编写Patch,要替换Test类中的getHello()方法,首先要找到release包下面Test类,然后替换掉getHello方法。在mapping.txt文件中找到了Test类以及对应混淆后的新类名和方法名:
com.taobao.model.Test -> com.taobao.a.a://类混淆了 java.lang.String getHello(int) -> a //方法名也混淆了
TestPatch编写如下:
import android.util.Log; import com.taobao.android.dexposed.DexposedBridge; import com.taobao.android.dexposed.XC_MethodReplacement; /** * Created by renxuan on 15/9/8. */ public class TestPatch implements IPatch { private static final String TAG="TestPatch"; @Override public void handlePatch(final PatchParam patchParam) throws Throwable { { Class<?> cls = null; try { //根据混淆以后的类来找到想要Patch的class cls= patchParam.context.getClass().getClassLoader().loadClass("com.taobao.a.a"); } catch (Exception e) { e.printStackTrace(); return; } Log.e(TAG, "cls:" + cls); /** * 修改逻辑,原先是==0的时候返回Patch success,现在改成<=0都是返回Patch Success *注意添加的int.class,因为getHello是有参数的,如果没有传int.class,是找不到对应方法的。不知道为什么的人,可以去看看反射先 * */ DexposedBridge.findAndHookMethod(cls, "a",int.class,new XC_MethodReplacement() { @Override protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable { Log.e(TAG, "methodHookParam:" + methodHookParam.method.getName()); int methodArgsLength=methodHookParam.args.length; if(methodArgsLength>0){ int a=(int)methodHookParam.args[0]; if(a<=0){ return "PatchSuccess"; } } return "hello"; } }); } } }
注意:
1.如果是在debug下测试,因为Test class没有混淆,Patch包这边的类名就应该是com.taobao.model.Test,方法名也应该还是getHello。
2.release包的签名一定要和patch的签名一样(线上情况),如果没有这个检测,那你的应用就很不安全,恶意攻击者可以随意load一个Patch进去,后果不可想象。
3.有问题可以加入Hotpatch QQ群:254384686
相关文章推荐
- android 之popwindow 小结
- Android 四大组件之一:BroadcastReceiver广播机制
- 新应用的知识整理-Android studio中应用多语言支持及应用内语言切换的实现
- Android开发问题集锦-Button初始为disable状态时自定义的selector不生效问题
- mac 系统开发android,真机调试解决方案总结
- Android中SQLite应用详解
- Android layout 颜色编码
- Android基础入门教程——7.2.1 Android XML数据解析
- 使用Arcgis for Android进行路径分析的总体思路
- android 应用程序安装源码分析
- 针对Android提权代码zergRush的分析
- android Jni编译多平台so库
- 从Android到项目经理再到产品总监
- (五) Android 分享一个SharedPreferences的工具类,方便保存数据
- Android学习笔记一
- android上传图片至服务器
- android自动化测试之--使用java调用monkeyrunner(五)
- android自动化测试之--MonkeyRunner录制和回放脚本(四)
- android自动化测试之--MonkeyRunner使用实例(三)
- Android提权代码zergRush分析