在逆向分析Android APK的时候,往往需要分析它的.so文件。这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的。所以学习Android下的ARM指令很重要。目前,市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式。这个THUMB指令集可以看作是ARM指令集的子集,只不过ARM指令集为32bit,THUMB指令集为16bit。之所以要使用这个THUMB指令集,主要是为了提升代码密度。具体信息大家可以google。

下面介绍如何简单修改.so文件。

首先,我们需要熟悉ARM/THUMB指令的OPCODE。以MOVS R1, #0  为例。咋一看这是一个ARM 32bit的汇编指令,但是该指令的16进制表示只有16bit!因为编译器已经自动将这个指令优化成了16位的THUMB指令 MOV R1, #0,其16进制表示为 00 21。那么这个00 21是怎么来的呢?这就需要我们理解THUMB指令的opcode:

如上图所示,0~7位是立即数值,8~10位为源/目的寄存器,11~12为sub_opcode,13~15为opcode的前3位。值得注意的是,这里将5位opcode分成了两部分——前3位001是固定的,后2位用于标识4中不同的操作:mov, cmp, add, sub。所以mov指令的opcode二进制表示为00100;这里Rd为R1,所以8~10位为001;同理,0~7为就0000 0000。所以MOVS R1, #0的2进制表示为:0010 0001 0000 0000 = 0x 21 00。

但,为什么显示出来却是00 21 呢?这是因为ARM-cpu采用小端对齐的方式,至于什么是小端对齐,大家也可自行google。

分析到这里,就告一段落了。如果我们想将原.so文件的MOVS R1, #0 修改为MOVS R1, #1,那么我们只需要将原来的0x 00 21 改为0x01 21即可。

附THUMB OPCODE地址 :https://ece.uwaterloo.ca/~ece222/ARM/ARM7-TDMI-manual-pt3.pdf

ARM OPCODE : http://simplemachines.it/doc/arm_inst.pdf

转载于:https://www.cnblogs.com/wanyuanchun/p/3707907.html

Android ARM指令学习相关推荐

  1. 最右android工资,Android逆向之旅—最右App的签名算法解析(ARM指令学习不舍篇)

    一.逆向分析 本文继续来看最后一篇介绍ARM指令学习,之前的两篇文章已经详细介绍了ARM指令的基础知识,本文继续把剩下来的所有都介绍完了,首先一定要去看前面的基础篇和进阶篇,不然我都很难保证你看这篇文 ...

  2. Android逆向之旅--「最右」签名算法解析(ARM指令学习恶心篇)

    一.前言 今天开始我们后续会开展三篇左右的arm指令学习,因为之前一直都有同学和我说有没有详细的arm指令分析,这个之前的确一直没有好的样本,有的人可能说可以用自己写的C代码然后反编译so来学习,那样 ...

  3. arm ida 伪代码 安卓 符号表_使用IDA动态调试及ARM指令学习笔记

    本文介绍如何用IDA进行动态调试及部分ARM指令的学习. 环境:已root的安卓手机一部,IDA pro 6.8,win7系统. 下载样本app,并已确认可调试(debuggable = true), ...

  4. arm 指令 学习载录

    ARM处理器汇编 ARM寻址方式: 1. 立即寻址,操作数在指令中给出. ADDR0,R0,#1;    R0ßR0+1 ANDR8,R7,#&FF; R8ßR7[7:0]; ADDR0,R0 ...

  5. ARM汇编指令学习---基于启动文件startup.S分析

    本文主要是基于启动文件startup.s对ARM汇编指令进行学习分析. 以 . 开头一般是伪汇编/操作指令,形如: .section伪操作来定义一个段,形如: .section .testsectio ...

  6. 汇编指令的学习2——常用的ARM指令

    一.常用ARM指令1:数据处理指令 (1)数据传输指令 mov mvn(源目标按位取反后赋给目标) (2)算术指令 add sub rsb adc sbc rsc (3)逻辑指令 and orr eo ...

  7. 一步一步学ROP之Android ARM 32位篇

    蒸米 · 2015/12/17 9:41 0x00 序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...

  8. android arm

    转自:http://blog.csdn.net/banketree/article/details/10995205 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌 ...

  9. linux中断响应时间太慢_linux+arm系统学习与基础学习

    先说说arm吧.先前学习linux+arm老是觉得arm次要的,学习arm和学习单片机一样,了解了中断,UART,AD,定时器就差不多了,工作重心主要在linux上面.随着时间的推移,学习的深入,自我 ...

最新文章

  1. 新的微芯片MCU增加了来自外部闪存的安全引导保护
  2. 基于visual Studio2013解决面试题之0804复杂链表
  3. Linux RedHat7.0 上vsftp配置
  4. php上传文件很慢的原因_PHP编码安全:上传文件安全
  5. 如何使用HTML,CSS和JavaScript构建技巧计算器
  6. 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 E. Half-consecutive Numbers
  7. MFC(VS2010)编程实例之一(Edit Control控件)
  8. sketchup 草图 大师 使用笔记
  9. 从安卓迁移游戏存档到ios(辐射避难所为例)
  10. 如何在cad中模块计算机,AutoCAD如何创建块 CAD模块创建方式一览
  11. R的农场 chebnear
  12. win7系统如何搜索计算机,win7怎样搜索文件?win7系统准确搜索文件的方法
  13. Python包镜像网站
  14. Apache Dubbo(概念篇)
  15. vue项目引入icon图标
  16. C#实现批量生成条形码 ——主要用于准考证号的条形码生成
  17. Java学习:创建简单的名片管理系统
  18. PyTorch 图像分类识别(一)定义及加载自己的数据集并可视化
  19. 方维互动直播系统(美女、游戏、会议、在线教育、体育、赛事直播系统)
  20. 孩子晚上偷着玩手机,家长该怎么办?

热门文章

  1. centos 启动一个redis_基于prometheus+grafana体系监控redis缓存服务
  2. python数据库连接池_Python实现数据库连接池
  3. LeetCode 6033. 转换数字的最少位翻转次数(位运算)
  4. LeetCode 1943. 描述绘画结果(差分思想)
  5. LeetCode 1903. 字符串中的最大奇数
  6. LeetCode 1444. 切披萨的方案数(DP)
  7. LeetCode 1406. 石子游戏 III(DP)
  8. 剑指Offer - 面试题22. 链表中倒数第k个节点(快慢指针)
  9. LeetCode 143. 重排链表(链表反转+快慢指针)
  10. java 删除txt,如何从.txt文件中删除2个值