Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >代码还原的技术 ARM汇编入门教程(二) 加减乘除

代码还原的技术 ARM汇编入门教程(二) 加减乘除

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

一、目标

遥想当年上小学的时候,语文是先学 人口手 上中下;数学就是先数数,然后加减乘除了。

今天的目标就是ARM汇编的加减乘除

二、步骤

伪代码

代码语言:txt
AI代码解释
复制
int add(int a, int b) {
    return a + b;
}

int calc(int a, int b, int c, int d) {
    int e = add(a-b, c-d);
    return e * a;
}

咱们心算一下 calc(3,2,4,3) 的结果 (3-2)+(4-3) * 3 = 6

汇编代码

代码语言:txt
AI代码解释
复制
.text

.globl _start

_start:
	mov		r0, $3			// 参数a = 3
	mov		r1, $2			// 参数b = 2
	mov		r2, $4			// 参数c = 4
	mov		r3, $3			// 参数d = 3
	bl 		_calc			// 调用 calc函数
	add     r0,r0,$0x30			// 把calc函数计算结果 加上0x30。 用于显示 比如 1的 ASCII值 就是 1+0x30 = 49
	ldr     r1, =message		// 把内存message的地址存入 r1
	str		r0,[r1]				// 把calc函数计算结果的 ASCII值 存入 message对应的内存里
	
    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

_add:
	add r0, r0, r1		 // r0 = r0 +r1
	bx  lr

_calc:
    push   {r4, r5, lr}   // 保存寄存器上下文
	mov    r4, r0         // r4 = a
	mov    r5, r1         // r5 = b
	sub    r0, r0, r1     // r0 = a - b
	sub    r1, r2, r3     // r1 = c - d
	bl     _add           // 调用_add
	mov    r2, r0         // r2 = e
	mul    r0, r2, r4	  // r0 = e * a	
	pop    {r4, r5, pc}   // 恢复寄存器上下文并返回
	
.data

message:
    .ascii      "0000\n"
message_len = . - message

敲黑板

calc程序里面一共有 bl str add sub 和mul 几个指令

  • bl 无条件跳转指令,类似C语言中的goto, 也可以调用函数用
  • str 数据存储指令
  • add 加法指令
  • sub 减法指令
  • mul 乘法指令

编译

编译连接加运行,好几条命令,一条一条敲显然不符合我们高级程序员的身份

代码语言:txt
AI代码解释
复制
#!/bin/bash
cmdPath="/Users/fenfei/Library/Android/sdk/ndk/21.3.6528147/toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin"
name="calc"

$cmdPath/arm-linux-androideabi-as -o $name.o $name.S
$cmdPath/arm-linux-androideabi-ld -o $name $name.o

adb push $name /data/local/tmp/$name
adb shell chmod +x /data/local/tmp/$name
adb shell /data/local/tmp/$name

跑一下

代码语言:txt
AI代码解释
复制
fenfeiMac:ARMStudy fenfei$ ./b.sh
calc: 1 file pushed, 0 skipped. 1.8 MB/s (976 bytes in 0.001s)
6

结果和咱们心算的一样 6

三、总结

李老板: 不是说好的加减乘除吗? 除呢?

奋飞: 这个 ARM的除比较复杂,不是一条指令就能搞定的……

其实ARM汇编就是要细心和耐心,不要一看到汇编就头大,仔细一条一条的分析和其他语言差不多,甚至更呆板一些。

ffshow.png
ffshow.png

