sdk篡改

前段时间,因为一年前篡改了一个sdk的包,导致了一系列不可预知的损失,这也充分说明了技术的正确性,需要决策的正确性来支撑的。作为技术人员,不仅仅要考虑技术的可行性,也要考虑实施后的风险和结果的预期假设。 从工程角度,简单记录一下篡改sdk包的技术。

  1. 解压jar或者apk的包
  2. JD-GUI 反编译查看class的相关代码,找到修改点
  3. 自己编写相应的方法或者类,使用 javaassist 注入到class文件
  4. 重新打包

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");
// getCode()即为需要替换的的代码
ctmethod.setBody(getCode());
cc.writeFile("/tmp/aa/");
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (NotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}