天天看点

Android软件安全与逆向分析

1. 如何分析android程序

破解第一个程序

破解流程:

1.  通常方法是将apk文件利用ApkTool反编译,生成Smali格式的反汇编代码,然后阅读Smali文件的代码来理解程序的运行机制,找到程序的突破口经行修改,最后使用ApkTool重新编译生成apk文件并签名,最后运行测试,如此循环,直至程序被成功破解。

2.  在实际分析中还可以使用IDA Pro直接分析apk文件,或者dex2jar与jd-gui配合来进行java源码级的分析

反编译APK文件

ApkTool是跨平台的工具,可以在Windows平台和Ubuntu平台下直接使用。下载地址:http://ibotpeaches.github.io/Apktool/

windows平台需下载apktool和apktool-install-windows-r04-brut1两个压缩包,将下载的文件解压到同一个目录下然后将该目录添加到系统的path环境变量中。

反编译apk文件命令:apktool d[ecode] [OPTS] <file.apk> [<dir>]

反编译apk文件命令:apktool b[uild] [OPTS] <app_path> [<out_file>]

3. 进入AndroidDalvik虚拟机

3.1.2 Dalvik 虚拟机与Java 虚拟机的区别

1. Java虚拟机运行的是java字节码,Dalvik虚拟机运行的是Dalvik字节码

        2. Dalvik可执行文件体积更小

Android软件安全与逆向分析

3.  Java虚拟机与Dalvik虚拟机架构不同

      java虚拟机基于栈结构。程序在运行时虚拟机需要频繁的从栈上读取或写入数据,这个过程需要更多的指令分派与内存访问次数,会耗费不少cpu时间,对于像手机设备资源有限的设备来说这是相当大的一笔开销。

    Dalvik虚拟机基于寄存器架构。数据的访问通过寄存器键直接传递。这样的访问方式比基于栈方式要快很多。

    分析java字节码与Dalvik字节码的区别

public class Hello{

public int foo(int a,int b ){

return (a+b)*(a-b);

}

public static void main(){

Hello hello = new Hello();

System.out.println(hello.foo(5,3));

}

}

生成Hello.class 和Hello.dex 然后分别反编译成对应字节码

public int foo(int,int){

Code:

0: iload_1

1: iload_2

2: iadd

                        3: iload_1

                        4: iload_2

5: isub

6: imul

7: ireturn

}

Hello.foo:(II)

0000: add-int v0, v3 , v4

0002: sub-int v1, v3 , v4

        0004: mul-int/2addr  v0, v1 

0005: return v0

3.2 Dalvik 汇编语言基础为分析Android程序做准备

  指令语法有指令的未描述与指令格式来决定

位描述:

每16位的字采用空格分割开来

指令格式

4. 静态分析Android程序

Android软件安全与逆向分析

1.  打包资源文件,生成R文件

2. 处理aidl文件,生成对应的java文件

3. 变异工程源代码,生成相应的class文件

4. 转换所有的class文件,生成classes.dex文件

5. 打包生成APK文件

6. 对apk文件进行签名

7. 对签名后的APK文件进行对齐处理

4.6 Android 应用程序另类破解方法

在破解的世界里,有一款强大的静态反汇编工具IDA Pro,使用它可以非常方便的找到程序破解点对应的文件偏移。

5.7 恶意软件分析工具包-Androguard

6. 基于Android的ARM汇编语言基础--逆向原生

6. android NDK程序逆向分析

7. 动态调试Android程序

8. android软件破解技术

9. Android程序的反破解技术

10. Android系统的攻击与防范

11. Android系统攻击与防范

12. DroidKongFu 变种病毒实例分析