• android逆向工程反编译指南(详细教程)


    要反编译一定要用到工具。
    apktool是谷歌官方推出的反编译软件,只能说还能用。而且至今没有好用的IDE。android反编译就是通过apktool这个工具来实现的。其他的GUI环境,例如AndroidKiller都是给apktool套了一个壳而已。不过不得不提的是AndroidKiller这个软件还是非常的好用的,虽然已经不再更新,里面的提供的一些小工具还是非常的实用。

    最简单反编译

    使用AndroidKiller可以非常简单反编译apk(只是例子简单)。
    首先我们用Android Studio创建一个HelloWorld,不做任何的事情,我们要实现的功能就是修改App的名字。
    打开apk,AndroidKiller会自动帮我们反编译成下面的这些文件,底层使用的apktool.jar这个工具。App的名字定义在res/values/strings.xml文件里面,里面有一个name="app_name"的字段。把值修改为“被反编译了”。
    然后点击左上角的编译,AndroidKiller会自动帮我们打包并加签名。如果成功的话,会在日志的最后一行告诉你生成的apk的位置。这个就是我们反编译的文件了。把这个文件安装到模拟器或者真机上就可以了。
    修改Apk名字就这几个步骤,非常的简单。
    这里我推荐是用windows的模拟器,不要用Android Studio自带的模拟器,因为不能安装第三方应用。安装应用的时候,不要用AndroidKiller提供的安装功能,因为windows老是找不到设备,非常的难用,还要用adb查找连接,后面会介绍。编译完成后,手动将apk拖到模拟器安装。

    在这里插入图片描述
    在这里插入图片描述

    反编译步骤

    第一步:反编译
    通过apktool反编译apk,生成反编译代码。
    第二步:修改想要修改的代码或者资源
    这是最重要也是最难的地方,99%的工作量都在这。
    第三步:重新打包
    修改后的资源和代码重新打包
    第四步:签名
    重新打包后的apk是没有签名的,不能够安装,安装的话会卡住或者报错。AndroidKiller这个工具可以帮我们一键打包签名。手动也是可以的,后面会介绍。

    注意,如果是android studio开发的debug apk实际上也是不能安装的,在android studio里面能安装是因为android studio帮我们做了一些事情,直接安装是不行的。都是需要签名的。

    最传统最原始的反编译方式

    或者说是最基础的反编译方式就是用apktool.jar这个工具来进行反编译。
    通过下面的命令可以直接反编译一个apk。

    java -jar apktool.jar d test.apk
    
    • 1
    PS C:\Android\reverse> java -jar apktool.jar d test.apk
    
    I: Using Apktool 2.6.1 on test.apk
    I: Loading resource table...
    I: Decoding AndroidManifest.xml with resources...
    I: Loading resource table from file: C:\Users\Administrator\AppData\Local\apktool\framework\1.apk
    I: Regular manifest package...
    I: Decoding file-resources...
    I: Decoding values */* XMLs...
    I: Baksmaling classes.dex...
    I: Copying assets and libs...
    I: Copying unknown files...
    I: Copying original files...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    编译完会生成下面的目录和文件。
    在这里插入图片描述
    和第一个例子一样,我们修改res/values/strings.xml文件里面,里面有一个name="app_name"的字段。把值修改为“被反编译了”。
    然后通过下面的代码重新打包:

     java -jar apktool.jar b test 
    
    • 1

    默认情况下会在反编译目录下生成一个dist目录,里面就是重新打包的akp。
    在这里插入图片描述
    因为变到不同的目录还是有点不方便,我们可以指定重新打包的生成位置
    下面的代码指定重新打包的位置为当前位置,这样方便调试。

     java -jar apktool.jar b test -o release.apk
    
    • 1

    虽然我们重新打包了apk,但是这个apk是不能安装的,因为没有签名会安装失败。
    下一步我们需要重新签名。签名有很多种方式,下面的这种比较简单,需要用到signapk.jar这个文件,testkey.x509.pem testkey.pk8这些文件都是signapk.jar附带的,直接百度就能搜索到这些文件。有了这些文件后,调用下面的代码就可以给apk签名了。
    如果签名成功,就可以直接安装了。

    java -jar signapk.jar testkey.x509.pem testkey.pk8 release.apk release-signed.apk
    
    • 1

    实战:修改TextView文本

    如果TextView的文本不是写死在xml中的,而是通过setText()方法设置的,那么反编译的难度就不是一个级别的,这就需要懂安装的汇编代码。
    源码如下。

    public class MainActivity extends AppCompatActivity {
    
        private TextView textView;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            textView=findViewById(R.id.textview);
            textView.setText("This is a Text");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    反编译后汇编代码在smali目录下面,我们的目标是修改MainActivity里面的setText()方法。
    在这里插入图片描述
    打开MainActivity.smali,发现下面这些奇怪的代码(片段)。虽然看不太懂,不过没关系,是有关键字表格的,后面会提到,这里我们发现了一些我们非常熟悉的代码,比如findViewById,setText,这不就是我们想要的代码吗?

       invoke-virtual {p0, v0}, Lcom/example/apktooldemo/MainActivity;->findViewById(I)Landroid/view/View;
    
        move-result-object v0
    
        check-cast v0, Landroid/widget/TextView;
    
        iput-object v0, p0, Lcom/example/apktooldemo/MainActivity;->textView:Landroid/widget/TextView;
    
        .line 17
        const-string v1, "This is a Text"
    
        invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    很明显,我们需要关系的是下面这三行代码,setText需要传入参数,v1参数就是文本内容,这时候我们就可以手动修改这些文本内容了。我们把 “This is a Text"改为"This is a Dog”

        .line 17
        const-string v1, "This is a Text"
    
        invoke-virtual {v0, v1}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
    
    • 1
    • 2
    • 3
    • 4

    然后通过上面已经提过的打包,签名,就完成对setText文本的修改了。
    大致步骤如下

     第一步:
     java -jar apktool.jar d change_text.apk
     第二步:
     修改smali代码
     第三步:
     java -jar apktool.jar b change_text -o change_text_b.apk
     第四步:签名
     java -jar signapk.jar testkey.x509.pem testkey.pk8 change_text_b.apk change_text_b_signed.apk
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    确实修改成功了!
    在这里插入图片描述

  • 相关阅读:
    SpringCloud的新闻资讯项目04 --- 自媒体文章-自动审核
    细说晶振元件HC49U的功能、应用及性能特点 | 百能云芯
    linux 自带压力测试工具ab
    C++ 24 之 拷贝构造函数
    如何玩转CSDN AI工具集
    服务器创建虚拟环境跑代码
    阿里云使用密钥登录服务器
    HTML常见标签用法
    【Flink】需求实现之独立访客数量的计算 和 布隆过滤器的原理及使用
    计算机毕业设计开题报告怎么写丨计算机毕业设计开题报告模板下载(关注博主领取)
  • 原文地址:https://blog.csdn.net/ScottePerk/article/details/125863098