0. 简介
jadx是一款java逆向工具,可以将java编译的文件反编译回java代码、smali代码、以及中间语言。没有使用门槛,代码格式工整,支持的文件格式很多,支持图形化与命令行的操作方式。可以支持apk、dex、jar、class、smali、zip、xapk、aar、arsc(资源文件)、jadx(项目文件)、abb,但是它不支持修改代码。
-
源代码表示被打包进apk中能被识别的所有代码,其中包含了一些运行库和开发者写的代码。
-
资源文件表示应用程序用到的所有资源数据
在资源文件中可以很轻松地找到AndroidManifest文件。
能看到当前的主界面、其他界面和一些其他配置。
通过类名可以找到主界面的入口点,由于是反编译的,因此可能会与源代码不同,但执行逻辑是相同的。
lambda表示是一个匿名方法,在java编译时为lambda单独生成的一个方法。其中synthetic表示方法是由java编译器自动生成的。
在窗口下方有一个有个标签页可以查看代码的smali、simple、fallback语言。
但jadx无法修改这些内容,因此需要别的工具。apktool能修改apk中的内容,并且重新打包回apk。(下载地址参考文章末尾)
通过命令 apktool.bat <APK文件> 可以开始解包apk
解包之后会在当前目录下生成同名文件的目录。
目录格式如下
其中apktool.yml是apktool的项目文件,当需要重新打包时还需要它。
其中META-INF是元数据信息,res是资源文件,smali是反编译出来的smali指令。
smali、smali_classes2、smali_classes3分别对应着classes.dex、classes2.dex、classes3.dex。
-
1. 首先通过AndroidManifest我们可以直接修改主Activity来跳过AdsActivity。
将以下代码移动到com.example.myapplication.MainActivity的Activity下。
<intent-filter>
<category android:name="android.intent.category.LAUNCHER"/>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
并且修改android:exported为true
保存后使用 apktool <文件夹名称>即可直接封包。
使用命令apktool.bat <带有apktool.yml文件的目录> 可进行打包回apk
在打包过程中可能会遇到和我一样的问题:
这类错误表示打包资源文件时出现错误,上面的警告信息就是错误原因。出现这个错误是无法打包成apk的,需要解决这个错误。
这里的错误是AndroidManifest的第二行:dataExtractionRules属性在android标签中不存在。可以简单的将这个不是特别重要的属性删除。
之后会出现第二个错误:
表示在colors.xml中引用的资源@android:color/Teal_800不是公开的。
可以通过@*android:color/Teal_800进行引用。
直接全文替换@android为@*android
在这之后就能成功打包成apk了,输出apk文件在dist目录
在模拟器中安装mt管理器,长按apk后可对其签名
使用默认配置就可以
之后会生成 _sign.apk安装包,直接安装就可以使用。
此时AdsActivity就被去除了
-
2. 还可以通过修改代码来做到让AdsActivity消失
这需要apktool解包后在smali中找到AdsActivity的类
打开后找到onCreate方法,如果不方便看也可以结合jadx的反编译来找
关注findViewById后面的部分。
翻译成java就是:
Button btn = this.findViewById(0x7f080047)
btn.setOnClickListener(new AdsActivity$$ExternalSyntheticLambda0());
其中0x7f080047是按钮ID,AdsActivity$$ExternalSyntheticLambda0是一个匿名类,这个类可以在同目录下的smali文件找到实现:
这里主要关注onClick方法,它去执行了AdsActivity的lambda$onCreate$0$com-example-myapplication-AdsActivity。
翻译成java就是,刚好一个完整的跳转Activity的语句。
Intent intent = new Intent()
intent.setClass(this, MainActivity.class);
startActivity(intent);
因此我们只需要把这个调用提前到Ads的onCreate里面,而不是放在onClick里面就可以直接跳过AdsActivity了。
那么我们只需要在onCreate的后面追加
invoke-virtual {p0, v0}, Lcom/example/myapplication/AdsActivity;->lambda$onCreate$0$com-example-myapplication-AdsActivity(Landroid/view/View;)V
invoke-virtual表示执行虚方法,p0 表示this,v0表示0x7f080047所指的按钮,后面一串表示这个方法全名。
修改后同样使用apktool进行打包
如果不确定是否修改对了,可以用jadx看一眼
之后和第一步一样,上传到模拟器后使用mt管理器签名,安装。
之后就直接显示出了主界面
以上是通过修改Manifest与直接修改代码的两种方式实现去除AdsActivity,不过这两种方式都会修改源apk文件,并且还需要自签名。
除此之外还有别的方式可以不修改apk的情况下直接改变程序的执行流程,如frida或xposed框架,那些会在新的文章中介绍。
JADX开源项目:https://github.com/skylot/jadx
APKTOOL开源项目:https://github.com/iBotPeaches/Apktool
原文始发于微信公众号(锋刃科技):Android逆向基础-使用Jadx与apktool工具逆向与修改Activity
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论