吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 13411|回复: 22
收起左侧

[Android 分享] android逆向-ARM汇编基础-非虫笔记

  [复制链接]
BubblePig 发表于 2017-12-8 15:51

这里是非虫笔记本,对学习知识的一种总结。有机会可以一起学习。

ARM汇编(非虫笔记)

1.ARM汇编的目的:

分析elf文件的需要。

2.原生程序生成过程。

(1)预处理,编译器处理c代码中的预处理指令。

gcc -E hello.c -o hello.i

(2)编译 gcc编译器首先要检查代码的规范性,以及是否有语法错误,在检查无误之后,gcc编译把代码翻译成ARM汇编语言的代码。

gcc -S hello.i -o hello.s

(3)汇编,gcc编译器会挑用汇编器将汇编代码汇编成二进制目标文件。

gcc -c hello.s -o hello.o

(4)链接,这个阶段会调用链接器将二进制的目标文件链接成android平台可执行的ARM远程程序。

gcc hello.o -o hello

3.ARM知识了解

(1)与JAVA的区别:

ARM汇编语言是一门"低级"语言可以和系统的底层相互沟通。

(2)ARM汇编语言编写的程序运行速度快,占用内存少

(3)缺点是编写的代码难懂,难以维护。

(4)ARM汇编语言,c语言能实现的ARM汇编语言都能实现。

(5)ARM具有31个通用寄存器,6个状态寄存器

(6)ARM处理器支持其中运行模式。

1. 用户模式:ARM处理器正常的程序执行状态。
2.快速中断模式:用于高速数据传输或通道处理。
3.外部中断模式:用于通用的中断处理。
4.管理模式:操作系统使用的保护模式。
5.数据访问终止模式:当数据或指令预取终止时进如该模式,可用于模拟存储及存储保护。
6.系统模式:运行具有特权的操作系统任务。
7.未定义指令中止模式:当未定义的指令执行时进入该模式。

4.ARM汇编语言程序结构

(1)处理器架构定义

.arch armv5te @处理器架构
.fpu softvfp  @协处理器类型
.ebi_attribute 20,1 @接口属性
.ebi_attribute 21,1
.ebi_attribute 23,1
.ebi_attribute 24,1
.ebi_attribute 25,1
.ebi_attribute 26,1
.ebi_attribute 30,1
.ebi_attribute 18,1
.arch指定了ARM处理器架构。
.armv5te表示本程序在armv5te架构处理器上运行。
.fpu指定了协处理器的类型。
softvfp表示使用浮点运算库来模拟协处理运算。
.ebi_attribute 指定了一些接口属性。

(2)段定义:

.section 定义只读数据,属性是默认
.text 定义了代码段。
因为之前读过了8086王爽的汇编,所以对段的理解很轻松。

(3)注释与标号

注释方法:/.../多行注释,@单行注释
标号:<标号名>:
eg:
    loop:
    ...
    end loop
标号和8086汇编很类似。

(4)汇编器指令

程序中所有以"."开头的指令都是汇编指令,他们不属于ARM指令集。
部分会汇编器指令:
.file: 制定了源文件名。
.align:代码对其方式。
.ascii:声明字符串。
.global:声明全局变量。
.type:指定符号的类型。

(5)字程序与参数传递。

声明函数的方法:
.global 函数名
.type  函数名,%function
函数名:
    <...函数体...>
声明一个实现两个数相加的函数的代码
.global MyAdd
.type MyAdd,&function
MyAdd:
    add r0,r0,r1 
    mov pc,lr 
ARM汇编规定:R0-R3这4个寄存器用来传递函数调用的第1到第4个参数,超过的参数通过堆栈来传递。

(6)ARM处理器寻址方式

1.立即寻址。
mov R0,#1234 @# z作为前缀,表示16进制时以"0x"开头
2.寄存器寻址。
mov R0,R1
3.寄存器移位寻址。
五种移位操作:

(1)LSL:逻辑左移,移位后寄存器空出的低位补0
(2)LSR:逻辑右移,移位后寄存器空出的高位补0
(3)ASR:算数右移,移动过程中符号位不变。如果操作数是整数,则移位后空出的高位补0,否则补1
(4)ROR:循环右移,移位后移出的低位填入移位空出的高位。
(5)RRX:带扩展的循环右移,操作数右移移位,移位空出的高位用C标志的值填充。
eg:

mov R0,R1,LSL #2
4.寄存器间接寻址
LDR R0,[R1]
5.基址寻址
LDR R0,[R1,#-4]
6.多寄存器寻址
LDMIN R0,{R1,R2,R3,R4}
LDM 是数据加载命令
指令的后缀IA表示每次执行完成加载操作后R0寄存器的值自增1
ARM中,字表示的是一个32位。
R1=[R0]
R2=[R0+#4]
R3=[R0+#8]
R4=[R0+#12]
Ps:这里+#4的原因是因为32位占4个字节。
7.堆栈寻址。
STMFD SP!,{R1-R7,LR} 入栈,多用于保存子程序“现场”
LDMFD Sp!,{R1-R7,LR} 出栈,多用于回复子程序的现场
8.块拷贝寻址。

块拷贝可实现连续地址数据从存储器的某一位置拷贝到另一位置。

LDMIN R0!,{R1-R3} @从寄存器指向的存储单元中读取3个字到R1-R3寄存器。
9.相对寻址 。

相对寻址一程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数的有效地址。

免费评分

参与人数 17威望 +2 吾爱币 +23 热心值 +16 收起 理由
zhengyg + 1 + 1 谢谢@Thanks!
wwwmirage + 1 + 1 用心讨论,共获提升!
RHYTHM985211 + 1 + 1 已答复!
huary7 + 1 + 1 用心讨论,共获提升!
SomnusXZY + 1 + 1 热心回复!
sunnylds7 + 1 + 1 热心回复!
疯狂醉虎 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
xiangyuruchu520 + 1 + 1 我很赞同!
peter_king + 1 谢谢@Thanks!
dadao815 + 1 + 1 谢谢@Thanks!
小枭 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
whklhh + 1 + 1 谢谢@Thanks!
Simontune + 1 + 1 谢谢@Thanks!
360573078 + 1 + 1 我很赞同!
h080294 + 1 + 1 我很赞同!
qtfreet00 + 2 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
LeiSir + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

maqingyao 发表于 2017-12-8 21:41
MARK一下。。。。。。。。。
唯有孤独伴我 发表于 2017-12-9 13:50
相对寻址一程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到的操作数的有效地址。
LeiSir 发表于 2017-12-8 15:59
xk20036 发表于 2017-12-8 16:21
谢谢分享,保存来慢慢学习
 楼主| BubblePig 发表于 2017-12-8 16:32
LeiSir 发表于 2017-12-8 15:59
谢谢分享,回报你热心

非常感谢~
寒尘丶Coldust 发表于 2017-12-8 19:24
mark 多谢分享
dadao815 发表于 2017-12-8 23:48
感谢楼主的热心分享!!!!!!!!!!!!!
疯狂醉虎 发表于 2017-12-9 08:55
感谢分享!收藏备用了!
545400m 发表于 2017-12-9 10:12
看帖是一种态度,,,回帖是一种美德
sunnylds7 发表于 2017-12-9 10:14
辛苦了写这么多
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-23 17:12

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表