270 likes | 293 Views
安卓应用逆向工程. ANDROID APPLICATION REVERSE ENGINEERING. 封奕成 BadBoyRED. What's APK?. What's in the APK?. 1. asset: 在 java 代码中通过 AssetManager 类来访问的一个资源目录,项目编译时不会被编译生成索引文件。. What's in the APK?. AssetManager 对 asset 的相关方法:. What's in the APK?. 2. res:
E N D
安卓应用逆向工程 ANDROID APPLICATION REVERSE ENGINEERING 封奕成 BadBoyRED
What's in the APK? 1. asset: 在java代码中通过AssetManager类来访问的一个资源目录,项目编译时不会被编译生成索引文件。
What's in the APK? AssetManager对asset的相关方法:
What's in the APK? 2. res: 在项目编译时也会被一起编译的资源目录,被编译后会生成索引文件,在java代码中只需要通过R.resourceType.fileName来访问。
What's in the APK? 访问res的相关操作:
What's in the APK? 3. lib: 存放.so文件。 .so文件:.so文件是unix的动态连接库,是二进制文件,作用相当于windows下的.dll文件。并且,Android应用支持的cpu架构取决于APK中位于lib目录中的.so文件。
What's in the APK? 4. META-INF: 存放工程的一些属性文件。 5. AndroidManifest.xml: Android工程基础配置属性文件。
What's in the APK? 6. classes.dex: java代码编译得到的可被Dalvik VM直接运行的文件。 7. resources.arsc 对res目录下资源的一个索引文件。
What's Smali? Dalvik VM: Google专门为Android平台设计的一套虚拟机,拥有专属的DEX可执行文件格式和指令集代码。 [Based on stack] JVM: .java -> .class -> .jar [Based on register] Dalvik VM: .java -> .class -> .dex -> .odex Smali: 类比汇编语言,smali语言是对 Dalvik 虚拟机字节码的一种解释。
What's Smali? 原始类型:
What's Smali? 定义方法: functionName (Type1Type2Type3...)returnType *Type之间紧挨着,没有任何间隔符。
What's Smali? 条件跳转:
What's Smali? 条件跳转:
What's AndroidKiller? AndroidKiller:类比IDA,AndroidKiller是对apk文件解包,并可以把smali语言转换到java语言的小(he)工(wu)具(qi),还可以改包等等。
What's AndroidKiller? 查看程序入口: *入口为net.bluelotus.tomorrow.easyandroid.MainActivity
What's AndroidKiller? 单击程序入口,即可显示程序入口代码所在的类。
What's AndroidKiller? 界面上方有Android逆向常用工具:
What's AndroidKiller? 在工程管理器中可以查看包内容的架构:
What's AndroidKiller? AndroidKiller最重要的功能之一是可以改包并且重编译。当把smali代码更改了之后,通过Android菜单下的编译可以将当前工程重编译,得到目的APK。 当同时有多个工程存在时,通过批量编译可以编译多个工程。 由于不同版本的Apktool的编译情况存在微小差异,通过Apktool管理器可以更改默认Apktool。
What’s Apktool? AndroidKiller的解包改包相关功能都是直接通过Apktool实现的。 Apktool v2.2.6的选项集:
What’s Apktool? APK解包: apktool d filename.apk
What’s Apktool? APK重打包: apktool b directoryName
What’s Apktool? APK签名: jarsigner -verbose -keystorekeyStoreName.keystore -signedjarnewFileName.apkoriginalFileName.apkkeyStoreName.keystore