【逆向分析课程】复习下篇

第四章 理解程序逻辑和算术运算

1.C程序中定义的变量,在汇编指令中,通过数据段偏移地址访问的包括:静态变量和全局变量

2.汇编指令中不能明确地区分程序编译前变量是否为有符号数

3.浮点数数据处理时,是通过8个80位寄存器和3个程序员可以使用的16位寄存器完成的。

4.8个数据寄存器组成一个循环堆栈,栈顶(ST(0))记录保存在状态寄存器中,相当于堆栈指针;3个16位寄存器:16位控制寄存器、16位状态寄存器、16位特征寄存器

5.汇编程序中,浮点数的初始值不以立即数的形式出现在指令中

6.理解指针、数组和字符串在汇编中的使用方法

**喵言喵语:**感觉ppt里面有地方写错了,我把我的想法标记在涂上。

image-20220411211520262

8.对于结构体成员变量的访问,是通过结构体的首地址加上对应的偏移进行的。结构体的地址等于结构体中第一个成员变量的地址。

9.程序指令分为顺序流指令和控制流指令:

顺序流指令是指一条指令完成后,将执行权传递给下一条指令的一类指令。

控制流指令包含了无条件分支指令、条件分支指令、函数调用指令和函数返回指令

控制流指令

10.jmp指令是无条件跳转指令,jmp指令后面跟随的操作数一般是标签、寄存器或者内存地址。

C程序中的goto、if、if-else、switch-case、while循环、do-while循环以及for循环语句在汇编程序中,都会出现条件分支指令。

其中goto语句在汇编程序中属于无条件分支指令

switch分支数较少时,会直接使用if-else来实现,当switch分支数较多时,常见的优化方案是将所有跳转的case位置偏移放在一个一维数组的表中,然后将case的值当做数组下标进行跳转。

if和if-else语句执行体中必须有一条无条件跳转指令jmp跳出执行体

算术运算

11.算术标志位

EFLAGS存储器中的大多数标志位是系统标志位,系统标志位的状态确定了处理器的当前状态,除了系统标志位外,还有8个状态标志位。状态标志位的取值与最近一次执行的算术运算的结果有关。

12.如ADD和SUB指令不管它们处理的操作数是有符号数还是无符号数;如MUL和DIV指令有无符号数版本和有符号数版本。

13.CF和OF

image-20220411215055815

OF=1,CF=0;

喵言喵语:原先ax的最高位是0,bx最高位是0,现在ax最高位是1,所以OF=1。在无符号数中容易判断CF=0。

14.对于任意一款正常的编译器来说,任何涉及两个常数操作数的算术运算都会在编译阶段被全部清除并代之以它们的运算结果。

15.LEA

image-20220411215453366

lea指令并不能区分指针和整数,lea不执行任何真正意义上的内存访问。

16.乘法和除法

当一个变量乘以另一个变量是,通常MUL/IMUL指令是最有效的工具。

对于除数是未知数的情况,编译器只能使用DIV/IDIV指令。

编译器可能利用倒数相乘的思想实现整数除法运算

17.定点运算

采用固定的小数点位置。表示小数时不再用阶码,而是保持小数点的位置不变。

第五章 Android程序逆向分析基础

1.APK文件构成

Android应用是用高级编程语言Java编写的,它利用Android SDK编译代码,并且把所有资源文件和数据统一打包成APK文件。

文件构成

目录列表说明
assets目录存放需要打包到APK的静态文件
lib目录程序依赖的native库
META-INF目录存放应用程序签名和证书的目录
res目录存放应用程序的资源
AndroidManifest.xml应用程序的配置文件
classes.dexdex可执行文件
resources.arsc资源配置文件

AndroidManifest.xml和resources.arsc是加密的。

2.反编译

Android程序中,一般通过分析AndroidManifest.xml文件中的信息获取函数的入口地址。

res目录中包含程序所涉及的几乎所有资源,在进行逆向分析时,主要关注values目录下的string.xml和public.xml

APK安装包中的classes.dex文件经过反编译后,会将其中的class文件生成对应的smali文件

虚拟机

Dalvik虚拟机在第三章中讲过了,如果忘记的话,可以回顾一下。(2条消息) 【逆向分析课程】复习上篇_karwen(.)的博客-CSDN博客

3.ART虚拟机,处理机制根本上的区别是采用了AOT技术。AOT是静态编译,会在应用程序安装时启动dex2oat过程把dex预编译成ELF文件。

​ 优点:每次运行程序的时候不用重复编译,从而优化了应用运行的速度。对内存分配和回收进行优化,降低内存碎片化程序,缩短回收时间。

​ 缺点:应用安装和系统升级之后的应用优化比较耗时,优化后文件占用额外的存储空间。

4.Android 7.0上,采用AOT/JIT混合编译的策略,特点是:应用在安装时dex不会再被编译;App运行时,dex文件先通过解析器被直接执行,热点函数会被识别并被JIT编译后存储在JIT code cache中并生成profile文件以记录热点函数的信息;手机进入空闲或充电状态时,系统会扫描App目录下的profile文件并执行AOT过程进行编译。

