对汇编不熟悉,不知道64位的状态保存和恢复怎么做,有没有代码能给我看一下?
extern "C" void OOOOOOOOOOO(PARM64_REGISTERS regs)
{
void* buffer;
regs->x22 = (intptr_t)buffer;
*(intptr_t *)regs->x24 = regs->x22;
regs->returnAddress = FUCK;
}
__attribute__((naked)) int nakedXXXXXXXXXX()
{
__asm__ volatile("\n\
sub sp, sp, #0x120 \n\
stp x0, x1, [sp, #0x00] \n\
stp x2, x3, [sp, #0x10] \n\
stp x4, x5, [sp, #0x20] \n\
stp x6, x7, [sp, #0x30] \n\
stp x8, x9, [sp, #0x40] \n\
stp x10, x11, [sp, #0x50] \n\
stp x12, x13, [sp, #0x60] \n\
stp x14, x15, [sp, #0x70] \n\
stp x16, x17, [sp, #0x80] \n\
stp x18, x19, [sp, #0x90] \n\
stp x20, x21, [sp, #0xA0] \n\
stp x22, x23, [sp, #0xB0] \n\
stp x24, x25, [sp, #0xC0] \n\
stp x26, x27, [sp, #0xD0] \n\
stp x28, x29, [sp, #0xE0] \n\
str x30, [sp, #0xF0] \n\
\
mov x0, sp \n\
bl _OOOOOOOOOO \n\
\
ldp x0, x1, [sp, #0x00] \n\
ldp x2, x3, [sp, #0x10] \n\
ldp x4, x5, [sp, #0x20] \n\
ldp x6, x7, [sp, #0x30] \n\
ldp x8, x9, [sp, #0x40] \n\
ldp x10, x11, [sp, #0x50] \n\
ldp x12, x13, [sp, #0x60] \n\
ldp x14, x15, [sp, #0x70] \n\
ldp x16, x17, [sp, #0x80] \n\
ldp x18, x19, [sp, #0x90] \n\
ldp x20, x21, [sp, #0xA0] \n\
ldp x22, x23, [sp, #0xB0] \n\
ldp x24, x25, [sp, #0xC0] \n\
ldp x26, x27, [sp, #0xD0] \n\
ldp x28, x29, [sp, #0xE0] \n\
ldr x30, [sp, #0xF0] \n\
\
ldr x10, [sp, #0xF8] \n\
add sp, sp, #0x120 \n\
\
cmp x22, #0 \n\
cset w8, ne \n\
add w9, w28, #0xd4 \n\
madd w8, w8, w9, w2 \n\
\
br x10 \n\
");
}
我是这样简单手写的
4 个赞
x86-64
objc4-709/runtime/Messengers.subproj/objc-msg-x86_64.s:421(.macro MethodTableLookup)
arm64
objc4-709/runtime/Messengers.subproj/objc-msg-arm64.s:432(.macro MethodTableLookup)
跟我写的有什么区别吗? 它甚至没保存完
如果根据函数调用约定的话, 不需要保存那么多哇. 而且有保存浮点寄存器哇.
之前在这里也踩了坑.
他没说什么应用场景, 如果是在函数中部hook呢, 浮点的就自己看情况了
就是在function中部hook。
对啊, 所以这里保存所有的才是正确的, 任何一个寄存器都可能被使用
我记得你是在另一个帖子里说在函数中部