C语言笔记【滴水逆向】

第一课(C语言的汇编表示):

  1. 课程特点:先看汇编,再看此课程(课程链接在最下方)
  2. 例子:

#include

int main(){     //入口程序

__asm{   //内联汇编

mov eax,eax

mov eax,eax

mov eax,eax

}

printf("HelloWorld\n");

return 0; //执行结束

}

C语言笔记【滴水逆向】_第1张图片

  1. 调试相关:在vc++6.0中,F5是调试(运行到第一个断点处);ctrl+F5是执行;F7是编译;F9是下断点;F10是单步步过;F11是单步步入
  2. 什么是函数:

函数格式:

返回类型  函数名(参数列表)  //返回类型、函数名不能省略;参数列表可以省略

{

}

函数名、参数名的命名规则:

只能由英文字母、数字、下划线组成,且第一个字母必须是英文字母或下划线;区分大小写;不能使用C语言的关键字

  1. 例子:

C语言笔记【滴水逆向】_第2张图片

C语言笔记【滴水逆向】_第3张图片

例子解析:

  1. 首先程序会执行main()函数中的第一条语句:int c=plus(1,2); 对应的汇编解释即是:把2放入edx中,把1放入ecx中,然后CALL调用plus()函数
  2. rsp提升堆栈空间,把edx中的值(2)放入栈顶(此块内存有一个别名,即为y),同理把ecx中的值(1)放到x中
  3. return x+y;  即为把y中的值(2)放到eax中,把x的值放到ecx中;让ecx和eax相加,相加后的结果放到ecx中,然后把ecx中的值放到eax中,至此plus()函数基本运行完毕(当然还有其他出栈pop操作,但对此问题不影响,故此不分析)
  4. 此时程序已经回到main()函数中,把eax中的值放到变量c中,至此分析完毕,后面就是prinf()函数的调用,不再分析

第二课(参数传递与返回值):

主要是堆栈传参,参看课程第二课(最下方有课程链接)

第三课(变量):

  1. 声明变量:变量类型(用来说明宽度是多大) 变量名
  2. 全局变量:编译的时候就已经确定了内存地址和宽度,变量名就是内存地址的别名,如果不重新编译,全局变量的内存地址不变,游戏外挂中的“基址”,其实就是全局变量,全局变量中的值任何人程序都可以修改,是公用的;全局变量有默认值
  3. 局部变量:局部变量是函数内部申请的,如果函数没有执行,那么局部变量没有内存空间;局部变量的内存是在堆栈中分配的,程序执行时才分配;局部变量没有默认值

第四课(变量与参数的内存布局):

  1. 参数在内存中的位置?
  2. 局部变量在内存中的位置?
  3. 返回值是如何返回,如何使用的?

C语言笔记【滴水逆向】_第4张图片

第五课(函数嵌套调用的内存布局):

1.

#include

#include

int plus1(int x, int y) {

return x + y;

}

int plus(int x, int y, int z) {

int m = plus1(x, y);

return m + z;

}

int main() {     //入口程序

int n=plus(1, 2, 3);

printf("%d\n",n);

return 0; //执行结束

}

  1. 和第二课相似,参看相关课程

第六课(整数类型):

  1. 基本类型:整数类型、浮点类型
  2. 构造类型:数组、结构体、共用体(联合体)
  3. 指针类型
  4. 空类型

整数类型:short(2字节)、int(4字节)、long(4字节)

注意:int在16位计算机中与short宽度一样,在32位及以上的计算机中与long相同

  1. 数据溢出,是把高位舍弃还是低位舍弃:高位舍弃
  2. 有符号和无符号的区别:例如:signed char(有符号),它说能存储的正数范围是0——127、负数范围是(-128)——(-1);对于unsigned char(无符号),它说能存储数的范围是0——255

第七课(浮点类型):

  1. float(四字节)、double(八字节)、long double(8字节或16字节)
  2. 浮点型数默认为double类型

C语言笔记【滴水逆向】_第5张图片

  1. 十进制转换为二进制:整数部分(除2取余);小数部分(乘2取整)
  2. 用二进制描述小数,不可能做到完全精确

C语言笔记【滴水逆向】_第6张图片

第八、九课(字符与字符串&中文字符):

  1. 字符和字符串的区别:字符串有结束标志:00
  2. 扩展ASCLL表:一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样我们就可以组合出大约7000多个简体汉字了;在这些编码里(大于127的),连在ASCLL里原来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符;上述编码规则就是“国标码”——GB2312或GB2312-80
  3. “国标码”弊端:两种编码可能使用相同的数字代表两个不同的符号;或者使用不相同的数字代表相同的符号,为了解决这个问题,出现了Unicode编码