朝正确地方向努力能使自己变得优秀,这是确定性。努力但未必能成就事业,这叫不确定性。

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

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

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
代码还原的技术 ARM汇编入门教程(一) Hello World!
某日,风和日丽,老李老板酒过三巡,气定闲神,挥毫泼墨,在小李老板孝敬的上等宣纸上写下了 Hello World!
奋飞安全
2021/04/20
3.2K0
代码还原的技术 ARM汇编入门教程(一) Hello World!
ARM汇编简单学习
ARM汇编语言是针对ARM架构设计的低级编程语言,用于直接操作硬件和编写高效的系统级程序。
cultureSun
2024/03/28
2280
汇编语言之ARM32汇编
以上两种编译环境,使用的指令集都是一致的, 只是语法格式有不同,也就是宏指令,伪指令,伪操作不一样
乱码三千
2021/08/24
3.4K0
汇编语言之ARM32汇编
嵌入式:ARM汇编语言程序设计基础教程
② CPU寄存器数量有限,在程序中,大多数操作都要使用寄存器;并且有的操作使用特定的寄存器(如堆栈操作使用SP/R13等),程序中要合理分配各寄存器的用途。
timerring
2022/12/31
1.5K0
嵌入式:ARM汇编语言程序设计基础教程
嵌入式:ARM内嵌汇编及C和ARM汇编相互调用
在C程序中嵌入汇编程序可以实现一些高级语言没有的功能,并可以提高执行效率。armcc和armcpp内嵌汇编器支持完整的ARM指令集;tcc和tcpp用于Thumb指集。但是内嵌汇编器并不支持诸如直接修改PC实现跳转的底层功能。
timerring
2023/01/01
1.9K0
iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学。现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是可以的。虽然当时感觉学这门课以后似乎不怎么用的上,可曾想这不就用上了吗,不过之前学的都差不多忘了,还得捡起来呢。ARM指令集是精简指令集,从名字我们就能看出指令的个数比那些负责指令集要少一些。当然本篇所涉及的ARM指令集是冰山一角,不过也算是基础,可以阅读Hopper中的汇编了,实践出真知,看多了自然而然的就会
lizelu
2018/01/11
1.4K0
iOS逆向工程之Hopper中的ARM指令
汇编语言之GNU ARM
GNU最开始其实是一个操作系统,旨为打造一个开源免费自由的操作系统,目前操作系统还在完善中
乱码三千
2021/08/24
2.3K0
linux内核1-GNU汇编入门_X86-64&ARM
为了阅读Linux内核源代码,是需要一些汇编语言知识的。因为与架构相关的代码基本上都是用汇编语言编写的,所以掌握一些基本的汇编语言语法,能够更好地理解Linux内核源代码,甚至可以对各种架构的差异有一个更深入的理解。
Tupelo
2022/08/10
5.1K0
linux内核1-GNU汇编入门_X86-64&ARM
安卓逆向:这是一篇逆向基础函数在ARM32中的刨根问底。
通过向程序计数器 PC写入跳转地址值,可以实现在 4GB 的地址空间中的任意跳转,在跳转之前结合使用MOV LR,PC
小道安全
2021/01/18
3.7K1
第014课 Jz2400_ARM异常与中断体系详解
2 发生了各种声音,如何处理这些声音 :: 有远处的猫叫(听而不闻,忽略) :: 门铃声有快递(开门收快递) :: 小孩哭声(打开房门,照顾小孩) 3 母亲的处理 :: 只会处理门铃声和小孩哭声 :: a 现在书中放入书签,合上书(保存现场) :: b 去处理 (调用对应的中断服务程序) :: c 继续看书(恢复现场)
韦东山
2020/09/30
1.7K0
第014课 Jz2400_ARM异常与中断体系详解
arm汇编指令详解带实例_汇编buf指令
两个 S 用于不同的指令,名称相同,但是在不同的指令结合却有不同的作用
全栈程序员站长
2022/11/04
1.6K0
arm(2)| 汇编指令和伪指令
指令是CPU机器指令的助记符,经过编译后会得到一串10组成的机器码,可以由CPU读取执行。伪指令本质上不是指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来指导编译过程,经过编译后伪指令最终不会生成机器码。所以指令和伪指令最大区别就是编译完之后会不会生成机器码。
飞哥
2020/07/10
2.9K0
arm(2)| 汇编指令和伪指令
linux内核学习(四)之回顾简单的汇编知识(一))
大家周末晚上好,今天给大家分享一些简单的汇编知识;说起汇编,不管是学习或者说工作中,都会或多或少的接触到,比如说学习中,在进入c语言编程世界之前,都会有一段汇编作为引导来进入c的;当然在实际开发当中,现在用汇编来开发的比较少,不是没有;做一为嵌入式软件工程师,我觉得还是非常有必要要掌握一些基本的汇编指令知识的,不要你会写汇编代码,要求自身会分析以.s结尾的文件里面的汇编代码就差不多了,看的懂常规汇编指令就行(这里顺便插一句题外话,我们知道一般ARM都是采用risc架构的,如果有网友对risc-v架构感兴趣的,可以来交流学习),好了,废话就不多说了,开始进入主题啦!
用户6280468
2022/03/21
6000
linux内核学习(四)之回顾简单的汇编知识(一))
程序是如何在 CPU 中运行的(二)
在上一篇文章中《程序是如何在 CPU 中运行的(一)》笔者讲述了程序中一条一条指令以及一条一条数据是如何在 CPU 中运行的,在本文笔者将以 ARM Cortex M3 的内核为背景分析指令是如何有序的执行。
wenzid
2021/03/04
1.5K0
程序是如何在 CPU 中运行的(二)
汇编语言实现数组求和_汇编语言loop循环1到100求和
先给一个打印出的格式,然后把数组给定义好,然后把有多少数给算出(用于判断循环结束)
全栈程序员站长
2022/11/09
1.7K0
汇编语言实现数组求和_汇编语言loop循环1到100求和
安卓逆向:这是一篇逆向基础ARM32指令集的总结
这是一篇关于ARM32指令集的总结文章,后续会不断输出一系列逆向分析破解相关的文章。
小道安全
2021/01/18
2.2K0
安卓逆向:这是一篇逆向基础ARM32指令集的总结
ARM汇编语言指令集汇总
ARM汇编语言指令集汇总 跳转指令 存储器和寄存器交互数据指令(内存访问) 数据传送指令 数据算术运算指令 数据逻辑运算指令 比较指令 组合和分离指令 并行指令 测试指令 ThumbEE指令 协处理器指令 伪指令 无线 MMX 技术伪指令 其他指令 寄存器寻址方式 跳转指令 指令 简介 B 无条件跳转 BL 带链接的无条件跳转 BX 带状态跳转,更改指令集 BLX 带链接和状态切换的无条件跳转,更改指令集 BXJ 跳转,更改为 Jazelle TBB , TBH 表跳转字节、半字 存储器和寄存器交互数据指
李玺
2021/11/22
1.5K0
OpenHarmony 内核源码分析 (内核启动篇) | 从汇编到 main ()
这应该是系列篇最难写的一篇,全是汇编代码,需大量的底层知识,涉及协处理器,内核镜像重定位,创建内核映射表,初始化 CPU 模式栈,热启动,到最后熟悉的 main() 。
小帅聊鸿蒙
2025/04/07
2230
OpenHarmony 内核源码分析 (内核启动篇) | 从汇编到 main ()
移动端arm cpu优化学习笔记第4弹--内联汇编入门
本文主要内容是介绍ARMv7和v8内联汇编的一些基础知识,并且会结合两个具体例子去看下如何用内联汇编来改写原来的代码。
Ldpe2G
2020/05/31
3.1K0
关于 Block 中捕获 self 的分析
作者:kodyzhou 问题 最近遇到一个已经使用了weak-strong dance的block依旧强引用了self的情况,好在block没被VC持有只是延迟释放,但这里的关键是用了weak_sel
QQ空间开发团队
2017/08/07
1.6K0
关于 Block 中捕获 self 的分析
推荐阅读
相关推荐
代码还原的技术 ARM汇编入门教程(一) Hello World!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档