如何hook __usercall 修饰的函数

ida中的伪代码:

按照常规hook c的方法进行hook,代码如下:

void* (*orig_sub_10304C8F0)(const void *a1, uint64_t a2, char *a3);
void* repl_sub_10304C8F0(const void *a1, uint64_t a2, char *a3)
{
    NSLog(@"Enter repl_sub_10304C8F0");

    void *result = orig_sub_10304C8F0(a1, a2, a3);
 
    return result;
}

当执行到orig_sub_10304C8F0(a1, a2, a3)时会崩掉,刚开始以为参数类型问题,但上下文对比发现参数应该是OK的,后来看到伪代码中函数前面是__usercall修饰的,所以怀疑是跟这个有关系,查了一下资料,发现__usercall修饰的函数好像确实不能直接hook,但是又没有查看substrate这个框架hook __usercall的资料。请教各位大大这种情况改怎么去hook,望不吝赐教!!!

第三个参数写着是x8传进来的, 估计是函数返回类型是一个结构体

那这种该如何处理啊,网上找了一圈都没找到相关资料,:sob::sob:

你自己编译一个试试, 返回一个结构体, 看汇编是什么, ARM64调用约定不像x86那样能优化上天了, 都是固定的

因为调用约定只传x0-x7,因此插入一段汇编,恢复x8的值即可,具体还是自己尝试下比较好

试试看
void repl_sub_10304C8F0写9个参数
X8就是第9个
或者试试省略掉这个参数