汇编反调试,符号断点断不到,也无法进行hook,只能更改底层汇编对应的 机器码。
在hopper中查看跳转逻辑,找到对应需要更改的地址,用machoview进行更改汇编代码对应的机器码,然后保存二进制,重签名即可。
1、找逻辑
查看中断&退出逻辑:hopper中查看入口EntryPoint,采用了sysctl汇编,并根据返回结果进行跳转未知地址0xb5a99000,见下图。记录下地址0x369fc
。
找逻辑:1.符号断点ptrace/sysctl/syscall/exit 2.汇编svc
2、修改二进制
在machoview的Section64(__TEXT,__text)中找到对应地址的指令,第二列data的值即为该条汇编指令的机器码,双击机器码位置即可编辑。汇编转机器码:https://armconverter.com/
注意:
1.输入的机器码要倒序 2.tbz跳转的地址是offset
机器码最好先举例验证下正确性。
// 一些指令的机器码,倒序可以直接点工具右上角GDB/LLDB
nop 机器码:1F2003D5,倒序:D503201F
tbz w8, #3, #0x20 机器码:08011836,倒序:36180108
bl #0x223c238 机器码:8EF08894,倒序:9488F08E
把tbz改为直接跳转bl,计算新的机器码:bl #0x20 -> 08000094 -> 94000008
,修改保存。
3、知识点
1.svc #0x80
svc是系统调用,调用号在x16寄存器中,一般传26表示ptrace调用,ptrace方法第一个参数一般传31表示阻止调试。系统调用号可查看#import <sys/syscall.h>
2.汇编反调试
asm方式调用反调试代码的话,符号断点断不到,只能改二进制。
3、绕过思路
先找符号断点ptrace/sysctl/syscall/exit 。找不到就看汇编svc。
4、看不懂汇编的笨方法
自己写demo看它二进制的汇编和目标汇编比较。