170518 逆向-寄存器传递参数、函数返回值

来源:互联网 发布:淘宝买家用户数据出售 编辑:程序博客网 时间:2024/06/05 22:32

1625-5 王子昂 总结《2017年5月17日》 【连续第228天总结】

A.加密与解密 函数的参数-寄存器传递,返回值

B.寄存器传递参数的方式并没有一个标准。

绝大多数编译器提供商都在不对兼容性声明的情况下,遵循__fastcall规范

然而不同编译器实现的该规范又有些不同。

比如说,VC++编译器的约定是最左边的两个不大于4字节的参数分别放在ecx和edx。其余使用堆栈。浮点值、远指针和__int64类型总是通过堆栈里传递的。

而Borland Delphi/C++编译器则将最左边的三个不大于4字节的参数分别放在eax,edx和ecx中。

另一个调用规范thiscall也用到了寄存器传递参数。thiscall是C++中的菲静态类成员函数的默认调用约定。对象的每个函数隐含接收this参数。采用该约定时,函数参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈,只是另外通过ecx寄存器传送一个额外的参数:this指针

名称修饰约定:

在C++中,为了允许操作符重载和函数重载,编译器往往按照某种规则改写每一个入口点的符号名,一边允许同一个函数名字有多个用法。这项技术被称为名称改编或名称修饰。

不同的C++编译器有不同的方案。

C:

__stdcall约定在函数名前加上_,后面加上@和其参数的字符数

__cdecl约定仅在函数名前加_

__fastcall约定在函数名前加@,后面也加@和参数的字符数。


函数被调用完后向调用者返回一个或多个执行结果,称为函数返回值。最常见的方式是使用return,也可以通过指针和全局变量来传递。

return:

一般情况下,返回值放在eax中。如果处理结果超过了eax容量,就把高32位放在edx中

将参数使用引用方式传递:

参数有两种传递方式,值传递和引用传递。

引用传递时,函数内修改的变量可以传递给调用者

实质上引用传递是将该变量的地址(指针)送入函数,因此在汇编代码中,参数也就是该内存的地址

C.明日计划

加密与解密 数据结构

原创粉丝点击