Smali文件

5.Dalvik寄存器是32位大小,对于64位的类型的数据,使用相邻的寄存器来存储,如v0与v1、v3与v4

smali 数据类型java 数据类型
[基本类型的数组
[l整型一维数组
[[lint[ ] [ ]
[[[lint[ ] [ ] [ ]
[Ljava/lang/String一个String对象数组

java中的对象在smali中以“Lpackage/name/ObjectName”形式表示

L表示对象类型, package/name 表示对象所在的包,ObjectName表示对象的名字,“;”表示对象名称结束

7.方法调用的格式:

Lpackage/name/ObjectName;->MethodName(III)Z

MethodName是方法名,III为参数(3个整型参数),Z是返回类型(bool型)。函数的参数是一个接一个的,中间没有隔开。

例如:

image-20220412111641928

8.类的尘缘变量表示格式

Lpackage/name/ObjectName;->FieldName:Ljava/lang/String

格式:类型;->字段名:字段类型

9.两种不同的寄存器表示法

Dalvik虚拟机参数传递方式中规定:入参使用最后的N个寄存器,局部变量使用v0开始的前M-N个寄存器

image-20220412112202179

10.如何定位关键代码的方法:

信息反馈法:使用程序提示的字符串

特征函数法:调用Android SDK中提供的相关API函数

顺序查看法:病毒分析中常用

代码注入法:手动修改apk文件的反汇编代码,加入log输出

栈跟踪法:动态调试方法

Method Profiling :动态调试方法

ARM汇编语言基础

11.ARM是一种32位嵌入式RISC处理器,共有37个寄存器(31个通用寄存器、6个状态寄存器),ARM微处理器在较新的体系结构中支持ARM指令集和Thumb指令集,ARM指令集为32位长度,Thumb指令为16位长度

12.ARM汇编语言程序结构

以程序段为单位组织代码,段是相对独立的指令或数据序列,可分为代码段和数据段。一个汇编程序至少有一个代码段,当程序较长时,可以分割为多个代码段和数据段,多个段在程序编译链接时最终形成一个可执行的映像文件

13.可执行映像文件通常由一下几部分组成

一个或多个代码段只读
零个或多个包含初始化数据的数据段可读写
零个或多个不包含初始化数据的数据段可读写

源程序中段之间的相对位置与可执行的映像文件中段的相对位置一般不会相同。

14.ARM处理器9种寻址方式

寄存器寻址、立即寻址、寄存器移位寻址、寄存器间接寻址、变址寻址、多寄存器寻址、堆栈寻址、块复制寻址、相对寻址

Thumb指令集

15.Thumb指令集中的数据处理指令的操作数是32位,指令地址也是32位,但Thumb指令集为实现16位的指令长度。大多数Thumb指令是无条件执行的,采用2地址格式。几乎所有ARM指令都是有条件执行的。

要实现特定的程序功能,所需的Thumb指令的条数较ARM指令多

第六章 Android程序逆向分析工具

协议分析工具

1.常见工具:wireshark 、Fiddler(web调试工具,记录所有客户端和服务器的http和https请求)、Burp Suite(可以进行再web应用程序的集成攻击测试平台)

静态分析工具

2.常用工具:

IDA pro:反汇编工具,用以反汇编/反编译lib目录下的so文件

dex2jar:dex->jar,dex文件是由java字节码转成的dalvik字节码

Apktool:反汇编apk,可以反编译出smali文件

jd-gui:jar->java,将jar文件反编译成java文件

动态分析工具

3.常用工具

Method Profiling 是DDMS的一款工具,对于快速概览应用中时间的消耗分布非常有用,也可用与时间关键型函数的详细查看。

Xposed框架可以在不修改APK的情况下影响程序运行的框架服务,基于它可以制作许多功能强大的模块,且在功能不冲突的情况下同时运行。

Frida基于python+java的hook框架,可运行在Android、ios、linux和Window等平台,主要使用动态二进制插桩技术。可以访问进程的内存、在应用程序中运行时覆盖一些功能、从导入的类中调用函数、在堆上查找对象实例并使用这些对象实例、hook,跟踪和拦截函数等。

插桩技术
源代码插桩额外代码注入到程序源代码中
二进制插桩额外代码注入到二进制可执行文件中
二进制插桩
静态二进制插桩在程序执行前插入额外的代码和数据,生成一个永久改变的文件
动态二进制插桩在程序运行时实时地插入额外的代码和数据,对可执行文件没有永久改变

4.免root使用Frida的方案

使用apktool反编译apk,修改smali文件和manifest文件,实现firda的加载。使

用objection工具。

本质是将frida-gadget.so放到反编译后的apk so目录下,并修改反汇编后的samli文件,插入system.loadLibrary(“frida-gadget”)对应的smali代码,从而实现frida的加载。

使用LIEF工具

原理是将frida-gadget.so与原Apk中的某个so文件链接起来,使得加载原so时,同时也加载了frida-gadget.so文件,从而实现了Frida工具。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值