Android软件安全与逆向分析笔记(2)

1.使用Apktool反编译apk文件后,所有的索引值保存在string.xml文件同目录下的public.xml文件中。DEX文件结构从头往下依次为:dex header->string_ids-> type_ids->proto_ids->field_ids->method_ids->class_def->other data

2.odex是OptimizedDEX的缩写,表示优化的dex文件。Dalvik虚拟机每次加载apk时需要从apk中读取classes.dex文件上,这样会耗费很多cpu时间,需采用odex方式优化的dex文件上,已经包含了加载dex必须的依赖库文件列表,Dalvik虚拟机只需检测并加载所需的依赖库即可执行相应的dex文件,这大大缩短了读取dex文件所需的时间。odex文件的结构可以理解为dex文件的一个超集。

3.每个apk文件中都包含有一个androidManifest.xml文件,它记录着软件的一些基本信息。包括软件的包名、运行的系统版本、用到的组件等。Apktool提供了反编译与打包apk文件的功能。一个Android程序由一个或多个Activity以及其它组件组成。每个Activity都是Android程序的一个显示"页面",主要负责数据的处理及展示工作。

4.内部类可分为成员内部类、静态嵌套类、方法内部类、匿名内部类。this$0是内部类自动保留的一个指向所在外部类的引用。左边的this表示为父类的引用,右边的数值0表示引用层数。this$X型字段都被指定了synthetic(合成)属性,表明它们是被编译器合成的,虚构的,代码的作者并没有声明该字段。

5.prologue:序言,开场白;对于一个非静态的方法而言,会隐含的使用p0寄存器当作类的this引用。@Retention(保留)注解。@Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型)、类型成员(方法、构造方法、成员变量、枚举值)、方法参数和本地变量(如循环变量、catch参数)。在Annotation类型的声明中使用了target可更加明晰其修饰的目标。SuppressLint注解,它的作用是辅助开发人员去除代码检查器(Lint API check)添加的警告信息。

6.这里的.registers  指令指定了方法中寄存器的总数, .locals  指令表明了方法中非参寄存器的总数,出现在方法中的第一行。P命名  第一个寄存器就是方法中的第一个参数寄存器比较:使用P命名是为了防止以后如果在方法中增加寄存器,需要对参数寄存器重新进行编号的缺点 特别说明一下:Long和Double类型是64位的,需要2个寄存器。

7.ARM是Advanced RISC Machine的缩写。embedded:嵌入式的;MIPS(Million Instructions Per Second):单字长定点指令平均执行速度 Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。java程序的安全多依赖于代码混淆技术,这种技术通过更改程序中的方法、字段名来增加静态分析的难度,从而达到程序被解的目的。ELF(Executable and Linkable-可链接 Format),是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储的标准文件格式。

8.由一条条ARM汇编指令所组成的汇编代码称为原生程主序的反汇编代码。逆向原生程序就是通过阅读这些汇编代码来了解原生程序的功能及流程。STMFD:指令用于把寄存器的值压入堆栈。LDMFD指令用于从堆栈中恢复寄存器的值,作用与STMFD恰恰相反。STR与LDR是存储器访问指令。STR R0,[R11,#var_8]就是指将R0寄存器的值保存到栈变量var_8中,LDR是内存数据放到寄存器,即装载,是读。BL为带链接的跳转指令。完成类似其它编程语言中子程序调用的功能。交叉编译工具链,指的是能在一种平台上编译出另一种平台上运行的程序的工具集合。

9.SDK:Software Development Kit,NDK:Native Development Kit。在ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器。而支持7种运行模式,分别为:usr,fiq(快速中断),irq,svc(管理模式),abt(数据访问终止),sys,und(未定义指令中止模式)。当ARM处理处于ARMy状态时,会执行32位字对齐的ARM指令,当处于Thumb状态时,执行的是16位对齐的Thumb指令。

10.Arch处理器架构,fpu协处理器类型,eabi_attribute接口属性。EABL(Embedded Application Binary Interface,嵌入式应用二进制接口)是ARM制定的一套接口规范。 BNE     不相等则跳转(Branch if Not Equal)。ARM汇编中规定:R0-R3这4个寄存器用来传递函数调用的第1个到4个参数,超出的参数通过堆栈来传递。R0寄存器同时用来存放函数调用的返回值。ARM支持5种寄存器移位寻址:LSL,LSR(逻辑右移),ASR(算术右移),ROR(循环右移),RRX(带扩展的循环右移)。LDMIA R0,{R1,R2,R3,R4}LDM是数据加载指令,指令的后缀IA表示每次执行完加载操作后R0寄存器的值自增1个字,ARM指令集中,字表示的是一个32位的数值。LDM和STM为指令前缀,表示多寄存器寻址,即一次可以传送多个寄存器值。FA,EA,FD,ED为指令后缀。块拷贝寻址可实现边续地址数据从存储器的某一位置拷贝到另一位置。块拷贝寻址地指令有LDMIA/STMIA,LDMDA/STMDA,LDMIB/STMIB,LDMDB/STMDB.指令集Thumb可以理解为ARM指令集的一个子集。

11.Android NDk直译为"安卓原生开发套件",可以将原生C、C++代码的强大功能和Android应用的图形界面结合在一起,解决软件跨平台问题。adr是小范围的地址读取伪指令,ldr是大范围的读取地址伪指令。可实际上adr是将基于PC相对偏移的地址值或基于寄存器相对地址值读取的为指令,而ldr用于加载32为立即数或一个地址到指定的寄存器中。如果在程序中想加载某个函数或者某个在联接时候指定的地址时请使用adr,例如在lds中需要重新定位的地址。当加载32为的立即数或外部地址时请用ldr。     

你可能感兴趣的:(Android软件安全与逆向分析笔记(2))