Android逆向之静态分析
想必打过CTF的小伙伴多多少少都触过Android逆向,所以斗哥将给大家整一期关于Android逆向的静态分析与动态分析。本期先带来Android逆向的静态分析,包括逆向工具使用、文件说明、例题解析等。
Android逆向就是反编译的过程,因为看不懂Android正向编译后的结果所以CTF中静态分析的前提是将出现文件反编译到我们看得懂一层源码,进行静态分析。
0X01 基础说明
Android应用的逻辑代码是由Java进行开发,所以是第一层就是java代码
Java虚拟机JVM运行的是java文件编译过后的class文件
Android虚拟机Dalvik并不是执行Java虚拟机JVM编译后生成的class文件,而是执行再重新整合打包后生成的dex文件编译之后的smali文件
APK:是编译完成后的Android应用程序安装包
dex文件:是class文件的打包文件
smali文件:是Dalvik字节码文件
class文件:是JVM字节码文件
0X02 工具使用
在CTF中Android题目不一定给你完整编译完成后的APK,可能是编译过程中任意文件类型,下面斗哥分以下文件类型利用工具来得到斗哥看得懂的java源码
类型一:class文件
这种情况比较简单,推荐工具jd-gui
直接将class文件拉进去就可以看到java源码。
类型二:APK程序
Android工程编译完成会得到我们想要的APK安装包,APK文件其实是一个压缩包。
修改后缀名为zip后解压,解压后的文件如下图所示:
META-INF文件夹:
存放apk签名信息,用来保证apk包的完整性和系统的安全。
res文件夹:
存放资源文件,包括icon,xml文件。
AndroidManifest.xml文件:
应用程序配置文件,每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等信息。
classes.dex文件:
可以直接在Dalvik虚拟机上加载运行的文件,由java文件经过IDE编译生成。
resources.arsc文件>
二进制资源文件,包括字符串等。
反编译APK推荐工具ApkIDE、JEB
1. JEB使用:
JEB直接导入APK,反编译完成看到smali文件。
很多Android逆向工具就反编译到smali文件这步。
JEB选中smali文件中按Q,就可以看到java文件。
优点:从smali文件反编译成的java文件代码结构清晰。
缺点:无法修改。
2. ApkIDE使用:
项目->打开Apk
等待反编译完成。
看到smali文件。
选择要java源码的smali文件,点击下图按钮,打开Java源码。
ApkIDE关联了jd-gui,点击后将跳转到jd-gui。
ApkIDE是将APK反编译到class再用jd-gui拿到Java源码。
在ApkIDE的ApkIDE_v3.3\ApkIDE\Worksrc的项目目录下可以看到反编译后的class文件。
优点:功能强大,可以修改反编译出来的smali文件,重新编译生成APK。
缺点:编译成后的java代码不够清晰。
3.反编译区别
Smali文件是由Smali语法编写,Smali语法宽松式的语法
所以反编译过程不同,工具不同,java源码肯定不同
下面是同一个APK用上面两个工具逆向的结果:
斗哥作为一名Java开发的爱好者喜欢JEB的逆向结果,看着比较舒服。
类型三:dex文件
推荐工具dex2.jar
classes.dex文件,这个是Android源码编译过的字节码包
尝试使用dex2.jar工具拿到java源码命令如下
.\d2j-dex2jar.bat C:\Users\lin\Desktop\classes.dex
jar文件可以理解为classes文件的压缩包,java虚拟机可以直接运行
用Jd-gui打开classes-dex2jar.jar就可以看到java源码
类型四:smali文件
当只有一个单独的smali文件时就无法用上述的工具直接进行反编译
斗哥想到ApkIDE可以对一个APK进行反编译到smali文件,对smali文件进行增删改查的操作
于是用ApkIDE打开任意一个完整的APK然后添加smali文件(APK可以用自己开发的)
将smali文件添加ApkIDE项目中。
重新编译生成APK。
编译成功后将在原APK目录生成一个APK。
再用JEB等工具打开就能看到Ezreal.smali文件。
其他工具:
编辑器:notepad++、Sublime等
Android模拟器:夜神模拟器等
0X04 例题分析
将应用安装到模拟器查看界面是否有提示。
在文本框输入字符点击按钮提示错误,猜想是否用来判断正确的flag。
使用JEB工具编译成java文件,Android文件下是sdk文件,我们要分析是com包下的源码文件。
代码量不多就三个类,先从程序入口MainActivity分析,找到关键代码块。
这句if就是判断flag是否正确。
1
2
3
|
if (! "flag{" + v5.toString() + "}" .equalsIgnoreCase(arg12)) {
return v7;}
|
搜索类查看哪里调用了此方法。
分析得到arg12就是界面要输入的参数,这时我们知道了v5的值就是我们要的flag。
onCreate函数调用了checkSN方法并传入两个参数为:
MainActivity.this.edit_userName.trim()
MainActivity.this.edit_sn.getText().toString().trim()
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
//OnCreate是Android中的一个特别的函数,用来“表示一个窗口正在生成”。
//其不产生窗口,只是在窗口显示前设置窗口的属性如风格、位置颜色等。
public void onCreate(Bundle arg3) {
super.onCreate(arg3);
this.setContentView(0x7F040019);
this.setTitle(0x7F06001D);
this.edit_userName = "Tenshine" ;
this.edit_sn = this.findViewById(0x7F0C0051);
this.btn_register = this.findViewById(0x7F0C0052);
this.btn_register.setOnClickListener( new View $OnClickListener () {
public void onClick(View arg5) {
if (!MainActivity.this.checkSN(MainActivity.this.edit_userName.trim(), MainActivity.this.edit_sn. getText ().toString().trim())) {
Toast.makeText(MainActivity.this, 0x7F06001E, 0).show();
}
else {
Toast.makeText(MainActivity.this, 0x7F06001B, 0).show();
MainActivity.this.btn_register.setEnabled(false);
MainActivity.this.setTitle(0x7F060019);
}
}
});
}
|
分析v5的值,v5是由v3和v4生成的,v4是一个int并直接赋值为0用于循环就可以直接使用
而v3则是toHexString方法的返回值,并要传入,v1是v1.update(arg11.getBytes());生成
arg11就是传入的参数"Tenshine"
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
private boolean checkSN(String arg11, String arg12) {
boolean v7 = false;
if (arg11 != null) {
try {
if (arg11.length() == 0) {
return v7;
}
if (arg12 == null) {
return v7;
}
if (arg12.length() != 22) {
return v7;
}
MessageDigest v1 = MessageDigest.getInstance( "MD5" );
v1.reset();
v1.update(arg11.getBytes());
String v3 = MainActivity.toHexString(v1.digest(), "" );
StringBuilder v5 = new StringBuilder();
int v4;
for (v4 = 0; v4 < v3.length(); v4 += 2) {
v5.append(v3.charAt(v4));
}
if (! "flag{" + v5.toString() + "}" .equalsIgnoreCase(arg12)) {
return v7;
}
}
catch (NoSuchAlgorithmException v2) {
goto label_40;
}
v7 = true;
}
return v7;
label_40:
v2.printStackTrace();
return v7;
}
|
将上面的分析结果,取出生成v5的关系代码
都是纯java代码,不需要Android的包引入,只需引入java的依赖包。
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Code {
static String toHexString(byte[] arg8, String arg9) {
StringBuilder v3 = new StringBuilder();
byte[] v0 = arg8;
int v5 = v0.length;
int v4;
for (v4 = 0; v4 < v5; ++v4) {
String v2 = Integer.toHexString(v0[v4] & 255);
if (v2.length() == 1) {
v3.append( '0' );
}
v3.append(v2).append(arg9);
}
return v3.toString();
}
public static void main(String[] args)throws NoSuchAlgorithmException{
MessageDigest v1 = MessageDigest.getInstance( "MD5" );
v1.reset();
v1.update( "Tenshine" .getBytes());
String v3 = Code.toHexString(v1.digest(), "" );
StringBuilder v5 = new StringBuilder();
int v4;
for (v4 = 0; v4 < v3.length(); v4 += 2) {
v5.append(v3.charAt(v4));
}
System.out.println( "flag{" + v5.toString() + "}" );
}
}
|
用IDEA编辑运行,拿到flag。
0X05 小小总结
下期斗哥将带来Android逆向之动态分析,讲述Android开发入门、smali语法解析、动态调式smali文件。
大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~
Android逆向之静态分析相关推荐
- 《教我兄弟学Android逆向10 静态分析反调试apk》
上一篇 <教我兄弟学Android逆向09 IDA动态破解登陆验证>我带你分析了黑宝宝.apk,并且用IDA动态调试破解了登陆验证 看上节课你学习的不错 这节课给你带来的是过反调试的教程 ...
- Android逆向学习---静态分析反调试apk
分析环境:JEB2.2.7+IDA7.0 测试手机:nexus IDA7.0下载链接 链接:https://pan.baidu.com/s/1xEtjnTVZFuLiMpHKwMOY2Q 密码:g3 ...
- 教我兄弟学Android逆向
作者论坛****账号:会飞的丑小鸭 课程导航: <教我兄弟学Android逆向01 编写第一个Android程序> <教我兄弟学Android逆向02 破解第一个Android程序 ...
- 《教我兄弟学Android逆向11 动态调试init_array》
上一篇 <教我兄弟学Android逆向10 静态分析反调试apk>我带你用jeb+IDA静态分析了反调试apk,并且了解了init_array和jnionload的执行顺序 通过静态pat ...
- 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )
文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...
- Android逆向与病毒分析
本文由同程旅游安全团队对内移动安全培训的PPT整理而来,面向对象为对移动安全感兴趣的研发同事,所以讲的有些宽泛.介绍了入门Android逆向需要掌握的一些知识点, 通过简单的几个案例讲解Android ...
- Android 逆向分析大全
转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...
- android逆向学习路线
学习路线: 8周 Android基础知识 学习Android开发编程,了解其原理. 熟悉Java,C和C++三种在Android系统中使用较多的语言,了解几种语言的特性. 学习Android开发,推荐 ...
- 网络流量分析与Android逆向小结
本章对之前的网络流量分析与Android逆向做个小结. 网络流量分析 原理解析 分析原理前之前先了解中间人攻击的概念:在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服 ...
- android studio怎么改软件扫码界面_一文入门Android逆向
本文节主要介绍一下Android逆向常用的环境.工具.动静态分析思路,笔者通过学习肉丝大佬分享的一些内容,加上自己一些经验总结而来. 1.环境准备 环境也分三六九等,一个好的环境能让你节省大量时间和精 ...
最新文章
- 转用特征码秒杀各程序语言按钮事件
- android主题编辑器,使用 Theme Editor 设计应用主题背景
- powermock跳过某方法_变频调速电动机产生机械共振原因和处理方法
- 后疫情时代,华为云会议如何定义未来会议?
- PowerDesigner连接mysql逆向生成pdm
- 吴恩达机器学习(十五)大规模机器学习(Batch、Stochastic、Mini-batch gradient descent、MapReduce)
- 中国通风外墙系统市场趋势报告、技术动态创新及市场预测
- 7500 cpuz跑分 i5_Intel觉醒!i7-8700K/i5-8600K首发评测:4核变6核 跑分凶残
- java实现Tomasulo算法_并行计算机组成与设计pdf
- matlab实现参数方程求导(paradiff函数)
- 北大计算机陈旭,北大图灵班——欢迎来到计算机王国
- el table 固定表头和首行_再谈table组件:固定表头和表列
- 1002:方便记忆的电话号码
- linux bt 命令行,在Linux终端下进行BT下载
- HTML5画布Canvas线段、矩形、弧形及贝塞尔曲线等简单图形绘制
- 推荐6个微信小程序天气接口Api
- 一直以来电脑只是在不断模拟人类的潜意识部分 - 思维部分就是电脑实现人工智能的目标
- 文本框底部套入勾选html,2017年3月全国二级MS OFFICE真题第2套
- 118477-06-8,Cyclo(L-Phe-trans-4-hydroxy-L-Pro),环(L-苯丙氨酰-反式-4-羟基-L-脯氨酸)
- 自己编写游戏-----android数独游戏下载
热门文章
- 你的努力,是否符合你的预期?
- linux虚拟主机用织梦,织梦程序用什么虚拟主机很服务器好
- 标签生成html怎么转换,如何进行HTML到XML转换以生成封闭标签?
- java文件读取的几个操作-2
- linux ftp常用操作,linux 操作 ftp 常用命令
- python截取某一段文字分栏_Python文本数据互相转换(pandas and win32com)
- 苹果8黑屏无法强制开机_iphonexsmax死机黑屏,iphonexsmax无法开机
- 如何理解JavaScript用三角函数计算鼠标与多个目标点的距离
- MySQL8的新特性ROLE
- Kejin Game UVALive - 7264 (最大流转最小割)