向大侠求助一段arm反汇编代码的意思

向大侠求助一段arm反汇编代码的意思,第1张

反汇编:一般是只对编译器根据高级语言差和枣生成的本机二进制可直接在芯片上棚闷执行的机器码”解析“为人类可读的汇编形式的代码(实际上最最早期的计算机 *** 作员具备直接阅读机器码和使用机器码编程的能力,不需要转换为汇编形式,这是计算机普及,程序规模也爆炸性增大后,人们就有需要转换为汇编代码来读懂机器码程序) 早期的反汇编目的是编译器生产商用来检查编译器生成代码的性能。 当今主要在得不到源代码的情况下,研究分析其他人的程序,如病毒程序的分析,系统漏洞的挖掘,或者黑\灰色产业链里的山寨抄袭功能等。通过反汇编分析其功能、算法、逻辑等。 反汇编实际就属于逆向过程,分析得到别人的功能、算法、逻辑后,再根据得到的信息再开发、增加补丁开发、防御产品开发等,在开发的过程根据实际需求而言,比如分析汇编代码得到的一个算法,可以用任意其它编程语言再现,这就是逆向编程了 逆向编程属于逆向工程, 逆向编程一般指根据反向分析别人程序的功能而使用其它编程语言编程再现该功能。 反向分析(逆向工程)不仅仅是反汇编,对不同系统平台语言平台芯片平台的不同也囊括不同内容,如反汇编则基本有对各种芯片(如吧0吧陆、arm、c5一等芯片的反汇编) 反汇编实际属于反编译,反编译就包括各种语言从低级或中间级语言到高级语言的解析 如.NET平台的C#就可由中间语言MSIL反编译成C# Java平台的就可由.class中的Java字节码反编译为Java代码 后有其它的dex虚拟机的字节码,自定义的虚拟机字节码等等 总言之,反汇编属于反编译的一个分支, 反编译是实现逆向编程的必经步骤 这些都属于IT界的”逆向工程“范畴虚拆

所有的 apk 内包含一个 classes.dex 文件。在 Dalvik上,apk包里的 dex文件在安装的时候会通过 dexopt 转化成另一个格式,叫odex(Opitimized dex),然后存在 /data/dalvik-cache里面,如:

/data/dalvik-cache/data@app@com.wochacha-1.apk@classes.dex

虽然文件后缀还是 .dex,但是这个dex和apk内的那个已经不一样了。这个文件是针对当前机器的硬件对 dex 文件进行了定制化,也就是说把这个放到别的设备上,不一定能运行。

PS: 在要编译 rom 的时候,如果参数加上 "WITH_DEXPREOPT=true",会在 /system/app/ 下同时生成 .apk 和 .odex 文件(注意,这里后缀又用的 .odex,但实际上和系统在 /data/dalvik-cache/ 下的 .dex文件是一样的)

ART

在 ART上,apk 包里的 dex文件在安装的时候通过 dex2oat,也会生成一个后缀为 .dex 的文件,放在 /data/dalvik-cache中,如:

/data/dalvik-cache/arm/system@app@Bluetooth@Bluetooth.apk@classes.dex

/data/dalvik-cache/arm64/system@vendor@app@ims@ims.apk@classes.dex

这个文件后缀叫 .dex ,但是这个文件又不一样了,这个既不是 dex 也不是 odex,用 dex2jar 的无法进行反编译的。文件格式也完全不同,因为这其实就是一个实打实的 elf文件,这个文件已经可以直接在机器上运行了。

为何 pm.jar 是空的?

首先来了解一下 ROM 的编译选项,看一下编译的时候能做什么事情, 大致了解就行了 。

编译选项

WITH_DEXPREOPT

使能编译时生成 OAT,键凳避免第一次开机时编译耗时,但会增大 system分区的空间消耗

DONT_DEXPREOPT_PREBUILTS

使能后,将不会对 Android.mk中包含了 include $(BUILD_PREBUILT)的 Apk进行 oat,例如 Gmail,它很可能会在后期通过商店自行升级,而升级后系统中的 oat文件则没有意义了,但又无法删除,会造成空间的浪费(oat比dex文件要大)

WITH_DEXPREOPT_BOOT_IMG_ONLY

仅仅针对 boot.img进行oat优化稿漏旅(boot.img中包含 boot.art和 boot.oat)

LOCAL_DEX_PREOPT ture|false|nostripping

可用于各个 Android.mk,对每个 package进行单独配置,当设置为 true时,dex文件将会从 apk中剔搜州除,如果不想剔除可使用 nostripping WPRODUCT _DEX PREOPT_*

WPRODUCT__DEX_PREOPT_*

PRODUCT_DEX_PREOPT_BOOT_FLAGS

这里的参数将会传至 dex2oat,控制 boot.img的编译优化行为。

PRODUCT_DEX_PREOPT_DEFAULT_FLAGS

