自定义调用约定

ida支持用户显式指定参数和返回值所使用的寄存器

1
int __usercall func@<ebx>(int x, int y@<esi>);

这表明x用堆栈传递,y用esi传递,返回值用ebx传递

返回值必须位于寄存器中
如果返回值类型是void,不能指定返回值的位置
如果参数的位置没有指定,假设参数通过堆栈传递
可以允许嵌套声明,如: int **__usercall func16@<eax>(int *(__usercall *x)@<ebx> (int, long@<ecx>, int)@<esi>);
用于指定位置名的寄存器必须在当前处理器中有效
寄存器对可以像这样 <edx:eax> 用冒号的形式指定

__usercall 调用者清理堆栈

__userpurge 被调用者清理堆栈

__spoils指定函数破坏的寄存器列表,比如int __spoils<eax, bh> func(int x);

汇编下寄存器命名指定范围

很多时候一个寄存器在同个函数中作用不同,按n后,可以在start address和end addres中指定寄存器在某个范围中的名字从而更方便地重命名