网络安全攻防:Android App逆向

 [[400923]]

1. Dalvik虚拟机概述

Google于2007年底正式发布了Android SDK,Dalvik虚拟机也第一次进入了我们的视野。它的作者是丹·伯恩斯坦(Dan Bornstein),名字来源于他的祖先曾经居住过的名叫Dalvik的小渔村。Dalvik虚拟机作为Android平台的核心组件,拥有如下几个特点。

(1)体积小,占用内存空间小。

(2)专用的DEX可执行文件格式,体积更小,执行速度更快。

(3)常量池采用32位索引值,寻址类方法名、字段名、常量更快。

(4)基于寄存器架构,并拥有一套完整的指令系统。

(5)提供了对象生命周期管理、堆栈管理、线程管理、安全和异常管理以及垃圾回收等重要功能。

(6)所有的Android程序都运行在Android系统进程里,每个进程对应着一个Dalvik虚拟机实例。

Dalvik虚拟机与传统的Java虚拟机有着许多不同点,两者并不兼容,它们显著的不同点主要表现在以下几个方面。

(1)Java虚拟机运行的是Java字节码,Dalvik虚拟机运行的是Dalvik字节码。

(2)Dalvik可执行文件体积更小。

(3)Java虚拟机基于栈架构,Dalvik虚拟机基于寄存器架构。

2. Smali概述

Dalvik虚拟机(Dalvik VM)是Google专门为Android平台设计的一套虚拟机。区别于标准Java虚拟机JVM的class文件格式,Dalvik VM拥有专属的DEX可执行文件格式和指令集代码。Smali和Baksmali 则是针对 DEX 执行文件格式的汇编器和反汇编器,反汇编后DEX文件会产生.smali后缀的代码文件,Smali代码拥有特定的格式与语法,Smali语言是对Dalvik虚拟机字节码的一种解释。

Smali 语言起初是由一个名叫 JesusFreke 的黑客对 Dalvik 字节码的翻译,并非一种官方标准语言,因为 Dalvik 虚拟机名字来源于冰岛一个小渔村的名字,Smali和Baksmali 便取自冰岛语中的“汇编器”和“反编器”。目前,Smali 是在 Google Code上的一个开源项目。

虽然主流的DEX可执行文件反汇编工具不少,如Dedexer、IDA Pro,但Smali提供反汇编功能的同时,也提供了打包反汇编代码重新生成 DEX 的功能,因此 Smali 被广泛地用于App广告注入、汉化和破解,ROM定制等方面。

3. APKtool工具介绍

APKtool工具是在Smali工具的基础上进行封装和改进的,除了对DEX文件的汇编和反汇编功能外,还可以对 APK 中已编译成二进制的资源文件进行反编译和重新编译。同时也支持给Smali代码添加调试信息以支持断点调试。

在介绍APKtool使用之前,我们先来看一个APK包的组成。APK文件其实是zip压缩包格式,使用工具进行解压后,以HelloWorld.apk为例,如图1所示。

图1  解压文件

使用APKtool反编译HelloWorld.apk文件的方法,如图2所示。

图2  反编译文件

执行apktool d命令成功后会在HelloWorld目录下产生如下所示的一级目录结构,如图3所示。

图3  一级目录结构

在浏览各个子目录的结构后,我们可以发现其结构原始 App 工程目录结构基本一致,Smali目录结构对应原始的Java源码SRC目录,而META-INF目录已经不见了,因为反编译会丢失签名信息。反编译后会多生成apktool.yml文件,这个文件记录着APKtool版本和APK文件名和是否是framework文件等基本信息,在APKtool重新编译时会使用到。

4. Smali格式结构介绍

(1)文件格式

无论是普通类、抽象类、接口类或内部类,在反编译出的代码中,它们都以单独的Smali文件来存放。每个Smali文件头3行描述了当前类的一些信息,格式如下。 

  1. .class<访问权限>[修饰关键字]<类名> 
  2. .super<父类名>  
  3. .source<源文件名> 

打开HelloWorld.smali文件,头3行代码如下。 

  1. .class public LHelloWorld;  
  2. .super Landroid/app/Activity;  
  3. .source "HelloWorld.java" 

第1行“.class”指令指定了当前类的类名。在本例中,类的访问权限为public,类名为“LHelloWorld;”,类名开头的L是遵循Dalvik字节码的相关约定,表示后面跟随的字符串为一个类。

第 2 行的“.super”指令指定了当前类的父类。本例中的“LHelloWorld;”的父类为“Landroid/app/Activity;”。

第3行的“.source”指令指定了当前类的源文件名。经过混淆的DEX文件,反编译出来的Smali代码可能没有源文件信息,因此,“.source”行的代码可能为空。

前3行代码过后就是类的主体部分了,一个类可以由多个字段或方法组成。

(2)类的结构

无论普通类、抽象类、接口类还是内部类,反编译的时候会为每个类单独生成一个Smali文件,但是内部类相存在相对比较特殊的地方。

内部类的文件是“[外部类]$[内部类].smali”的形式来命名的,匿名内部类文件以“[外部类]$[数字].smali”来命名。

内部类访问外部类的私有方法和变量时,都要通过编译器生成的“合成方法”来间接访问。

编译器会把外部类的引用作为第一个参数插入到会内部类的构造器参数列表。

内部类的构造器中是先保存外部类的引用到一个“合成变量”,再初始化外部类,最后才初始化自身。 

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/152760.html<

(0)
管理的头像管理
上一篇2025-03-14 03:56
下一篇 2025-03-14 03:57

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注