前段时间,因为一年前篡改了一个sdk的包,导致了一系列不可预知的损失,这也充分说明了技术的正确性,需要决策的正确性来支撑的。作为技术人员,不仅仅要考虑技术的可行性,也要考虑实施后的风险和结果的预期假设。 从工程角度,简单记录一下篡改sdk包的技术。
- 解压jar或者apk的包
- JD-GUI 反编译查看class的相关代码,找到修改点
- 自己编写相应的方法或者类,使用
javaassist
注入到class文件
- 重新打包
javassist
使用方法参考: https://jboss-javassist.github.io/javassist/tutorial/tutorial.html 附上测试代码,修改一个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public static void main(String[] args) { try { javassist.tools.reflect.Loader cl = new javassist.tools.reflect.Loader(); ClassPool pool = ClassPool.getDefault(); pool.insertClassPath("/tmp/aa/"); CtClass cc = pool.get("com.facebook.ads.internal.d.g"); CtMethod ctmethod = cc.getDeclaredMethod("c"); cc.getDeclaredField("c"); ctmethod.setBody(getCode()); cc.writeFile("/tmp/aa/"); } catch (CannotCompileException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
|