网络安全攻防: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

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

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