安装环境

  • 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

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


使用AndroidKiller进行APK反编译的更多相关文章

  1. 解决AndroidKiller APK 反编译失败,无法继续下一步源码反编译!

    报错背景 今天使用AndroidKiller V1.3.1,反编译一个APK,遇到如下报错: 当前 Apktool 使用版本:Android Killer Default APKTOOL 正在反编译 ...

  2. apk反编译工具

    反编译工具: apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar:将apk反编译成Java源码(classes.dex转化成jar文件) jd-gui:查看APK中 ...

  3. apk 反编译

    http://blog.csdn.net/vipzjyno1/article/details/21039349/ [置顶] Android APK反编译就这么简单 详解(附图) 标签: android ...

  4. apk反编译

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  5. JAVA_Android APK反编译就这么简单 详解(附图)

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

  6. 【转】Android APK反编译就这么简单 详解(附图)

    转载地址:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂 ...

  7. apk反编译、smali修改、回编译笔记

    最近下了一个apk程序,但是一启动会弹出一个流氓广告.这个广告不是原厂商加的,而是有人在原有apk程序的基础上,加了一个壳,让apk先启动他加的广告,再启动原来的程序,很恶心.于是想去掉它. 试了几个 ...

  8. Android APK反编译详解(附图)

    转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...

  9. Android APK反编译easy 详解

    在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...

随机推荐

  1. Elasticsearch 使用-安装

    Elasticsearch 使用-安装 官方网站 https://www.elastic.co/cn/elasticsearch/ 什么是 Elasticsearch? Elasticsearch 是 ...

  2. 『现学现忘』Git基础 — 2、Git和SVN的区别

    1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...

  3. js逆向之AES加密

    故事背景: 在获取某网站接口数据时,发现其请求的 headers 中的参数 使用了 AES算法加密 ,并对其进行校验,在此简单记录下自己的踩坑历程. AES简介: 高级加密标准(AES,Advance ...

  4. 3.SRE.操作手册:基础篇

    SRE的根基起码应该包括:SLO.监控.告警.减少琐事和简单化. SLO(服务质量目标):用于描述服务可靠性的程度. SRE的职责并不只是将"所有工作"都自动化,并保持" ...

  5. 日常使用mobx的小技巧

    日常使用mobx的小技巧 由于自己开发的项目都是中小型项目,所以在技术选型上使用了mobx.但是使用过程中发现关于mobx的技术文章并不多.于是萌发出写这篇文章的想法.请轻喷. 更新控制store渲染 ...

  6. Junit单元测试:

    * 测试分类: 1. 黑盒测试:不需要写代码,给输入值,看程序是否能够输出期望的值. 2. 白盒测试:需要写代码的.关注程序具体的执行流程. * Junit使用:白盒测试 * 步骤: 1. 定义一个测 ...

  7. 缓存中间件-Redis(二)

    在上一篇中我们简单总结和介绍了Redis的几个方面 1.使用Redis背景 2.Redis通信多路复用的基本原理 3.Redis基本数据结构 4.Redis持久化方式 这一篇我们使用简单的业务场景来介 ...

  8. 手把手带你入门ECharts

    1.什么是ECharts ECharts,缩写来自Enterprise Charts,商业级数据图表,是来自百度商业前端数据可视化团队EFE的一个开源的纯Javascript的图表库,可以流畅的运行在 ...

  9. JavaScript の querySelector 使用说明

    本文记录,JavaScript 中 querySelector 的使用方法.小白贡献,语失莫怪. // 两种 query 的 method (方法) document.querySelector(se ...

  10. VMWARE vcenter重置root密码

    1\重启VCSA 2\在GNU GRUBc的时候,按住e键,在后面加上一句命令 3.rw init=/bin/bash 4. 按CTRL-X或者按住F10,启动系统 5. 使用passwd命令修改ro ...