文档章节

ARM、THUMB硬patch技巧

stormm
 stormm
发布于 2016/03/02 18:01
字数 630
阅读 186
收藏 1

下面内容涵盖硬patch时会使用的技巧:

一、修改函数中调用的字符串变量

1、在data段找个位置存放字符串以\00结尾,记下地址A

2、找到函数中的 

    09 48  LDR  R0, =(aDataLocalTmpTe - 0xD62)     ,记下地址B

.   78 44  ADD     R0, PC ;记下地址C

    LDR  R0, =(aDataLocalTmpTe - 0xD62)  等于 LDR R0,[pc, #100],也就是说aDataLocalTmpTe - 0xD62计算的这个偏移存放在当前pc+100处的位置,记地址D,此时pc+100处的数据如:

text:0000F168 9C 6D 00 00 off_F168        DCD aDataLocalTmpTe - 0xF14A


道先计算字符串离当前PC的位置存放到当前函数下面的数据偏移里,

1、字符串到调用PC :偏移A=地址A-地址C-4

2、偏移A存放到函数尾部的F168处

3、计算地址B处的Opcode,详情查看thumb指令的LDR opcode格式(https://ece.uwaterloo.ca/~ece222/ARM/ARM7-TDMI-manual-pt3.pdf),

48主要是操作哪个寄存器,偏移主要是09这个字节,这个偏移的计算方法是:

(地址D-地址B-2)/4=opcode


二、函数调用相关

指令action:         B <Target Addr> PC = PC + (#OFF << 1)

指令opcode:       B <Target Addr> 1 1 1 0 0 #Offset[0-10]    ;其中15个字节中的0-10位为偏移

0000F0F8 01 E0    B       locret_F0FE            ;F0FE-F0F8=#6

E001对应的二进制为  11100 00000000001,也就是偏移为1使用action计算如下,pc=pc+1<<1=pc+2,此处注意pc会自动加4,也就是pc+2=4+2=6,刚好等于B #6

1.向后跳转

0012 00F001F8 bl .Lhelo

.Lhelo:

0018 05F0D1F7 pld [r1, r5]

计算方式:

取高位 f000, 取后11位 => 000

取低位 f801, 取后11位 => 001

计算: (000 << 12) | (001 << 1) = 2

由于这个最高位符号位为0. 代表向后跳转, 只需要保留该值2即可

然后计算得到的目标地址为 : 0x0012 + 4 + 2 = 0x0018


向前跳转

00001164 FF F7 BE FF BL _Z4testv

_Z4testv

000010E4 07 B5 PUSH {R0-R2,LR}

计算方式:

取高位 f7ff, 取后11位 => 7ff

取低位 ffbe, 取后11位 => 7be

计算: (7ff << 12) | (7be << 1) = 7fff7c

由于这个最高位符号位为1 代表向前跳转, 需要-1然后取反 得到值为 ff800084。取84即可

然后算得到的目标地址为 : 0x1164 + 4 - 0x84 = 0x10e4

逆向过程:

BL <label>

由BL指令得到机器码算法:

offset = dstAddr - srcAddr;
offset = (offset -4) & 0x007ffffff
high = offset >> 12;
low = (offset & 0x00000fff) >> 1;
machineCode = ((0xFF00 | low) << 16) | (0xF000 | high);


BLX <label>

与BL类似。

offset = dstAddr - srcAddr;
offset = (offset -4) & 0x007fffff;
high = offset >> 12;
low = (offset & 0x00000fff) >> 1;
if(low%2 != 0) {
low++;
}
machineCode = ((0xEF00 | low) << 16) | (0xF000 | high);



© 著作权归作者所有

上一篇: gdb调试总结
下一篇: IDA 快捷键收藏
stormm
粉丝 32
博文 22
码字总数 14557
作品 0
昌平
运维
私信 提问
如何在i.MX6UL平台上实现硬浮点与软浮点?

i.MX 6UltraLite(简称为i.MX 6UL)是i.MX6系列的新产品。i.MX 6UltraLite采用单核ARM Cortex-A7,处理器主频528MHz,采用NEON技术加速多媒体和信号处理算法,具有浮点运算单元。适合于物联网,...

sdafly
2018/01/05
0
0
ARM汇编指令集_学习笔记(1)

一、什么是ARM汇编? 运行在ARM处理器上的汇编语言就叫ARM汇编。 C程序运行在X86平台,底层就是X86汇编;运行在ARM平台,底层就是ARM汇编。ARM汇编与X86汇编有显著区别。 X86属于CISC(复杂指...

李道臣
2018/12/06
0
0
ARM架构与体系学习(三)——ARM处理器状态

ARM7有两套指令系统,分别为ARM指令集和Thumb指令集。 ARM指令集为32位长,具有最完整的功能;Thumb指令集为16位长度,能实现ARM指令集的大部分功能。 Thumb指令集具有极高的代码密度(平均缩...

NightCode
2015/04/13
61
0
WINDOWS+CMAKE+VS2017编译OLLVM并整合到VS2017 NDK

OLLVM全称Obfuscator-LLVM,即基于LLVM框架的源码级别混淆工具,相比机器指令混淆,源码级别混淆无需关心底层指令差异(由编译器生成),因而更具兼容性和拓展性,对程序流程的控制更为全面,同...

wjf1997
2017/09/26
0
0
Linux RT(2)-硬实时Linux(RT-Preempt Patch)的中断线程化

特别声明:本系列文章LiAnLab.org著作权所有,转载请注明出处。xhe_href="http://weibo.com/21cnbao">by @宋宝华Barry 底半部:线程化IRQ 线程化中断的支持在2009年已经进入Linux官方内核,详...

21cnbao
2012/10/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3_数组

3_数组

行者终成事
今天
7
0
经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
今天
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
今天
10
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
今天
7
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部