• 使用AndroidKiller进行APK反编译


    安装环境

    • JDK
      最好用JDK8,问就是坑太多了
    • Android Studio
      官网安装即可,安装教程如下

    https://www.runoob.com/android/android-studio-install.html

    实际上还有一些杂七杂八的东西,后面遇到的时候再安装

    编写第一个Android APP

    打开Android Studio,创建一个Empty Activity

    编写MainActivity.java代码

    package com.example.test2;
    
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
        EditText Name; //定义Plain Test控件第一个输入框的名字
        EditText Pass; //定义Plain Test控件第二个输入框的名字
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Name = (EditText) findViewById(R.id.TEST_NAME); //通过findViewById找到输入框控件对应的id并给它起一个名字
            Pass = (EditText) findViewById(R.id.TEST_PASS);//通过findViewById
            // 找到输入框控件对应的id并给它起一个名字
            Button Login = (Button) findViewById(R.id.BTN_Login);//通过findViewById找到按钮控件对应的id并给它起一个名字
            Login.setOnClickListener(new View.OnClickListener() { //监听有没有点击按钮控件 如果点击了就会执行onClick函数
                @Override
                public void onClick(View view) {
                    check(Name.getText().toString().trim(),Pass.getText().toString().trim()); //调用check函数
                }
            });
        }
        public void check(String name,String pass)
        {
            if(name.equals("admin")&&pass.equals("admin123"))
            {
                Toast.makeText(MainActivity.this,"登录成功", Toast.LENGTH_SHORT).show();//弹框
            }
            else
                Toast.makeText(MainActivity.this,"登录失败", Toast.LENGTH_SHORT).show();//弹框
        }
    }
    

    打开activity_main.xml,点击Design进行可视化拖拽编程

    拖拽生成用户名和密码框,以及一个登录按钮

    组件的属性需要跟上面的MainActivity.java中的对应

    例如这里的用户名输入框的id是TEST_NAMEMainActivity.java中用户名输入框代码为:

    Name = (EditText) findViewById(R.id.TEST_NAME);
    
    

    模拟运行、手机安装

    选择一个对应的手机型号模板,开始运行

    输入用户名密码正确时(admin/admin123),显示登录成功;输入用户名密码错误时(xxx/xxx),显示登陆失败

    登陆成功

    登陆失败

    选择build apk,生成手机安装的apk文件

    将生成的apk文件传给手机就能够安装运行了

    Android逆向工具

    安卓逆向的工具很多,这里我们使用Android Killer

    链接:http://pan.baidu.com/s/1skClh3f 密码:6u0q

    下载解压,配置JDK路径

    现在就能够正常使用该工具了

    逆向初体验

    将我们刚才生成的apk文件拖进Android Killer,等待反编译结束

    可以注意到这里是smali文件,smali是Android虚拟机的反汇编语言

    我们都知道,Android代码一般是用java编写的,执行java程序一般需要用到java虚拟机,在Android平台上也不例外,但是出于性能上的考虑,并没有使用标准的JVM,而是使用专门的Android虚拟机(5.0以下为Dalvik,5.0以上为ART)。Android虚拟机的可执行文件并不是普通的class文件,而是再重新整合打包后生成的dex文件。dex文件反编译之后就是Smali代码,所以说,Smali语言是Android虚拟机的反汇编语言。

    我们暂时不需要刻意去学习smali语法,看不懂的地方就先百度,看得多了常见的就会了

    寻找smali文件中的check方法,也就是之前我们编写用来判断用户输入用户名密码是否正确的函数,下面对该部分代码逐行讲解

    # virtual methods

    smali中函数分为两类:direct methodvirtual method,direct method就是private私有方法,virtual method就是指其余的方法。

    .method public check(Ljava/lang/String;Ljava/lang/String;)V check方法

    .locals 2 指定了方法内局部变量的个数,这里是用户名和密码两个

    两个变量

    .param p1, "name"    # Ljava/lang/String;
    .param p2, "pass"    # Ljava/lang/String;
    

    .line 31 表示java源文件中指定行

    const-string v0, "admin" 定义常量字符串,即 v0 = admin

    invoke-virtual {p1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Zp1v0的值进行比较

    move-result v0 将上个函数的执行结果传递给v0,这里的上个函数是equals

    const/4 v1, 0x0 将值0x0存到v1本地寄存器

    if-eqz v0, :cond_0 如果v0等于0,则跳转到cond_0

    cond_0部分的代码为登陆失败代码

    :cond_0
    const-string v0, "\u767b\u5f55\u5931\u8d25"
    
    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
    
    move-result-object v0
    
    invoke-virtual {v0}, Landroid/widget/Toast;->show()V
    

    检测密码的流程也类似,当检测通过后,就会进入登录成功逻辑

    const-string v0, "\u767b\u5f55\u6210\u529f"
    
    invoke-static {p0, v0, v1}, Landroid/widget/Toast;->makeText(Landroid/content/Context;Ljava/lang/CharSequence;I)Landroid/widget/Toast;
    
    move-result-object v0
    
    invoke-virtual {v0}, Landroid/widget/Toast;->show()V
    

    所以整个逻辑就是用户名密码传递给了p1,p2,然后与硬编码的v0依次进行比较,如果不相等则v0为0,登录失败,如果用户名密码都正确,程序才会往下执行,显示登录成功

    想要在不知道密码的情况下修改smali代码,从而登陆成功的方法有很多种,比如原文中给出了将if-eqz修改为if-nez;删除掉判断语句;使用goto语句直接跳转等方式

    这里我们直接修改比较逻辑

    然后重新编译为新的apk

    回编的时候报错了

    Exception in thread "main" brut.androlib.AndrolibException: brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1)
    

    出现这个问题一般是apktool.jar的版本太老了的原因,在官网下载最新版本即可:https://ibotpeaches.github.io/Apktool/install/

    将下载的jar放置在AndroidKiller\bin\apktool\apktool文件夹下,并且重命名为ShakaApktool.jar,也就是将原来的那个过时jar覆盖掉

    该问题也可以编辑APKTOOL管理器来进行指定apktool.jar进行操作

    重新编译时出现新的问题:

    brut.androlib.AndrolibException: brut.common.BrutException: could not exec (exit code = 1)
    

    根据文章apktool重打包失败原因之一分析

    添加参数-r


    添加后依然报错

    删除掉C:\Users\<这里填自己的用户名>\AppData\Local\apktool\framework\1.apk文件,重新编译,无报错,修改成功

    参考链接

    END

    建了一个微信的安全交流群,欢迎添加我微信备注进群,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注

    GIF GIF
  • 相关阅读:
    这一年来,我的初三
    LGOJP4381 [IOI2008]Island
    BZOJ4484: [Jsoi2015]最小表示
    二分图染色及最大匹配(匈牙利算法)略解
    2019牛客多校第三场 F.Planting Trees
    性能优化 | 30个Java性能优化技巧,你会吗?
    进程 | 线程 | 当Linux多线程遭遇Linux多进程
    性能面试 | 性能测试常见面试题
    性能调优 | 如何通过性能调优突破 MySQL 数据库性能瓶颈?
    性能分析 | Java服务器内存过高&CPU过高问题排查
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/16405519.html
Copyright © 2020-2023  润新知