arm指令bne.w改成b,即无条件跳转
近期逆向一个程序,需要把bne.w改成b,无条件跳转。由于ios逆向不像pc上,可以在od里直接改汇编指令,这篇文章给了我很大的帮助。通过memory write 修改后,验证可行后,再用ultraedit修改二进制文件,保存可执行程序(直接点击保存,不要另存为,否则就是个不可执行文件,这点切记,开始时浪费我好长时间)。再用scp命令拷贝到ios设备,即可。
文章出处:http://blog.chinaunix.net/uid-22915173-id-225005.html
ARM中的常用指令含义
ADD 加指令
SUB 减指令
STR 把寄存器内容存到栈上去
LDR 把栈上内容载入一寄存器中
.W 是一个可选的指令宽度说明符。它不会影响为此指令的行为,它只是确保生成 32 位指令。Infocenter.arm.com的详细信息
BL 执行函数调用,并把使lr指向调用者(caller)的下一条指令,即函数的返回地址 lr link register链接寄存器
BLX 同上,但是在ARM和thumb指令集间切换。
CMP 指令进行比较两个操作数的大小
ADD R3,R2,R1,LSR #2 ;R3R2+R1÷4
ADD R3,R2,R1,LSR R4 ;R3R2+R1÷2R4
LDR R0,[R1] ;R0←[R1] 将R1的值为地址的存储器中的数据传送到R0中
STR R0,[R1] ;[R1]←R0 将R0的值传送到R1的值为地址的存储器中。
基址变址寻址
LDR R0,[R1,#4] ;R0←[R1+4]
LDR R0,[R1,#4]!;R0← [R1+4], R1←R1+4
LDR R0,[R1] ,#4 ;R0←[R1], R1←R1+4
LDR R0,[R1,R2] ;R0← [R1+R2]
LDR R0,[R1,R2,LSL#2];R0← [R1+R2*4]
堆栈寻址
ARM 32位指令
STMFD SP! {r0,r1,r3-r5} ; r0-r1,r3-r5入栈
LDMFD SP! {r0,r1,r3-r5} ; r0-r1,r3-r5出栈
Thumb 16位指令
PUSH {r0,r1,r3-r5} ; r0-r1,r3-r5入栈
POP {r0,r1,r3-r5} ; r0-r1,r3-r5出栈
满递减堆栈-进栈
stmfd sp!, {r0,r1,r3-r5}
满递减堆栈-出栈
ldmfd sp!, {r0,r1,r3-r5}
跳转指令
B 跳转指令
BL 带链接的跳转指令
BLX 带链接和状态切换的跳转指令
BX 带状态切换的跳转指令
软件中断指令SWI
SWI 0x2
断点指令(BKPT)
BKPT 0xF02C 断点,用于调试
Thumb 是16-bit 指令集
代码密度高 (总代码大小约为ARM指令的65%)
使用窄总线存储器时可以大大提高性能。
是 ARM 指令集的一个子集,不是一个完整的指令集(Thumb-2除外)
核存在一个执行状态 – Thumb状态
ARM和Thumb之间可通BX 指令进行切换
http://wenku.baidu.com/link?url=83-XJ-2KEt4gCIeLG1Bi2oTgQXeHqDUDAJ-zXVt8nlAf_VOg7_6FyXmKCJPiB2J98u-fosB0ERlnn_53rTjnpS8dL96MdZncTzmUMpSZV7y
其他:IDA深度解析修改so文件和ARM汇编
1.我们要达到什么目地?
我们逆向APK时,如今对于so一般来说是肯定要做修改的,然而IDA修改汇编代码,不像OD可以直接修改汇编指令,必须通过WINHEX等修改十六进制。我们仅仅知道00表示代码清除,90表示NOP指令,即空指令。但仅仅删除一行代码这样的修改肯定是满足不了需要的。我们需要深入修改一点。
2.Intel8086与ARM基础知识
Intel8086是英特尔公司的16位处理器,ARM是ARM公司的32位处理器。每个处理器都对应自己的一套汇编语言,所以两个处理器分别对应于8086汇编和ARM汇编。由于处理器的位数,所以8086汇编指令的机器码是16位,而ARM汇编指令的机器码就是32位。机器码可以看作是二进制指令,其实所谓的HEX即称为十六进制操作码或十六进制机器码,也是二进制指令,只是把二进制的数值用十六进制去展示。
3.ARM汇编非常重要
ARM汇编可以做的事情在我看来比8086汇编多得多,如果你会了ARM,就会了主流的嵌入式开发,然后就是硬件编程,然后就是机器人或机械制造。所以,ARM真的非常重要,希望可以去认真学习,不仅是ARM指令集,还有ARM的机器码的原理,以及ELF文件在linux下的objdump反编译。下面只能简单讲解。
4.ARM的机器码简单讲解
ARM机器码为32位,我们以跳转指令BL和BEQ为例讲解。其实我们只需要关注最高的8位,也就是24-31位。首先来看,28-31这四位,不同条件这四位有什么不同。然后在27-24这四位里,BL和BEQ都是1010.所以BL指令的二进制是11101010,即十六进制的EA;相同BEQ的十六进制就是0A。
5.SO里面的情况
当我们把SO里的汇编语言放到工具中去转换为HEX时,会发现和IDA中的HEX有时是完全不同的,这是因为IDA中有时反编译SO使用的不是ARM,而是16位的ARM,也就是Thumb指令,但有时却是ARM的32位指令。
6.修改汇编跳转指令
这种情况一般是Thumb指令,一般而言一行代码对应是2个HEX码。
例子:bne指令修改为beq指令
通过工具,我们发现bne跳转指令对应的HEX机器码是D1,beq对应的HEX机器码是D0,然后用WINHEX修改,再用IDA检测。
7.修改数据
这种情况一般是ARM指令,一般而言一行代码对应是4个HEX码。
例子:修改小黄人快跑中初始化金币量
so里面原来ARM代码:mov R1,#0x49C8
最大可改为0XFFFF,也就是65535,修改后的代码应为:mov R1,#0xFFFF
原本的代码对应的HEX:C8 19 04 E3,为什么是这个样子,这和8086汇编有类似之处,就是十六进制和汇编代码是大体颠倒的。最后的E3是MOV这个汇编指令。我们做一个正确的颠倒:E3 01 49 C8。这下就懂了吧!所以,我们改为FF 1F 0F E3。
当然,为了方便,可以直接使用工具,不过这样的分析能够极大增强大家ARM分析的能力。不过不要寄太多希望于工具,因为很多时候,工具会发生错误或者和IDA中的HEX-VIEW情况不一致,也不利于我们学习的。所以工具只是辅助,主要还是动脑子。
8.修改字符串
这种情况比较简单,字符串就是字符串,修改字符串的HEX码就是利用ASCII转HEX的工具就可以,我们可以对比两个so来看看。当然最简单修改办法,是用WINHEX直接在右边修改字符串。其实,这和修改文本是一样的,记事本,notepad都可以。手机端的MT,HEXEDITOR,十六进制编辑器等等也都可以修改SO的字符串,推荐使用默小坑兄弟的ADK编辑器。
arm指令bne.w改成b,即无条件跳转的更多相关文章
- hdwiki 参考资料改成可点击跳转的(默认不能点)
(1)首先在view这个文件夹找到viewdoc.htm文件.(2)在viewdoc.htm源码中搜索“<dd> <span>[{eval echo ($i+1)}]”找到下面 ...
- iOS逆向工程之Hopper中的ARM指令
虽然前段时间ARM被日本软银收购了,但是科技是无国界的,所以呢ARM相关知识该学的学.现在看ARM指令集还是倍感亲切的,毕竟大学里开了ARM这门课,并且做了不少的实验,当时自我感觉ARM这门课学的还是 ...
- zepto插件 countdown 倒计时插件 从jquery 改成 zepto
插件特色:支持zepto库 支持时间戳格式 支持年月日时分秒格式 countdown 由jquery依赖库改成zepto zepto的event机制与jquery不同,所以更换之后代码不能正常运行 ...
- ARM指令教程
ARM指令教程 ARM汇编程序特点: l 所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理 ...
- 用python将SQL格式文件改成自己想要的格式
INSERT INTO TTT (NSAME, ID, AGE) VALUES ('AAA', '201023210816', '22'); 将上面的SQL格式改成以下的格式 AAA|20102321 ...
- 把C程序的int main(void)改成static int main(void)会怎样呢?
如题,把C程序中的主函数int main(void)改成static int main(void)会怎么样呢? 比如把 #include <stdio.h> int main(void) ...
- Android ARM指令学习
在逆向分析Android APK的时候,往往需要分析它的.so文件.这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的.所以学习Android下的ARM指令很重要.目前,市面上 ...
- 中文的csv文件的编码改成utf-8的方法
直奔主题:把包含中文的csv文件的编码改成utf-8的方法: https://stackoverflow.com/questions/191359/how-to-convert-a-file-to-u ...
- 【PC桌面软件的末日,手机移动端App称王】写在windows11支持安卓,macOS支持ios,龙芯支持x86和arm指令翻译
面对这场突如其来的变革,作为软件开发者,应该如何选择自己今后的发展方向?桌面软件开发领域还有前景吗? 起源 自从苹果发布m1处理器,让自家Mac支持IOS移动端app运行之后,彻底打破了移动端app和 ...
随机推荐
- docker~从Dockerfile到Container的过程(终于算是OK了)
上一文章,主要介绍Dockerfile里各参数的含义,以及在项目文件里这些内容的含义,因为大叔认为官方和网上其它文章说的有些模棱两可,不太好让大家理解,所有我又从新写了一个大白话的文章,希望可以给大家 ...
- cookie的存取
cookie的存取 /写cookies 一路径为标准,Path – 路径 function setCookie(name, value, time) { var strsec = getsec(tim ...
- jmeter-Java-MongoDB 数据库增删改查操作
在日常测试过程中会发现有些测试数据是通过数据库来获取的,一般常用的数据比如SQL .Oracle,此类数据库jmeter有专门的插件进行使用JDBC,今天跟大家说一说关于Mongodb这个数据库jme ...
- [luogu]P1379 八数码难题[广度优先搜索]
八数码难题 ——!x^n+y^n=z^n 我在此只说明此题的一种用BFS的方法,因为本人也是初学,勉勉强强写了一个单向的BFS,据说最快的是IDA*(然而蒟蒻我不会…) 各位如果想用IDA*的可以看看 ...
- bzoj2002: [Hnoi2010]Bounce 弹飞绵羊 [分块][LCT]
Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...
- Sqlserver事务备份和还原实例
create database mydb use mydb go create table account( id ), name ), balance float ) go select * fro ...
- Serv-U权限设置规则
Serv-U有服务器--域--组--用户四级账号管理规则,每一级都有相应的根目录,目录访问规则和虚拟路径的设置. 同样其他一些重复设置还有很多,如此很容易给人造成混乱--如果我哪里都设置的话会不会造成 ...
- (转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果
场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老 ...
- (转)JAVA反射机制理解
JAVA反射机制: 通俗地说,反射机制就是可以把一个类,类的成员(函数,属性),当成一个对象来操作,希望读者能理解,也就是说,类,类的成员,我们在运行的时候还可以动态地去操作他们. 理论的东东太多也没 ...
- opencc 繁体简体互转 (C++示例)
繁体字通常采用BIG5编码,简体字通常采用GBK或者GB18030编码,这种情况下,直接使用iconv(linux下有对应的命令,也有对应的C API供编程调用)就行.对于默认采用utf-8 ...