Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

admin 2023年3月29日05:21:58评论322 views字数 2692阅读8分58秒阅读模式

0. 简介

    jadx是一款java逆向工具,可以将java编译的文件反编译回java代码、smali代码、以及中间语言。没有使用门槛,代码格式工整,支持的文件格式很多,支持图形化与命令行的操作方式。可以支持apk、dex、jar、class、smali、zip、xapk、aar、arsc(资源文件)、jadx(项目文件)、abb,但是它不支持修改代码。

将app拖拽进jadx就可以开始逆向分析,这里使用上次文章中开发的应用程序。
  • 源代码表示被打包进apk中能被识别的所有代码,其中包含了一些运行库和开发者写的代码。

  • 资源文件表示应用程序用到的所有资源数据

在资源文件中可以很轻松地找到AndroidManifest文件。

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

能看到当前的主界面、其他界面和一些其他配置。

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

通过类名可以找到主界面的入口点,由于是反编译的,因此可能会与源代码不同,但执行逻辑是相同的。

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

lambda表示是一个匿名方法,在java编译时为lambda单独生成的一个方法。其中synthetic表示方法是由java编译器自动生成的。

在窗口下方有一个有个标签页可以查看代码的smali、simple、fallback语言。

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

但jadx无法修改这些内容,因此需要别的工具。apktool能修改apk中的内容,并且重新打包回apk。(下载地址参考文章末尾)

通过命令 apktool.bat <APK文件> 可以开始解包apk

解包之后会在当前目录下生成同名文件的目录。

目录格式如下

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

其中apktool.yml是apktool的项目文件,当需要重新打包时还需要它。

其中META-INF是元数据信息,res是资源文件,smali是反编译出来的smali指令。

smali、smali_classes2、smali_classes3分别对应着classes.dex、classes2.dex、classes3.dex。

  1. 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

在打包过程中可能会遇到和我一样的问题:

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

这类错误表示打包资源文件时出现错误,上面的警告信息就是错误原因。出现这个错误是无法打包成apk的,需要解决这个错误。

这里错误是AndroidManifest的第二行:dataExtractionRules属性在android标签中不存在。可以简单的将这个不是特别重要的属性删除。

之后会出现第二个错误:

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

表示在colors.xml中引用的资源@android:color/Teal_800不是公开的。

可以通过@*android:color/Teal_800进行引用。

直接全文替换@android@*android

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

在这之后就能成功打包成apk了,输出apk文件在dist目录

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

在模拟器中安装mt管理器,长按apk后可对其签名

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

使用默认配置就可以

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

之后会生成 _sign.apk安装包,直接安装就可以使用。

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

此时AdsActivity就被去除了

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

  1. 2. 还可以通过修改代码来做到让AdsActivity消失

这需要apktool解包后在smali中找到AdsActivity的类

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

打开后找到onCreate方法,如果不方便看也可以结合jadx的反编译来找

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

关注findViewById后面的部分。

翻译成java就是:

Button btn = this.findViewById(0x7f080047)btn.setOnClickListener(new AdsActivity$$ExternalSyntheticLambda0());

其中0x7f080047是按钮ID,AdsActivity$$ExternalSyntheticLambda0是一个匿名类,这个类可以在同目录下的smali文件找到实现:

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

这里主要关注onClick方法,它去执行了AdsActivity的lambda$onCreate$0$com-example-myapplication-AdsActivity。

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

翻译成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看一眼

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

之后和第一步一样,上传到模拟器后使用mt管理器签名,安装。

之后就直接显示出了主界面

Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

以上是通过修改Manifest与直接修改代码的两种方式实现去除AdsActivity,不过这两种方式都会修改源apk文件,并且还需要自签名。

除此之外还有别的方式可以不修改apk的情况下直接改变程序的执行流程,如frida或xposed框架,那些会在新的文章中介绍。

JADX开源项目:https://github.com/skylot/jadx

APKTOOL开源项目:https://github.com/iBotPeaches/Apktool


原文始发于微信公众号(锋刃科技):Android逆向基础-使用Jadx与apktool工具逆向与修改Activity

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月29日05:21:58
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Android逆向基础-使用Jadx与apktool工具逆向与修改Activityhttp://cn-sec.com/archives/1635431.html

发表评论

匿名网友 填写信息