一、目标
- 为什么要学ARM汇编?
不为什么。
- 学了ARM汇编有用吗?
没啥用
- 学完ARM汇编能找到工作吗?
目前流行的大型软件,没有一个是拿汇编写的,所以你觉得呢?
- 那你还要学ARM汇编吗?
学学吧,反正闲着也是闲着。会点低级语言,接近计算机运行的本源,还是很拉风的。
二、步骤
Hello World!
李老板他爹,老李老板年轻的时候也是做研发的,退休了闲下来,计划练练毛笔字。
某日,风和日丽,老李老板酒过三巡,气定闲神,挥毫泼墨,在小李老板孝敬的上等宣纸上写下了 Hello World!
代码语言:txt复制.text
.globl _start
_start:
mov %r0, $1 // fd 1 (stdout)
ldr %r1, =message
mov %r2, $message_len
mov %r7, $4 // syscall 4 (write)
swi $0
mov %r0, $0 // exit status 0 (ok)
mov %r7, $1 // syscall 1 (exit)
swi $0
.data
message:
.ascii "Hello World!n"
message_len = . - message
编译
要编译这个ARM汇编源码,有两种方案
1、在Android手机上安装编译器。
2、在电脑上用Android NDK的交叉编译工具来编译。
这里我们介绍方案2,在电脑上来交叉编译。
我的开发机是 MacOs 10.14, Android NDK安装在
/Users/fenfei/Library/Android/sdk/ndk/21.3.6528147
那么在其下
toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/
目录中可以找到
arm-linux-androideabi-as和arm-linux-androideabi-ld
windows的同学应该可以在类似目录找到arm-linux-androideabi-as.exe和arm-linux-androideabi-ld.exe
这就是ARM汇编的编译程序和链接程序
代码语言:txt复制# 将.S ARM汇编源码 编译成 .o 目标文件
arm-linux-androideabi-as -o hello.o hello.S
# 将.o 目标文件 链接成 可执行文件 hello
arm-linux-androideabi-ld -o hello hello.o
adb push hello /data/local/tmp/hello
adb shell chmod x /data/local/tmp/hello
adb shell /data/local/tmp/hello
完美,人生第一个ARM汇编程序跑起来了,同样是 Hello World! 老李老板应该和我们有不一样的领悟。
敲黑板
每行ARM汇编代码的第一个单词我们称之为 汇编指令。
r0-rX 我们称为寄存器,可以理解成CPU自带的变量,访问速度比内存快的多,但是数量有限。
hello程序里面一共有 mov ldr swi 三个指令
- MOV 数据操作指令
mov %r0, $1 // 把数字1 存入到 r0寄存器里面
mov %r2, $message_len // 把字符串的长度值 存入到 r2寄存器
- LDR 内存操作指令
ldr %r1, =message // 把Msg字符串的地址 存入到 r1 寄存器
- SWI 软中断指令
实际上在这里我们可以把它理解成系统API的调用。
调用系统API write
代码语言:txt复制mov %r7, $4 // syscall 4 (write)
swi $0
而这个write API 的参数就需要查系统手册了。
https://chromium.googlesource.com/chromiumos/docs/ /master/constants/syscalls.md
三、总结
ARM汇编不需要刻意去记一大堆指令,在分析代码的过程中随用随查即可。
IT是工科,不是理科,和IT行业相似度最高的行业是盖楼房。真的,相似度相当惊人。
TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。
关注微信公众号 奋飞安全,最新技术干货实时推送