Android其他4-逆向工程
1.Android反编译重新打包
假设你有个简单的apk名字叫ListViewDemoMy.apk。MainActivity里面就:
setContentView(R.layout.activity_listview);
Log.d("djh", "test");
我们通过反编译,然后修改这个log。
1.1.对apk反编译
下载apk_tool:到官网google下载下。然后配置环境变量通过以下指令反编译apk
apktool d ListViewDemoMy.apk -o ListViewDemoMy
1.2.在反编译的smali添加代码
ListViewDemoMy/smali/com/example/listviewdemo/MainActivity.smali
用文本编辑打开
里面是这样的
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.prologue
.line 35
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 51
const/high16 v0, 0x7f030000
invoke-virtual {p0, v0}, Lcom/example/listviewdemo/MainActivity;->setContentView(I)V
.line 52
const-string v0, "djh"
const-string v1, "test"
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 79
return-void
.end method
我们添加个log打印
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
.locals 2
.param p1, "savedInstanceState" # Landroid/os/Bundle;
.prologue
.line 35
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 51
const/high16 v0, 0x7f030000
invoke-virtual {p0, v0}, Lcom/example/listviewdemo/MainActivity;->setContentView(I)V
.line 52
const-string v0, "djh"
const-string v1, "test"b
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
const-string v0, "djh"
const-string v1, "smali"
invoke-static {v0, v1}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
.line 79
return-void
.end method
1.3.重新打包
apktool b ListViewDemoMy new.apk
打包好的apk在工程目录的dist文件夹中。
1.4.重新签名
使用Auto-sign签名工具 签名
1.5.验证
04-11 17:45:31.715: D/djh(18428): test
04-11 17:45:31.716: D/djh(18428): smali
1.6.如何防止
1、签名验证
在Application的onCreate中 使用PM获取签名 代码如下
2、将签名上传到服务器验证
3、native 签名认证 写个jni 生成.so
4、不适用原来系统的签名 自己写个方法进行认证
2.Android逆向
2.1.dex的获取
- 反混淆
混淆的关键就是mapping.txt 文件。如果有就方便的很多。但是一般获取不到。
然后用一些反混淆工具去破解。如:
JEB或着Jadx
- 去壳脱壳
这部分请大家具体去尝试,我尝试的不多,大概的获取dex的方法也是在root机器里提取出来。
- 获取dex文件
如果没有混淆和加壳获取dex时比较方便的,直接讲apk文件解压出来,获得dex文件。
如上图一样,获得dex文件后我们对dex转成java或者smali都好。但是往往没有那么容易。我常用的获取dex的方法也是比较牢靠的方法。就是找一台root的小米手机。然后安装Xposed框架。
然后下载FDex.apk.那这个其实是Xposed的一个moudle。它可提取dex文件。具体的步骤后面我们有时间再另外写,如果没时间的话还请大家自己研究
2.2.获取更好看的源文件
通过上面的方法,我们获得了应用的dex文件,然后我们可以通过dex转化出自己需要的源文件。
方法一、dex转jar,jar转java
这里我们采用dex2jar工具。
下载dex2jar工具包,解压用如下命令
d2j-dex2jar.sh -f …/Net/classes2.dex
转成jar后,还可以用其他工具转成jar,我们这里用一个可视化的工具jd-gui。这个工具可以直接查看jar的源文件。这个工具的使用我们后面会稍微介绍一下。
方法二、apk转smali smali 转java
apk转smali我们这边使用apktool,
apktool d ListViewDemoMy.apk -o ListViewDemoMy
这个命令也可以换成如下的命令,
java -jar apktool.jar d -f XXXX.apk
为什么这么更换,因为有些java环境的问题,使得工具包的命令有时候会有些异常。
apk转smali
但是有些apk做了加密,不一定成功。看运气了。
smali转java
使用 Smali2Java把它转换成java。
这个是种基本方法,接下来我们介绍一下支持这两种方法的工具。
工具一、jadx
比如第一种方法,在dex->java的过程中有时候可以使用jadx这个工具直接一步转换。
jadx class.dex -d outputdir
工具二、dex2jar
这个我们前面已经介绍了
工具三、procyon
从jar转到java我们之前用的是jd-gui,当然还有其他工具比如Procyon,CFR等等。看个人习惯了。
java -jar /procyon-decompiler-0.5.36.jar -jar class.jar -o outputdir
工具四、jd-gui
下载安装包后,我们习惯使用java的命令行启动,因为直接二进制命令启动会有依赖问题。
java -jar jd-gui-osx-1.6.6/JD-GUI.app/Contents/Resources/Java/jd-gui-1.6.6-min.jar
工具五、安卓逆向助手
这个我目前找到了两个版本,一个是win版本的,AndroidCrackTool,另外一个是Android逆向助手.exe这两个工具的界面和原理都是一样的,就是集合了我们上面的几种工具,可以一键的导入apk,然后它会调用dex2jar,jar2java的工具包给你一站式解决。
工具六、so查看
arm-linux-objdump -d libxxx.so > libxxx.S
工具七、IDA工具
这个工具反编译so是比较好的,因为个人电脑没有安装所以没有办法掩饰。
https://blog.csdn.net/xiangshangbashaonian/article/details/82748850
可以参照这个文章。
3.相关工具放到网盘共享
链接: https://pan.baidu.com/s/1EDATByimzyqCKEIucGa39g 密码: 1cqn