首页 > 编程知识 正文

frida kahlo花,syscall0返回值

时间:2023-05-03 23:31:21 阅读:149654 作者:4911

一、目标当前,许多APP不再崇尚武德。 为了防止openat 、read、kill等基函数hook,索性用syscall方式调用系统,使其无法hook。

这有两个方案。

重写系统调用表以阻止inline Hook SWI/SVC指令。 今天我们采用了在frida实现的第二种方法

内嵌汇编SWI/SVC进行系统调用,syscallfridainlinehookhooksyscallfridaarmwriterfridatypescriptproject 2,步骤inline hook原理. swhook

.请跳转到我们的新代码区域,执行以前备份的指令。 然后执行我们自己的逻辑。 (打印参数等)

.回到原来的程序空间,继续向下逃跑

改写为跳转命令的这次的hook使用frida ArmWriter实现。 用putBranchAddress函数编写跳转命令需要20个字节。 看看修正前的情况吧。

//我们定位的锚点是svc命令,在0x9374C1F8之前有8字节命令。 在此替换为const address=syscall address.sub (8)。 //备份这20个字节后,它们会立即替换为const instructions=address.read bytearray (20 )。 instructions==null ) throw new error (` unabletoreadinstructionsataddress $ { address }.` ); //将旧的20个字节打印到console.log ('===old instructions==' address ) )中的console.log(instructions; //开始替换为跳转命令,跳转地址为在createCallback内创建的新代码空间地址。 memory.patchcode(address,20,函数) code ) { let writer=null; writer=newarmwriter(code,{ pc: address }; writer.putbranchaddress (create callback (callback,instructions,address.add(20 ),syscallAddress ) ); writer.flush (; ); //输入新命令进行比较并输入console.log ('===new instructions==' address ); constinstructionsnew=address.read bytearray (20; console.log(instructionsnew; 跑一趟结果

====old instructions==0x 937621 f 0012345678 abcdef 0123456789 abcdef 00000007 c0e 1427100 e 30000 ef 00 c 70 AOE1. bq . p。==0xa9b 83000==ret address==0x 93762204==new instruction 79 abcdef 0000000001802 de 904009 Fe 504008 de 556789 这个时候有必要祭祀凶暴的早晨。 Attach请检查我们的demo。 比较一下吧。

新的代码空间地址为0xa9b83000。 从我们修改的指令来看,它会跳到0xa9b83000。 树有问题。

而且回来的地址是0x93762204,正好也是回来的地址。

执行备份指令和用自己的逻辑执行备份指令相对简单,但自己的逻辑不能用Arm程序集编写。 frida已经在考虑了。 创建3358www.Sina.com/,执行备份命令后,可以直接跳转到firida的3358www.Sina.com/。 听起来像牛。

//Hook逻辑,这里只打印参数hoo

kSyscall(address, new NativeCallback(function (dirfd, pathname, mode, flags) { let path = pathname.readCString(); log('Called openat hook'); log('- R0: ' + dirfd); log('- R1: ' + path); log('- R2: ' + mode); log('- R3: ' + flags); return 0;}, 'int', ['int', 'pointer', 'int', 'int']));......// 创建一个新的代码空间,放我们自己的代码let frida = Memory.alloc(Process.pageSize);// 开始写程序了writer = new ArmWriter(code, { pc: frida });// 执行备份的指令writer.putBytes(instructions);// 寄存器入栈,这里把r0也入栈了// FF 5F 2D E9 STMFD SP!, {R0-R12,LR} 寄存器入栈 writer.putInstruction(0xE92D5FFF);// 00 A0 0F E1 MRS R10, CPSR// 00 04 2D E9 STMFD SP!, {R10} // 状态寄存器入栈writer.putInstruction(0xE10FA000);writer.putInstruction(0xE92D0400);// instructions.size = 20 + 5条指令// 修改lr寄存器,保障执行我们自己的逻辑之后还能回来继续向下执行。writer.putLdrRegAddress("lr",frida.add(20 + 5*4));writer.putBImm(callback);// 00 04 BD E8 LDMFD SP!, {R10} // 状态寄存器出栈 // 0A F0 29 E1 MSR CPSR_cf, R10writer.putInstruction(0xE8BD0400);writer.putInstruction(0xE129F00A);// FF 5F BD E8 LDMFD SP!, {R0-R12,LR} 寄存器出栈 writer.putInstruction(0xE8BD5FFF);// 紧张的花生 0x93762204writer.putBranchAddress(retAddress);writer.flush();

再跑一下,

Called openat hook- R0: 86- R1: /proc/self/maps - R2: 0- R3: 0 三、总结

本文来自https://github.com/AeonLucid/frida-syscall-interceptor ,(对,就是AndroidNativeEmu的作者。 Orz) ,作者实现了 arm64下面的hook,我们把arm32的hook补上了,所以调试的时候需要在 arm32的手机上去调试。

frida 脚本采用 typescript project, 调试和编译脚本的时候需要参照 https://github.com/oleavr/frida-agent-example 。

frida-syscall-interceptor和frida-agent-example在同级目录。

生成js文件时,会提示ArmWriter的putBranchAddress函数找不到,其实这个函数是存在的,只是库文件没有更新, 手工在 declare class ArmWriter 里面增加一下 putBranchAddress 的声明。

我们的实现只是把参数和结果打印出来了,在我们自己的 NativeCallback 中并不能方便的去修改这些入参和返回值。这个就给大家留作业了。 参照 https://github.com/zhuotong/Android_InlineHook 的原理,那就想怎么玩就怎么玩。

每每剖开自己写过的代码,里面都应有血流出来。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。