使用GDB动态补丁ARM64的程序 跳转到任意地址

补丁就是简单了,就是直接使用set命令就好了。

如 set *(int*)0xabc1234 = 0x58000070

那就么就是把0xabc1234改成指令:

ldr x16, #12 

但是 跳转到任意地址就很麻烦了。 正常的 arm64跳转转令B,BL,BLX只有+-128M, 我们很多时候要跳到大于这个值的地址。我们在arm64下可以选的指令就只有br指令了。原来在ARM/Thumb中使用的 ldr pc, [pc, #??] , 但arm64是不能这样了。

根据NDK的编译结果,我们br的时候 x16和x17可以随便用。

但是它也需要给一个寄存器赋值一个64bit的地址, 可是arm的指令是固定的32bit的,即使给一个寄存器赋值一个64bit的值都麻烦。

mov x0, #0x830082008100

这个是无法执行的,你必须拆开来,使用逻辑位移分几次来做。就是这么麻烦!

MOV      x0,#0x8100
MOVK     x0,#0x8200,LSL #16
MOVK     x0,#8300,LSL #32

比较方便就是ldr 

下面例子是补丁pairip的,让它在某个点直接跳去调用系统api,sleep(0x7fffffff);

define patchpairip

#ldr x16, #12   //70000058 >  0x58000070
#ldr x0, #12    //60000058 >  0x58000060
#br	x16   //00021FD6 >       0xd61f0200

	set $pairip_patch= $libpairipcorebase + 0x46F04
	#set call sleep forevevr..
	set $sleepFunc = &sleep
	set *(int*)($pairip_patch)=0x58000070
	set *(int*)($pairip_patch+4)=0x58000060
	set *(int*)($pairip_patch+8)=0xd61f0200
	set *(long *)($pairip_patch+12)= $sleepFunc 
	set *(long *)($pairip_patch+20)= 0x7fffffff

end

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值