第十课(运算符与表达式):

  1. a++与++a的区别:++在前时,先计算a=a+1,然后再做其他事情,++在后时,先做其他事情,然后再计算a=a+1;

C语言笔记【滴水逆向】_第7张图片

第十一课(分支语句):

1.

#include

#include

int main() {     //入口程序

int b = 10;

if (b > 1) {

printf("执行“b>1”\n");

}

else if(b>2) {

printf("执行“b>2”\n");

}

else if (b > 3) {

printf("执行“b>3”\n");

}

else if (b > 4) {

printf("执行“b>4”\n");

}

return 0; //执行结束

}

C语言笔记【滴水逆向】_第8张图片

第十二课(switch语句):

1.

switch (表达式) { //表达式结果不能是浮点数;case后的值不能一样;case后得知必须是常量

case 常量表达式1:

语句;

break;

case 常量表达式1:

语句;

break;

case 常量表达式1:

语句;

break;

default:

语句;

break;

}

  1. switch和if...else的区别:switch结构只能做等值判断,而if...else可以进行区间判断;switch结构的执行效率远远高于if...else,在分支条件比较多的情况下这种趋势愈发明显

第十三课(switch为什么高效):

1.

C语言笔记【滴水逆向】_第9张图片

第十四、十五课(循环语句):

goto  while do...while  for

continue和break的区别:continue 语句只结束本次循环,而不是终止整个循环。break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。而且,continue 只能在循环语句中使用,即只能在 for、while 和 do…while 中使用,除此之外 continue 不能在任何语句中使用。

第十六课(自动关机小程序):

  1. 注册表编辑器:

开机自启动:HKEY_CURRENT_USER---->SOFTWARE---->MICROSOFT---->WINDOWS---->CURRENTVERSION---->RUN

第十七、十八课(数组&多维数组):

  1. 数组定义的格式:数据类型  变量名[常量]

C语言笔记【滴水逆向】_第10张图片

C语言笔记【滴水逆向】_第11张图片

第十九、二十、二十一课(结构体&字节对齐&结构体数组):

1.一个变量占用n个字节,则该变量的起始地址必须是n的整数倍;如果是结构体,则结构体的起始地址是其最宽数据类型成员的整数倍

C语言笔记【滴水逆向】_第12张图片

  1. 当对空间要求较高的时候,可以通过#pragma pack(n)来改变结构体成员的对齐方式;n可以为1,2,4,8;结构体总大小:是M的整数倍。其中M=min(最大成员,对其参数)
  2. 若要强制取消字节对齐,可使用#pragma pack()

第二十二课(指针):

【注意:本节课所讲知识点可能和大家普遍的对指针的认识有所不同;孰对孰错,请读者自己分辨】

  1. 带有*的变量类型的标准写法:变量类型* 变量名
  2. 任何类型都可以带*,加上*以后是新的类型,统称“指针类型
  3. *可以是任意多个
  4. 指针变量赋值:

int* a;

a=(int*)10;

  1. 指针类型的变量宽度永远是4字节、无论类型是什么,无论有几个*
  2. 不带*类型的变量,++或--都是加1或减1
  3. 带*类型的变量,++或--的数量是去掉一个*后变量的宽度
  4. 指针是无符号类型

第二十三、二十四课(&和*的使用):

C语言笔记【滴水逆向】_第13张图片

C语言笔记【滴水逆向】_第14张图片

  1. “*”的几种用途:

乘法运算符、定义新的类型、取值运算符

第二十五、二十六课(数组参数传递&指针与字符串):

  1. 值传递和地址传递
  2. 数组传递时,传递的不是数组的内容,而是数组的首地址

C语言笔记【滴水逆向】_第15张图片

C语言笔记【滴水逆向】_第16张图片

第二十七、八、九课(...):

C语言笔记【滴水逆向】_第17张图片

C语言笔记【滴水逆向】_第18张图片

C语言笔记【滴水逆向】_第19张图片

第三十、一、二、三课():

C语言笔记【滴水逆向】_第20张图片

C语言笔记【滴水逆向】_第21张图片

C语言笔记【滴水逆向】_第22张图片

声明:

1.本笔记参考课程为【滴水逆向基础班C语言】

2.本笔记适合有C语言基础的同学参考

你可能感兴趣的:(滴水逆向基础班,c语言,开发语言,后端,安全,反汇编)