开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比
ARM32体系中有31或33个通用寄存器,没有特定的某种态下有r0-r15一共16个寄存器,快速中断态下有另一组r8-r12备份寄存器,在用户态和系统态之外其它态下都各自有一组r13-r14备份寄存器,总共33个寄存器,在特定的态下会使用其各自的特有的备份寄存器。一般用户态常用的通用寄存器为r0-r12。而r13用作堆栈指针sp,r14用作返回地址lr,r15用作程序计数器pc。
另外还有一个状态寄存器CPSR,在用户态和系统态还各自有一个用于备份的SPSR寄存器,用于在退出其它态时恢复CPSR。
ARM有两种指令集分别为arm指令和thumb指令,指令长度固定,分别是32位和16位。
arm指令不能直接对内存进行运算,没有串传输指令。
arm指令可以同时对状态标志进行判断,如addeq, movne, bcc。我猜这个指令特性可以减少许多在运算中的跳转,降低分支命中出错,或避免像x86越来越复杂的指令预取和分支预测技术。
arm和x86各有所长各有所专,系统平台也一样。
arm32 与 x86 寄存器类比:
| arm32 | x86 |
| r0-r7 |
eax, ebx, ecx, edx, edi, esi, ebp (还少一个) |
|
r8-r12 |
|
| r13 | esp |
| r14 | |
| r15 | eip |
| CPSR | flags |
常用指令类比:
arm32 x86
str r0, [r1] mov [r1], r0 movl %r0, (%r1)
ldr r0, [r1] mov r0, [r1] movl (%r1), %r0
str r0, [r1, r2] mov [r1+r2], r0
ldr r0, [r1, r2] mov r0, [r1+r2]
str r0, [r1, #4] mov [r1+4], r0
ldr r0, [r1, #4] mov r0, [r1+4]
str r0, [r1, r2, LRL #3] mov [r1+r2*8], r0
str r0, [r1, r2, LSR #3] mov r3, r2 x86须借用r3作中间运算
shr r3, 3
mov [r1+r3], r0
ldr r0, =0xcdcdcdcd mov r0, [0cdcdcdcdh]
ldr r0, [r1], #4 mov r0, [r1]
lea r1, [r1+4]
ldr r0, [r1], LRL #3 mov r0, [r1]
shl r1, 3
ldr r0, [r1], r2, LRL #3 mov r0, [r1+r2*8]
lea r1, [r1+r2*8]
ldr r0, [r1, #4]! lea r1, [r1+4]
mov r0, [r1]
ldr r0, [r1, r2, LRL #3]! lea r1, [r1+r2*8]
mov r0, [r1]
ldmfd sp!, {r0-r3} pop r0
pop r1
pop r2
pop r3
stmfd sp!, {r0-r3} push r0
push r1
push r2
push r3
stmfd sp, {r0-r3} mov [esp], r0
mov [esp-4], r1
mov [esp-8], r2
mov [esp-12], r3
add r1, r1, r2, LRL #3 lea r1, [r1+r2*8]
add r0, r0, #4 add r0, 4
add r0, r0, r1 add r0, r1
sub r0, r0, r1 sub r0, r1
sbc r0, r0, r1 sub r0, r1
rsb r0, r0, r1, #4 lea r2, [r1+4]
sub r2, r0
mov r0, r2
smull r0, r1, r2, r3 mov eax, r2
mul r3
mov r0, eax
mov r1, edx
smlal r0, r1, r2, r3 mov eax, r2
mul r3
add r0, eax
adc r1, edx
and r0, r0, r1 and r0, r1
orr r0, r0, r1 or r0, r1
eor r0, r0, r1 xor r0, r1
bic r0, r0, r1 mov r2, r1
not r2
and r0, r2
mvn r0, r1 mov r2, r1
not r2
mov r0, r2
mvn r0, r1, #-1 mov r2, r1
neg r2
mov r0, r2
mvn r0, r0, #-1 neg r0
tst r0, r1 test r0, r1
teq r0, r1 mov r2, r1
xor r2, r0
test r2, r2
bl call ; 自动 mov lr, pc,保存返回地址
b jmp
bx jmp ; 带模式切换,自动修改cpsr寄存器的控制域。
bgt jg ; 根据标志位N(SF),V(OF)
blo jb ; 根据标志位C(CF),Z(ZF)
beq je
bne jne
addeq r0, r0, r1 jne $+n
add r0, r1
ldrb r0, [r1] movzx eax, byte ptr[ebx]
ldrsb r0, [r1] movsx eax, byte ptr[ebx]
ldrh r0, [r1] movzx eax, word ptr[ebx]
ldrsh r0, [r1] movsx eax, word ptr[ebx]
strb r0, [r1] mov byte ptr[ebx], al
strh r0, [r1] mov word ptr[ebx], ax
ldr r0, [r1. #0x4]! lead eax, [ebx+0x4]
mov eax, dword ptr[ebx]
arm数据传送指令方向注意事项:
arm数据传送指令分为两类,分别是ld(load Ld <-- Rs)和st(store Ls --> Rd);其它为默认方向。不同于x86指令(intel风格:左目标右源,at&t风格左源右目标)统一固定操作方向。
修改日期:2016.8.7
1.str r0, [r1, r2, LSR #3],格式修正。
2.arm数据传送指令方向注意事项。
修改日期:2015.12.25
1. 31个通用寄存器和33个通用寄存器的区别在于,后者多了一个安全监视态。
2.bgt与blo,跟x86的jb与jl类比不适当。
3. 追加对内存进行字节,字传输指令类比。
修改日期: 2017.11.10
1. 添加感叹号语句
开始逆向objc基础准备(一)简单认识一下arm32,以及与x86汇编指令类比的更多相关文章
- java线程基础巩固---数据同步引入并结合jconsole,jstack以及汇编指令认识synchronized关键字
对于多线程编程而言其实老生成谈的就是数据同步问题,接下来就会开始接触这块的东东,比较麻烦,但是也是非常重要,所以按部就班的一点点去专研它,下面开始. 数据同步引入: 这里用之前写过的银行叫号的功能做为 ...
- 开始逆向objc基础准备(二)我的平台是simulator-x86_64
建项目运行中断调试,lldb中显示寄存器看到有rax-r15, stm0-stm7, xmm0-xmm15, ymm0-ymm15,即为x64体系支持sse4. 再在lldb中查看寄存器别名得到以下对 ...
- Android逆向-Android基础逆向(5)
本文作者:i春秋作家——HAI_ 0×00 前言 不知所以然,请看 Android逆向-Android基础逆向(1)Android逆向-Android基础逆向(2)Android逆向-Android基 ...
- JS基础(超级简单)
1 JS基础(超级简单) 1.1 数据类型 1.1.1 基本类型: 1) Number:特别注意:NaN的检测方法:Nan!=NaN;或者使用isNaN方法 2) ...
- JMeter基础之一 一个简单的性能测试
JMeter基础之一 一个简单的性能测试 上一节中,我们了解了jmeter的一此主要元件,那么这些元件如何使用到性能测试中呢.这一节创建一个简单的测试计划来使用这些元件.该计划对应的测试需求. 1)测 ...
- ArcGIS Pro 简明教程(2)基础操作和简单制图
ArcGIS Pro 简明教程(2)基础操作和简单制图 By 李远祥 本章主要介绍ArcGIS Pro如何加载数据并进行简单的地图制作,以基本的操作为主. 上一章节介绍过,ArcGIS Pro是可以直 ...
- Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址
Android BLE与终端通信(一)--Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址 Hello,工作需要,也必须开始向BLE方向学习了,公司的核心技术就是BLE终端 ...
- [Songqw.Net 基础]WPF实现简单的插件化开发
原文:[Songqw.Net 基础]WPF实现简单的插件化开发 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/ar ...
- RE-1 逆向分析基础
逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: ...
随机推荐
- java学习2-数据类型和运算符
1.数据类型分类 java是强类型语言:a.所有的变量必须先声明后使用 b.指定类型的变量只能接受类型与之匹配的值 java语言支持的类型分为两类:基本类型和引用类型. 基本类型:包括boolean类 ...
- mac外接显示器 字体发虚解决方案
描述 今天买的LG性价比之王21:9的2k显示器到了,但是连接mbp后发现,字体发虚,模糊 Macbook 外接显示器默认为 TV 模式,TV 渲染模式下,文字效果非常非常非常差 解决 下载 patc ...
- webpack 4 移除 CommonsChunkPlugin,取而代之的是两个新的配置项(optimization.splitChunks 和 optimization.runtimeChunk
默认方式 webpack模式模式现在已经做了一些通用性优化,适用于多数使用者. 需要注意的是:默认模式只影响按需(on-demand)加载的代码块(chunk),因为改变初始代码块会影响声明在HTML ...
- JVM学习记录2--垃圾回收算法
首先要明确,垃圾回收管理jvm的堆内存,方法区是堆内存的一部分,所以也是. 而本地方法栈,虚拟机栈,程序计数器随着线程开始而产生,线程的结束而消亡,是不需要垃圾回收的. 1. 判断对象是否可以被回收 ...
- Bran的内核开发教程(bkerndev)-07 中断描述符表(IDT)
中断描述符表(IDT) 中断描述符表(IDT)用于告诉处理器调用哪个中断服务程序(ISR)来处理异常或汇编中的"int"指令.每当设备完成请求并需要服务事, 中断请求也会调用I ...
- 【Linux系列】Linux基础知识整理
Linux操作系统在服务器领域广泛的使用到,作为一个后台开发工程师很有必要了解Linux相关的知识. 本篇日志是我学习Linux过程中的简单记录和总结.本着"理论够用,实践为主"的 ...
- 很详细很详细的gitLab使用具体流程
gitLab详细流程 先说一下整个流程,就是先建立一个项目-----拆分里程碑-----拆分issue----项目开发-----项目总结---关闭里程碑 下面是每个步骤具体的步骤,这个比较适合那种纯新 ...
- Windows下内网渗透常用命令总结
域内信息收集常用命令 net group /domain //获得所有域用户组列表 net group zzh /domain //显示域中zzh组的成员 net group zzh /del /do ...
- Flex 和 Bison 使用方法
背景知识 在学编译原理的时候,同时在做南京大学的编译原理课程实验,这里是链接,整个实验的效果是实现一个完整的 C-- 语法的编译器.C-- 语法是他们老师指定的一种类 C 语言. Flex 和 Bis ...
- CSPS模拟 78
大敛好稳啊..居然在模拟赛拿了540.. 有点畏惧.jpg 而我就是什么什么不行级人物了.. 真正在联赛拉开那么多分怎么追啊.. T1kmp?hash? T2 概率小到炸精时,对答案也就没贡献了 然后 ...