记一次某buff apk算法逆向分析 时间: 2023-04-26 22:29 分类: 逆向 ####前言 目前所有的逆向都是借助工具先反编译,脱壳那种事我还没研究过,难度太高也不想学。 目前大部分的`安卓APK`都可以通过`Bytecode Viewer`一键反编译,于是直接用起来就行了,不想搞先脱壳,然后在用`apktool`啥的来反编译,至少我还没成功过,因为基本上所有的`APK`都是加固过的。 ####分析 本次要还原的是`APP`中的`X-Device-Token`这个`http 请求头`参数。 于是在反编译`APK`后直接在工具中搜索`X-Device-Token`,找到生成代码如下: ![20230426215332.jpg](https://0o0.me/usr/uploads/2023/04/1120288119.jpg) 可以看到,生成`X-Device-Token`调用的就是`f.F0.a()`。 这种反编译后的代码都是混淆过的,所以基本上都是单个字母的包名和类目,如果单纯靠反编译的`java`代码来找出具体调用的类和方法,真的头都会给你绕炸,因为一开始我就是这么做的,绕着绕着就想放弃了。 最后找到快速定位的方法,那就是看反编译后的字节码,如上面的`f.F0.a()`,在字节码中的代码一目了然: ![20230426215954.png](https://0o0.me/usr/uploads/2023/04/1213518698.png) 看到没有,`f.F0.a()`绕来绕去,最后调用的是`k/a/a/n/i/a/f$a.a()`,除了`a()`,前面的`f.F0`都没有了,这就是混淆代码在绕弯子。在字节码代码中,很直观地可以看到整个类路径,然后查看`a()`具体实现: ![20230426220345.png](https://0o0.me/usr/uploads/2023/04/1805536793.png) 很明显,是`AES`加密,加密关键就是找`秘钥`。找秘钥的过程就不一一细说了,关键是思路,就按照前面说的,去字节码里面找具体调用,但这里有个坑要说一下:`Bytecode Viewer`这个软件搜索真的有点垃圾,只能简单的搜索`字符串`,它不能搜索`java`里面的代码,比如`public String new`等等,简单点说就是只能搜索`java`代码里的`字符串死代码`。在找调用的时候,找到后面突然给你蹦出个`interface`接口,这样一来你根本看不到具体的实现,你又不能像在`Idea`里面直接查找类的实现。出现这种情况,我一顿想要放弃,最后的做法是现将整个反编译源码保存下来,然后通过`grep -r 'implements xxx' ./*`来查找,这样虽然会找到很多同名的实现,但至少通过类路径也能轻松地找出具体实现类。 ####结束语 之所以不想将详细的分析写出来,是因为看到这些单个字母的类及包名真的头晕,简单说下上面的加密内容变量代表的东西吧: 1. `var6`:随机16个字符的`Base64`编码 2. `var1`:一顿骚操作,直接用`System.currentTimeMillis()`即可 3. `var8`:`Device-Id`,就是手机系统的`UUID`,管它怎么生成,最后就是一个`UUID`字符串 4. `var11`:秘钥key,是一个固定字符串通过下面算法生成的`byte[]`进行`Base64`编码后的结果,正好16个字符: ``` public static byte[] d(String var0) { byte[] var3 = var0.getBytes(Charset.defaultCharset()); if (var3.length % 2 != 0) { return null; } else { byte[] var2 = new byte[var0.length() / 2]; int var1 = 0; while(true) { try { if (var1 >= var0.length()) { return var2; } var2[var1 >> 1] = (byte)((a(var3[var1]) << 4) + a(var3[var1 + 1])); } catch (NumberFormatException var4) { var4.printStackTrace(); return null; } var1 += 2; } } } ``` 上面代码所在的类基本上就是一个工具类,里面全是静态方法,缺啥就直接从上面抠出来就可以了。 总结就是:比如上面那个`AES`算法,里面一大堆都是没用的调用,比如一个字符串,给你传进去,里面一顿骚操作,最后直接又给你返回去,这就是混淆(恶心人)!!!!! 标签: 无