Android ARM指令学习
在逆向分析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
Android ARM指令学习的更多相关文章
- android ARM 汇编学习 —— hello world
android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析 adb putty 连上手机,用busybox vi 写一个 hello ...
- ARM指令学习,王明学learn
ARM指令学习 一.算数和逻辑指令 1— MOV 数据传送指令 2.— MVN 数据取反传送指令 3.— CMP 比较指令 4.— CMN 反值比较指令 5.— TST 位测试 ...
- android ARM 汇编学习—— 在 android 设备上编译c/cpp代码并用objdump/readelf等工具分析
学习 android 逆向分析过程中,需要学习 Arm 指令,不可避免要编写一些 test code 并分析其指令,这是这篇文档的背景. 在目前 android 提供的开发环境里,如果要编写 c / ...
- ARM指令学习
跳转指令 直接向程序计数器PC写入i跳转地址值,可以实现在4GB的地址空间中的任意跳转. ARM跳转指令可以完成向前或向后的32MB的地址空间的跳转. -B 跳转指令 -BL 带返回的跳转指令 -BL ...
- ARM指令分类学习
指令分类: 1.算数和逻辑指令 2.比较指令 3.跳转指令 4.移位指令 5.程序状态字访问指令 6.存储器访问指令 +++++++++++++++++++++++++++++++++++++++++ ...
- 2021年正确的Android逆向开发学习之路
2021年正确的Android逆向开发学习之路 说明 文章首发于HURUWO的博客小站,本平台做同步备份发布.如有浏览或访问异常或者相关疑问可前往原博客下评论浏览. 原文链接 2021年正确的Andr ...
- iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...
- ARM寄存器学习,王明学learn
ARM寄存器学习 ARM微处理器共有37个32位寄存器,其中31个为通用寄存器,6个为状态寄存器.但是这些寄存器不能被同时访问,具体哪些寄存器是可以访问的,取决ARM处理器的工作状态及具体的运行模式. ...
- Android ARM汇编语言
简介 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集. 原生程序与ARM汇编语 ...
随机推荐
- Python-DDT实现接口自动化
Get请求参数化例子 import unittest import requests import ddt @ddt.ddt class MyTestCase(unittest.TestCase): ...
- python学习笔记-环境安装【1】
1.在 WINDOWS 下面要运行命令 pip install virtualenvwrapper-win才行 参考地址http://blog.csdn.net/liuhongyue/article/ ...
- Dojo操作dom元素的样式
1.使用dom-style的set方法,可以直接设置dom元素的样式属性,这和使用dom元素的style属性效果一样. 2.使用dom-class的replace方法可以替换某个dom元素的样式,ad ...
- bower使用
1,先安装nodejs(npm),Git 2,安装bower cmd执行到在项目文件夹下路径,执行npm install bower 3,执行bower init 项目根目录下将生成bower.js ...
- (转发)IOS高级开发~Runtime(二)
一些公用类: @interface ClassCustomClass :NSObject{ NSString *varTest1; NSString *varTest2; NSString *varT ...
- 【转】VxWorks信号量分析
Wind内核中有二进制信号量.计数信号量和互斥信号量三种类型,为了是运用程序具有可移植性,还提供了POSIX(可移植操作系统接口)信号量 .在VxWorks中,信号量是实现任务同步的主要手段,也是解决 ...
- 01创建线程CreateThread和_beginthreadex
Windows多线程之线程创建 一. 线程创建函数 CreateThread 1. 函数原型 HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRI ...
- 无法重启ssh
rm /dev/null mknod /dev/null c 1 3 chmod 666 /dev/null
- python-matplotlib-lec0
直奔主题吧..以下是对matplotlib画图的简单讲解,代码已测试. win7 + pycharm + python 2.7 参考文档: http://old.sebug.net/paper/boo ...
- 在Unix系统上,从源文件、目标文件、可执行文件的编译过程
是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, #include & ...