c\c++传参的方式有:_cdecl _stdcall,_fastcall 三种
_cdecl:c\c++默认的调用方式,调用方平衡堆栈,不定参数的函数可以使用
_stdcall:被调用方平衡堆栈,不定参数的函数无法使用。
_fastcall:寄存器方式传参,不定参数的函数无法使用,当函数参数个数为零时,无需区分调用方式
第三种不常见,仅仅看一下前两种反汇编的具体形式
vc6 编译一下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// _std_cdec_.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include<stdio.h> void _stdcall ShowNum( int a) { printf ( "a is %d" ,a); } void _cdecl sShowNum( int b) { printf ( "b is %d" ,b); } int main( int argc, char * argv[]) { ShowNum(5); sShowNum(5); return 0; |
载入OD
通过搜索我们得到了了如下代码
我们可以看到第二个call下有堆栈的平衡措施,第一个没有。
第一个call的函数内有堆栈的平衡 ,第二个直接在函数内没有平衡 而是函数体内有。知道这点区别我们就可以在以后的反汇编中更能快速逆向出算法。