想必打过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是否正确。

[PHP] 纯文本查看 复制代码
?
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()

[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。

0X05 小小总结

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

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

Android逆向之静态分析相关推荐

  1. 《教我兄弟学Android逆向10 静态分析反调试apk》

    上一篇 <教我兄弟学Android逆向09 IDA动态破解登陆验证>我带你分析了黑宝宝.apk,并且用IDA动态调试破解了登陆验证 看上节课你学习的不错 这节课给你带来的是过反调试的教程 ...

  2. Android逆向学习---静态分析反调试apk

    分析环境:JEB2.2.7+IDA7.0  测试手机:nexus IDA7.0下载链接 链接:https://pan.baidu.com/s/1xEtjnTVZFuLiMpHKwMOY2Q 密码:g3 ...

  3. 教我兄弟学Android逆向

    作者论坛****账号:会飞的丑小鸭 课程导航: <教我兄弟学Android逆向01 编写第一个Android程序> <教我兄弟学Android逆向02 破解第一个Android程序 ...

  4. 《教我兄弟学Android逆向11 动态调试init_array》

    上一篇 <教我兄弟学Android逆向10 静态分析反调试apk>我带你用jeb+IDA静态分析了反调试apk,并且了解了init_array和jnionload的执行顺序 通过静态pat ...

  5. 【Android 逆向】Android 逆向方法 ( 静态逆向解析 | 函数调用分析 | 动态运行跟踪 | 运行日志分析 | 文件格式解析 | 敏感信息分析 | 网络信息监控 | 环境伪装模拟 )

    文章目录 一.Android 逆向方法 1.静态逆向解析 2.函数调用分析 3.动态运行跟踪 4.运行日志分析 5.文件格式解析 6.敏感信息分析 7.网络信息监控 8.软件动态调试 9.环境伪装模拟 ...

  6. Android逆向与病毒分析

    本文由同程旅游安全团队对内移动安全培训的PPT整理而来,面向对象为对移动安全感兴趣的研发同事,所以讲的有些宽泛.介绍了入门Android逆向需要掌握的一些知识点, 通过简单的几个案例讲解Android ...

  7. Android 逆向分析大全

    转载:Android 逆向分析大全:https://www.jianshu.com/p/a12d04fc748f 1. 概述 1.1 分析步骤 通用逆向分析步骤 1. 了解该模块正向编程相关方法 2. ...

  8. android逆向学习路线

    学习路线: 8周 Android基础知识 学习Android开发编程,了解其原理. 熟悉Java,C和C++三种在Android系统中使用较多的语言,了解几种语言的特性. 学习Android开发,推荐 ...

  9. 网络流量分析与Android逆向小结

    本章对之前的网络流量分析与Android逆向做个小结. 网络流量分析 原理解析 分析原理前之前先了解中间人攻击的概念:在中间人攻击中,攻击主机通常截断客户端和服务器的加密通信.攻击机以自己的证书替代服 ...

  10. android studio怎么改软件扫码界面_一文入门Android逆向

    本文节主要介绍一下Android逆向常用的环境.工具.动静态分析思路,笔者通过学习肉丝大佬分享的一些内容,加上自己一些经验总结而来. 1.环境准备 环境也分三六九等,一个好的环境能让你节省大量时间和精 ...

最新文章

  1. 转用特征码秒杀各程序语言按钮事件
  2. android主题编辑器,使用 Theme Editor 设计应用主题背景
  3. powermock跳过某方法_变频调速电动机产生机械共振原因和处理方法
  4. 后疫情时代,华为云会议如何定义未来会议?
  5. PowerDesigner连接mysql逆向生成pdm
  6. 吴恩达机器学习(十五)大规模机器学习(Batch、Stochastic、Mini-batch gradient descent、MapReduce)
  7. 中国通风外墙系统市场趋势报告、技术动态创新及市场预测
  8. 7500 cpuz跑分 i5_Intel觉醒!i7-8700K/i5-8600K首发评测:4核变6核 跑分凶残
  9. java实现Tomasulo算法_并行计算机组成与设计pdf
  10. matlab实现参数方程求导(paradiff函数)
  11. 北大计算机陈旭,北大图灵班——欢迎来到计算机王国
  12. el table 固定表头和首行_再谈table组件:固定表头和表列
  13. 1002:方便记忆的电话号码
  14. linux bt 命令行,在Linux终端下进行BT下载
  15. HTML5画布Canvas线段、矩形、弧形及贝塞尔曲线等简单图形绘制
  16. 推荐6个微信小程序天气接口Api
  17. 一直以来电脑只是在不断模拟人类的潜意识部分 - 思维部分就是电脑实现人工智能的目标
  18. 文本框底部套入勾选html,2017年3月全国二级MS OFFICE真题第2套
  19. 118477-06-8,Cyclo(L-Phe-trans-4-hydroxy-L-Pro),环(L-苯丙氨酰-反式-4-羟基-L-脯氨酸)
  20. 自己编写游戏-----android数独游戏下载

热门文章

  1. 你的努力,是否符合你的预期?
  2. linux虚拟主机用织梦,织梦程序用什么虚拟主机很服务器好
  3. 标签生成html怎么转换,如何进行HTML到XML转换以生成封闭标签?
  4. java文件读取的几个操作-2
  5. linux ftp常用操作,linux 操作 ftp 常用命令
  6. python截取某一段文字分栏_Python文本数据互相转换(pandas and win32com)
  7. 苹果8黑屏无法强制开机_iphonexsmax死机黑屏,iphonexsmax无法开机
  8. 如何理解JavaScript用三角函数计算鼠标与多个目标点的距离
  9. MySQL8的新特性ROLE
  10. Kejin Game UVALive - 7264 (最大流转最小割)