Android逆向之静态分析

Stella981
• 阅读 1032

想必打过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源码。

==============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

Android逆向之静态分析

类型二:APK程序

Android工程编译完成会得到我们想要的APK安装包,APK文件其实是一个压缩包。
修改后缀名为zip后解压,解压后的文件如下图所示:

==========================================================================================================

Android逆向之静态分析

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逆向之静态分析

很多Android逆向工具就反编译到smali文件这步。
JEB选中smali文件中按Q,就可以看到java文件。

============================================================================

Android逆向之静态分析

优点:从smali文件反编译成的java文件代码结构清晰。
缺点:无法修改。
2. ApkIDE使用:
项目->打开Apk
等待反编译完成。

============================================================================================================

Android逆向之静态分析

看到smali文件。

=======================

Android逆向之静态分析

选择要java源码的smali文件,点击下图按钮,打开Java源码。

===============================================

Android逆向之静态分析

ApkIDE关联了jd-gui,点击后将跳转到jd-gui。

===========================================

Android逆向之静态分析

ApkIDE是将APK反编译到class再用jd-gui拿到Java源码。
在ApkIDE的ApkIDE_v3.3\ApkIDE\Worksrc的项目目录下可以看到反编译后的class文件。

=====================================================================================================================

Android逆向之静态分析

优点:功能强大,可以修改反编译出来的smali文件,重新编译生成APK。
缺点:编译成后的java代码不够清晰。

3.反编译区别
Smali文件是由Smali语法编写,Smali语法宽松式的语法
所以反编译过程不同,工具不同,java源码肯定不同
下面是同一个APK用上面两个工具逆向的结果:

================================================================================================================================================================================================

Android逆向之静态分析

Android逆向之静态分析

斗哥作为一名Java开发的爱好者喜欢JEB的逆向结果,看着比较舒服。

类型三:dex文件

推荐工具dex2.jar
classes.dex文件,这个是Android源码编译过的字节码包
尝试使用dex2.jar工具拿到java源码命令如下
.\d2j-dex2jar.bat C:\Users\lin\Desktop\classes.dex ==========================================================================================================================================================================================================================

Android逆向之静态分析

jar文件可以理解为classes文件的压缩包,java虚拟机可以直接运行
用Jd-gui打开classes-dex2jar.jar就可以看到java源码

================================================================================================

Android逆向之静态分析

类型四:smali文件

当只有一个单独的smali文件时就无法用上述的工具直接进行反编译
斗哥想到ApkIDE可以对一个APK进行反编译到smali文件,对smali文件进行增删改查的操作
于是用ApkIDE打开任意一个完整的APK然后添加smali文件(APK可以用自己开发的)

==============================================================================================================================================================================

Android逆向之静态分析

将smali文件添加ApkIDE项目中。

Android逆向之静态分析

重新编译生成APK。

Android逆向之静态分析

编译成功后将在原APK目录生成一个APK。

==================================

Android逆向之静态分析

再用JEB等工具打开就能看到Ezreal.smali文件。

==========================================

Android逆向之静态分析

其他工具:

编辑器:notepad++、Sublime等
Android模拟器:夜神模拟器等

0X04 例题分析

将应用安装到模拟器查看界面是否有提示。
在文本框输入字符点击按钮提示错误,猜想是否用来判断正确的flag。

==================================================================================================================================================================

Android逆向之静态分析

使用JEB工具编译成java文件,Android文件下是sdk文件,我们要分析是com包下的源码文件。

================================================================

Android逆向之静态分析

代码量不多就三个类,先从程序入口MainActivity分析,找到关键代码块。
这句if就是判断flag是否正确。

============================================================================

[PHP] 纯文本查看 复制代码

?

1

2

3

if``(!``"flag{" + v5.toString() + "}"``.equalsIgnoreCase(arg12)) {

return v7;}

搜索类查看哪里调用了此方法。
分析得到arg12就是界面要输入的参数,这时我们知道了v5的值就是我们要的flag。

===============================================================================

Android逆向之静态分析

onCreate函数调用了checkSN方法并传入两个参数为:
MainActivity.this.edit_userName.trim()
MainActivity.this.edit_sn.getText().toString().trim()

=======================================================================================================================================================

[PHP] 纯文本查看 复制代码

?

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"

===============================================================================================================================================================

[PHP] 纯文本查看 复制代码

?

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的依赖包。

=================================================================================

[PHP] 纯文本查看 复制代码

?

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。

==============================

Android逆向之静态分析

0X05 小小总结

下期斗哥将带来Android逆向之动态分析,讲述Android开发入门、smali语法解析、动态调式smali文件。

大家有任何问题可以提问,更多文章可到i春秋论坛阅读哟~

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这