-
-
[原创]逆向C++之三 函数 大事化小 小事化了
-
发表于:
2008-12-20 22:09
10774
-
【文章标题】: 逆向C++之三 函数 大事化小 小事化了
【文章作者】: kanghtta
【作者邮箱】: kanghtta@hotmail.com
【作者主页】: http://kanghtta.cublog.cn
--------------------------------------------------------------------------------
【详细过程】
大家好,上一节写了逆向C++的变量后,本来按顺序来说应该写表达式和运算符了,但是关于表达式和运算符,
主要涉及的知识还是组成原理中的二进制运算和编码解码的问题,所以先打算把有关C++的写完,有时间以后在写点
系统方面的东西;好了,话多不甜;
使用函数的意义:
在程序中使用函数主要是为了编写可重用的代码来避免不必要的重复劳动,我们将功能独立的代码封装成独立于程序的函数,
它们可以在程序的任何地方被调用,由于它们可以独立于程序而存在,所以你可以把它们复制和粘贴到其它的程序中。然而,
在宏观的层面上,实现重用的更好方法是把函数封装在类中,让所有的程序都能用它; 你甚至还可以将对同一类问题的解决的功能
性函数编译成静态库或者是动态链接库;方便以后使用; 还有点题外话,很多函数的使用,其实依赖于多个公式的使用,
因此补充点数学知识对你百利而无一害; 而无论我们面对的是多么复杂的问题,最终都可以找到解决的方案;
函数的定义格式:
return_type function_name(parameter_declaration_list)
{
statement_list;
}
return_type 是函数的返回值类型,void表示函数没有返回值,包含存储类型和数据类型,其中存储类省略的为外部函数,
而数据类型不可省略;注意,没有返回值的函数不能用在表达式中;
function_name 函数名,用来标示一个函数,一般定义为有意义的字段值;如GetWindowText
(parameter_declaration_list) 在括号中间的是,函数的参数,多个参数之间用,号分隔;如果在定义函数的时候只给出参数
名,那么要在下面逐一说明参数的类型,通常是在参数表中同时给出参数的类型和名称;
statement_list 是语句系列,表达式后面加个分号就构成语句,一条语句用来完成一种功能,多条语句放在一个大括号内称为复合语句;
函数的说明方法:
函数定义之后,在调用之前通常要说明该函数,特别是调用在前,定义在后的函数,使用之前一定要说明,否则无法通过编译;
而定义在前,调用在后的函数,使用时可以不用说明;
函数的说明格式:
return_type function_name(parameter_declaration_list);
也可以省略参数表中的变量名,但要指出参数的类型和个数;如:
int fun(int a,int b)
{
return a+b;
}
说明:
int fun(int a,int b); 原型说明
int fun(int,int); 简单说明
函数的类型:
函数的存储类有两种: 一是外部函数,它的作用域是整个程序,包含程序中的各个文件;定义时,存储类型为: extern
extern data_type function_name(parameter_declaration_list)
一般在C++中,类体外定义的函数不加存储类型说明符的都是外部函数,它定义在某个文件中,在该程序的其它文件中都可以调用;
内部函数:
内部函数的作用域是在定义该函数的文件内,在改程序的其它文件内不可调用,定义时,存储类型为: static
extern data_type function_name(parameter_declaration_list)
函数的返回值:return <表达式>
计算过程如下:
1): 计算表达式的值。
2):转换表达式的类型,但计算的表达式和函数的返回值类型不一致时,应将表达式的类型转换为返回值类型,通常加强制类型转换;
3):将表达式的值返回给调用函数作为调用函数的值,一般在eax中
4):将程序的控制权返回到调用函数语句,执行调用函数下面的语句;
函数的参数:
参数的类型:函数的参数有实参和形参之分;
1:实参--调用函数的参数称为实在参数,通常函数的参数是一种表达式,它具有确定的值;在函数调用时,将实参值对应地传递给被调用的参数
使被调用函数的参数获得实际的值;
2:形参--被调用函数的参数称为形式参数,通常是一种变量名,数组名,引用名,指针名等,在未被调用之前,它没有实际的值,而被调用之后,
它才从函数的实参那获取值;我们可以设置形参的默认值;但必须从函数参数表的右边开始,并且如果一个函数有说明语句,则参数默认值应该放
在说明函数的语句中,否则放在定义函数的语句中;
定义函数时:必须指出函数的形参的个数和名字;
函数参数的求值顺序: (其实就是调用约定,函数参数的入栈顺序和堆栈的平衡)
C类语言中,(__stdcall)函数入栈顺序从右到左,最右边的参数最先入栈; 在Windef.h中有如下语句
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
实例分析:由于为了方便理解,函数写的简单了点;不过能帮助大家能理解原理就行;
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课