学习资料来自滴水逆向,标题同理,若无内容则无必要笔记
1-C语言
1 课程概要
2 C语言的汇编表示&函数的定义与调用
3 参数传递与返回值
在C语言中参数传递是通过堆栈的,传递的顺序是从右到左
在C语言中函数返回值是存储在寄存器eax中
4 变量
int 4字节、short 2字节、char 1字节
全局变量初始值为0
5 函数嵌套调用的内存布局
6 整数类型
7 浮点类型
如果不加上F,编译器默认会认为这个值是double,然后再转换赋值给float
8 字符与字符串
%u 无符号形式打印
%x 16进制形式打印
%{x.y}f 打印浮点数 x标志打印总长度 y 代表小数点后长度
9 中文字符
10 运算符与表达式
非 ~
或 |
11 分支语句
12 循环语句
13 数组
14 多维数组
15 结构体
16 字节对齐
#pragma pack(...)来改变结构体成员的对齐方式
17 结构体数组
18 指针类型
指针类型自增、自减是加、减去掉一个星号后的宽度
指针类型是可以做比较的
19 &的使用
20 取值运算符
21 数组参数传递
22 指针与字符串
char* strcpy(char* dest, char* src); // 复制字符串src到dest中,返回指针为dest的值
char* strcat(char* dest, char* src); // 将字符串src添加到dest尾部,返回指针为dest的值
23 指针取值的两种方式
24 结构体指针
25 指针数组与数组指针
26 调用约定
27 函数指针
假设有攻击者要破解你的程序,它在MessageBox下断点,你正常的代码就会被成功断点,但是如果你使用函数指针的方式就可以绕过
28 预处理之宏定义、条件编译与文件包含
28.1 宏定义
使用宏比较节省空间,因为使用宏定义函数,没有堆栈提升操作,也就是不会作为函数调用而是直接内联到代码内
宏名标识符与左圆括号之前不允许有空白符,应紧接在一起
28.2 条件编译与文件包含
指令 | 用途 |
---|---|
#undef | 取消已定义的宏 |
#if | 如果给定条件为真,则编译下面代码 |
#endif | 如果前面的#if给定条件不为真,当前条件为真,则编译下面代码 |
#else | 同else |
#endif | 结束一个#if…#else条件编译块 |
#ifdef | 如果宏已经定义,则编译下面代码 |
#ifndef | 如果宏没有定义,则编译下面代码 |
28.3 文件包含
使用双引号:系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的包含文件目录(由用户在配置环境时设置)去找