分析过程就不讲故事了,只说结论性的东西
0. 一张图胜过千言万语
1. 核心代码加密隐藏
该广告SDK即图中A.jar,使用时import进来即可。A.jar基本都是proxyfunction,核心代码在B.jar中实现,所以B.jar是不会轻易让cracker拿到的, 如图所示
B.jar文件采用DES加密并base64编码,8字节的秘钥跟在最后面, 以StringBuffer变量形式存放在A.jar的某class中
StringBuffer jarFileContent = newStringBuffer().append("6kVkS1Ny/KKlJKs+fT9kTF--这里就是DEX密文啦--mtkc2WNXTCerh1JHGXS.....密钥)
2. DEX动态加载框架
调用接口基本类型
Object invokeObjectMethod(string 类名, string 方法名, class[] 参数类型数组,object[] 参数数组)
调用示例:
(String)invokeObjectMethod(newString("com.abc.classA"), "methodName", new Class[] {Integer.TYPE }, new Object[] { Integer.valueOf(resid) });
接口具体实现三步走
1) 获取Class
2) 获取Class对应的Object
3)reflect invoke
使用2个HashMap分别缓存Class和Class对应的Object,方便后续调用
流程如下
3. B.jar制作
按正常java开发流程编导出jar,然后使用AndroidSDK所带dx工具将jar转换成包含Dalvik byte code的jar文件,如图所示
普通jar包只是一堆class文件的集合,但经过dx优化过后的jar只包含classes.dex
4. 截获B.jar
根据图1我们知道B.jar在load完之后会被删除,那么将删除文件的代码注释掉即可(这里涉及到修改A.jar,不具体展开,请参考如何修改第三方jar自行搜索)
使用修改过的A.jar编写一个app并按照广告SDK的调用流程调用一次,B.jar会产生并留在app的数据目录,然后使用adb或者devicemonitor将B.jar pull出来
最后使用dex2jar工具将B.jar转换成普通的jar包,这样就可以使用java反编译工具进行分析了
5. DEX交叉调用出现ClassNotFound错误的解决
我在修改B.jar时遇到了这个错误,原因是SlaveDex调用了在Main Dex实现的class方法,我们知道ClassLoader的一大特点就是树状结构,每个ClassLoader都有一个父ClassLoader,这个在构建DexClassLoader时会指定,指定父ClassLoader是一件要慎重考虑的事情,ClassNotFound症结就在于此,解决办法如下图
Classloader请参考
Android系统下的动态Dex加载 http://www.cnblogs.com/xitang/p/3534777.html
6. 防篡改与抗静态分析
敏感类方法以reflect形式调用
字符串常量转换成byte数组存储new String(new byte[] { 99, 111, 109, 46, 112, 50, 48, 49, 54, 48,49, 46 })
7. 刷他家广告
我们私下聊