控制除 boot.img 外,其他(如 jar, apk)的 OAT编译行为 例如:

PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler- filter=interpret-only

$(call add-product-dex-preopt-module- config,services,--compiler-filter=space)

WITH_DEXPREOPT_PIC ture|false

使能 position-independent code,这样在dex2oat编译生成的 odex文件在运行时将不必再从 /system 下拷贝到 /data/dalvik-cache/ 目录下, 可以节省 /data 空间

WITH_ART_SMALL_MODE true|false

设置为 true 时,将只编译处于 boot classpath 里的类,其他的均不编译,这样既能加快第一次开机时间,因为大部分必要的类已经编译过了; 同时也能节省不少空间,因为 APP 都未进行编译。缺点是可能损失一性能,这可能要平时觉察不出,但在跑分软件上会有所体现

编译选项的经典配置

为了提高第一次开机速度,WITH_DEXPREOPT是必须使能的,这样则在编译阶段会完成 dex2oat的 *** 作,避免在开机时间去做这个转码,节省了开机时间(6min以上缩短2min内)。

但会引起一个缺点,那就是 apk中还是包含了 class.dex(dexopt生成的),同时在对应的apk文件夹中又生成了已经转码成oat的 class.odex(dex2oat生成的),相当于这部分重复,造成了大量的空间浪费。

为了把 apk包里的 class.dex去除,节省空间,可以打开 DEX PREOPT DEFAULT := ture。

然而,这样开机速度是快了,而且节省了不少system空间,但开机后,我们会发现即使在 system中已经存在 class.odex的 apk,第一次开机后还是会在 /data下面生成 class.odex,如data/dalvik-cache/arm64/system@app@Music@Music.apk@classes.dex,这是何解?原来 Google为了提高安全性,在每一台机器开机时都会在之前的机器码加一个随机的偏移量,这个偏移量是随机的,每台机器都不相同,而 data分区下的这些文件就是从 system下的 class.odex加上偏移而来。

让我们先来认识下APK文件. Android的应用程序包为扩展名为.apk文件, 无论你是从手机市场里下载, 还是电脑中下载.  都是这类APK文件.  APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把android sdk编译的工程打包成一个安装程序文件,格式为apk。 APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别.

android

一个APK文件解压开通常有这样的文件夹:

META-INF 目录:

MANIFEST.MF: manifest文件

CERT.RSA: 应用程序证书

CERT.SF: SHA-1资源签名列表. 例如:

Signature-Version: 1.0

Created-By: 1.0 (Android)

SHA1-Digest-Manifest: wxqnEAI0UA5nO5QJ8CGMwjkGGWE=

...

Name: res/layout/exchange_component_back_bottom.xml

SHA1-Digest: eACjMjESj7Zkf0cBFTZ0nqWrt7w=

...

Name: res/drawable-hdpi/icon.png

SHA1-Digest: DGEqylP8W0n0iV/ZzBx3MW0WGCA=

lib: 这个目录包含某些特定编译代码, 这个文件夹分成下面这些

armeabi: 只基于所有ARM处理器的编译代码.

armeabi-v7a: 所有ARMv7处理器的编译代码

x86: 仅针对x86处理器的编译代码

mips: 为MIPS处理器的编译代码

res: 包含资源的目录不编译到资源文件,看下面:

assets: 包含应用程序的资产,可以通过AssetManager进行检索.

AndroidManifest.xml: 包含应用程序的元数据文族岁袜件,描述名称、版本、访问权限、引用应用程序的库文件。此文件在Android二进制格式, 可被工具转化为可读的纯文本XML工具,如   AXMLPrinter2,apktool,或Androguard。设置,可以通过AssetManager进行检索

classes.dex: Dalvik字节码

resources.arsc : 一个包含预编译资源文件,如二进制的XML.

有两种方法反编译APK, 如果是为了汉化程序, 可以使用apktool:

安装过程

1.下载apktool1.5.2.tar.bz2和apktool-install-windows-r05-brut1.tar.bz2

2.把两个文件都解压放在同一个目录,共三个文件

aapt.exe

apktool.bat

apktool.jar用于解包,apktool.jar和aapt.exe联合用于打包。

在命令行执行:

apktool d d:\xxx.apk d:\xxx

xxx 为你的输出目录,  然后你就可以看一些xml的资源文件, 以及兆激Smali文件. 如下图某APK文件反编译输出目录:

Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种.dex格式文件的汇编器,反汇编器。其语法是一种宽松式的Jasmin/dedexer语法,而且它实现了.dex格式所有功能.

你可以使用dex2jar, 下载后解压, 直接把apk文件拖到dex2jar.bat文件上,就可以生成对应*.jar文件,这时使用JD-GUI, 打开jar文件,就雀樱可以看到java源码,同时可以导出.

由此可见,Android应用程序反编译并不难, 加密与解密的斗争一直会持续.


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8254909.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存