_StriveG Blog

反编译随笔

前言

前段时间反编译某个app的时候发现一点小技巧,记录一下,实际上,这对于代码保护是没有半点用处的。

发现的过程

首先,按照反编译的过程,jadx-gui,选中要发编译的apk。手机启动那个app的具体Activity,我们想要的东西在这里,比如书一个View之类的。

首先我们需要获取到这个activity的全限定路径。

1
adb shell dumpsys activity | grep '包名'

很简单的获取到路径,打开那个activity,追踪到view,jadx find class,没找到。。。这是,我们很清楚的知道,要么是进行了加壳,要么是动态加载。从source code的结构上来看,排除加壳。那么我们就从Application入手。查看动态加载以及那部分dex的生成过程。

拔出代码

在Application中,发现如下一段代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private void a() {
File dir = getDir("tbcache", 0);
File dir2 = getDir("tbcache_optimized", 0);
String str = dir.getAbsolutePath() + "/result.dex";
try {
b.a((Application) this);
} catch (IOException e) {
e.printStackTrace();
}
try {
a.a(getClassLoader(), str, dir2.getAbsolutePath());
} catch (Exception e2) {
e2.printStackTrace();
Log.e(a, e2.toString());
}
}

很明显,我们不管result.dex是如何生成的,我们需要这段dex,通过adb导出,用jd-gui打开便可找到我们想看的代码。

总结:

那个App用到的技术点:

  1. multidex 打包,将核心或者是某些class打到一个dex中,
  2. 对那个dex进行操作,组装成一个不能直接打开的dex
  3. 取出,动态加载

最近访客