前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >代码还原的技术 ARM汇编入门教程(一) Hello World!

代码还原的技术 ARM汇编入门教程(一) Hello World!

原创
作者头像
fenfei331
修改2021-04-21 10:09:56
2.7K0
修改2021-04-21 10:09:56
举报
文章被收录于专栏:奋飞安全奋飞安全

一、目标

  • 为什么要学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 数据操作指令
代码语言:txt
复制
mov %r0, $1				 // 把数字1 存入到 r0寄存器里面
mov %r2, $message_len                    // 把字符串的长度值  存入到 r2寄存器
  • LDR 内存操作指令
代码语言:txt
复制
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汇编不需要刻意去记一大堆指令,在分析代码的过程中随用随查即可。

ffshow.jpeg
ffshow.jpeg

IT是工科,不是理科,和IT行业相似度最高的行业是盖楼房。真的,相似度相当惊人。

TIP: 本文的目的只有一个就是学习更多的逆向技巧和思路,如果有人利用本文技术去进行非法商业获取利益带来的法律责任都是操作者自己承担,和本文以及作者没关系,本文涉及到的代码项目可以去 奋飞的朋友们 知识星球自取,欢迎加入知识星球一起学习探讨技术。有问题可以加我wx: fenfei331 讨论下。

关注微信公众号 奋飞安全,最新技术干货实时推送

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、目标
  • 二、步骤
    • Hello World!
      • 编译
        • 敲黑板
        • 三、总结
        相关产品与服务
        应用安全开发
        应用安全开发(Application Security Development,下文中也叫 Xcheck)为您提供优质的代码分析服务。Xcheck 凭借优秀的算法和工程实现,能在极低的误报率和漏报率前提下,以极快的速度发现代码中存在的安全漏洞。Xcheck 采用私有化部署的模式,所以产品使用的整个生命周期,源码都不会流出公司网络,杜绝源码泄露风险。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com