使用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_NAME
,MainActivity.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 method
和virtual 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;)Z
把p1
和v0
的值进行比较
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)
添加参数-r
添加后依然报错
删除掉C:\Users\<这里填自己的用户名>\AppData\Local\apktool\framework\1.apk
文件,重新编译,无报错,修改成功
参考链接
- 教我兄弟学Android逆向系列课程+附件导航帖
- Android逆向基础:Smali语法
- Android Killer中apktool插件更新
- AndroidKiller回编译BrutException错误
END
建了一个微信的安全交流群,欢迎添加我微信备注进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注
使用AndroidKiller进行APK反编译的更多相关文章
- 解决AndroidKiller APK 反编译失败,无法继续下一步源码反编译!
报错背景 今天使用AndroidKiller V1.3.1,反编译一个APK,遇到如下报错: 当前 Apktool 使用版本:Android Killer Default APKTOOL 正在反编译 ...
- apk反编译工具
反编译工具: apktool:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar:将apk反编译成Java源码(classes.dex转化成jar文件) jd-gui:查看APK中 ...
- apk 反编译
http://blog.csdn.net/vipzjyno1/article/details/21039349/ [置顶] Android APK反编译就这么简单 详解(附图) 标签: android ...
- apk反编译
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- JAVA_Android APK反编译就这么简单 详解(附图)
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- 【转】Android APK反编译就这么简单 详解(附图)
转载地址:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂 ...
- apk反编译、smali修改、回编译笔记
最近下了一个apk程序,但是一启动会弹出一个流氓广告.这个广告不是原厂商加的,而是有人在原有apk程序的基础上,加了一个壳,让apk先启动他加的广告,再启动原来的程序,很恶心.于是想去掉它. 试了几个 ...
- Android APK反编译详解(附图)
转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...
- Android APK反编译easy 详解
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
随机推荐
- Spring Framework 学习笔记——核心技术之Spring IOC
Spring Framework 官网文档学习笔记--核心技术之Spring IOC 官方文档 spring-framework-5.3.9 1. Spring Framework 核心技术 1.1 ...
- PostgreSQL安装 报there has been an error.Error running
直接用postgresql-11.2-1:https://get.enterprisedb.com/postgresql/postgresql-11.2-1-windows-x64.exe这个版本的安 ...
- Unity-动画状态机使用细节记录
Unity动画控制器Animator功能非常强大,总结一些具体使用细节,在动作游戏中很实用: 1.动画烘焙 不同动画之间,可能存在角色朝向,重心高度不一致: 可以在动画Eidt界面设置RootTran ...
- Gitlab图床配置
注意,使用图床,如果文件在外网打开,图片不会正常显示,因为图片存储在内部的Gitlab服务器上 自行搜索Picgo安装配置,需要安装node.js 项目链接:D-W-X/picgo-plugin- ...
- 挖矿病毒分析(centos7)
因为我在工作的时候被各种挖矿病毒搞过几次,所以在这里整理下我遇到的病毒以及大神们的解决方案. 服务器中挖矿病毒后,最基本的一个特征就是CPU使用率瞬间飙升,此时可以通过top命令进行查看,确认是否有异 ...
- Java并发编程之Lock(同步锁、死锁)
这篇文章是接着我上一篇文章来的. 上一篇文章 同步锁 为什么需要同步锁? 首先,我们来看看这张图. 这是一个程序,多个对象进行抢票. package MovieDemo; public class T ...
- python跑机器学习时报错:Process finished with exit code -1073740791 (0xC0000409)
emmm...第二次遇到这个错误了,好好的好好的卷积神经网络突然就跑不起了.就弹出一堆信息也不报那行代码错了... 记录一下: 两次解决方法相同,删h5py包 Process finished wit ...
- 类变量_main方法_代码块
需要解决的问题: 统计一共创建了多少个对象 类变量(静态变量) 被所有对象共享 可以通过 类名(推荐)|对象名.变量名 方式来访问 main main 方法 是虚拟机在调用 args 传值灵活 结果 ...
- 动手实操丨RC522射频卡模块与IC卡完成充值消费查询的技术实现思路
摘要:一文手把手教你利用RC522射频卡模块与IC卡完成充值消费查询的技术实现思路. 本文分享自华为云社区<RC522射频卡模块与IC卡完成充值消费查询的技术实现思路 ...
- ASP.NET Core + SaasKit + PostgreSQL + Citus 的多租户应用程序架构示例
在 确定分布策略 中, 我们讨论了在多租户用例中使用 Citus 所需的与框架无关的数据库更改. 当前部分研究如何构建与 Citus 存储后端一起使用的多租户 ASP.NET 应用程序. http:/ ...