硬编码-什么是硬编码

二进制编辑工具打开exe 图中可以看出程序都是由二进制数据组成 无论多么复杂的程序都只包含两部分,数据和指令。数据和指令的划分并没有明显的界限。具体取决于EIP 指令是有自己的格式。 CPU相关的指令: x86 x64 arm 硬编码就是指令集的指令

C语言16 取值运算符

“*”的几种用途 乘法运算符 int x = 1; int y = 2; int z = x * y; 定义新的类型 char x; char* x; 取值运算符 指针类型的变量 int* a =(int*)1; printf("%x \n",(a +1)); 10: int a =(int*)1; 00401028 mov dword ptr …

C语言14 指针类型

C语言14 指针类型 指针是C语言中的一种数据类型, 定义带 *类型的变量 char x; char* x; short y; short* y; int z; int* z; float f; float* f; double d; double* d; Student st; Student* st; 总结: 任何带有*的变量类型的标准写法:变量类型* …

C语言11 结构体

思考: 当需要一个容器能够存储1个字节,你会怎么做? //char 当需要一个容器能够存储4个字节,你会怎么做? //int 当需要一个容器能够存储100个2个字节的数据,你会怎么做? //short arr[100] 当需要一个容器能够存储5个数据,这5个数据中有1字节的,2字节的有10字节的。。。你会怎么做??

C语言10 多维数组

多维数组的定义 比如一个班有5个组,每个组有9个人 int arr[45] 或者 intarr[5*9] 或者 int arr[5][9] 比如一个县有5个学校,每个学校有3个年级,每个年级有4个班,每个班有5个组,每个组有9个人 int arr[53459] 或者int arr[5][3][4][5][9] int arr[5][3][4][5][9] , …

C语言9 数组

数组的定义 数组定义的格式: 数据类型 变量名[常亮]; //为什么不能使变量? //因为在声明的时候 编译器需要知道数组的长度,分配相应大小的内存 数组的初始化 方式1: int arr[10] = {0,0,0,0,0,0,0,0,0,0}; 方式2: int arr[] = {1,2,3,4,5,6,7,8,9,10}; 对应汇编 #include …

C语言8 循环语句

如何实现让某些语句按照一定的条件重复执行呢? 比如:打印从0 – N的值? 例子: goto语句 #include #include void MyPrint(int x) { int i = 0; B: printf("%d\n",i); i++;

C语言7 switch语句为什么高效

switch语句的定义 语法 switch(表达式) { case 常亮表达式1: 语句; break; case 常亮表达式: 语句; break; case 常亮表达式: 语句; break; ...... default: 语句; break; } 需要注意的点 表达式结束不能使浮点数 case后的值不能一样 case后的值必须是常量 break: …

C语言常用函数

sqrt 求给定值的平方根 sqrt() 用来求给定值的平方根,其原型为: double sqrt(double x); 【参数】x 为要计算平方根的值。 如果 x < 0,将会导致 domain error 错误,并把全局变量 errno 的值为设置为 EDOM。 【返回值】返回 x 平方根。 Exp: #include main(){ double …

C语言5 -字符和字符串

int x = 123; //补码 int float f = 123.4F; //IEEE编码 int i = "A"; //神马情况??? 我们在代码中写入 int i = "A"; 反编译后汇编就编程了 mov dword ptr ss:[esp-4],0x41 为什么会变成41呢? 字符类型 ASCII 表 (American Standard …

计算机中的运算

计算机只认识0和1,计算机能做的运算归根结底也就是直接对0和1做运算(通常称为 位运算) 与运算 两个位都为1时,结果为1 and(&) 或运算 只要有一个为1 就是1 or(|) 异或运算 不一样的时候是1 xor(^) 非运算(单目运算) 0变1 1变0 not(~) 左移 各二进制位全部左移若干位,高位丢弃,低位补0 shl(>) 在汇编中shr补 …

进制和内存

数据宽度 因为计算机受硬件制约,数据都是有长度限制的(数据宽度),超过最多宽度的数据会被丢弃 计算机中常见的数据宽度: 位(BIT) -> 一个0或1 字节(BYTE) =8位 范围 0-> FF 字(Word) = 16位 0->FFFF 双字(DoubleWord) = 32位 0-FFFFFFFF 超过范围的数会被丢弃 有符号数和无符号数 有符号数还是 …

9.汇编-JCC

之前可以修改EIP寄存器的指令 JMP,CALL,RETN 所有JCC指令的动作->根据标志寄存器修改EIP的值 标志寄存器 EFLAGS CF(bit 0)[Carry flag] C位 若算术产生的结果在最高有效位(most-significant bit)发生进位或者借位则将其置1 反之清零 这个标志通常用来指示无符号证书运算的溢出状态

8. 汇编-ESP寻址 EBP寻址

寄存器传参和堆栈传参 寄存器传参 MOV ECX,1 MOV EBX,2 CALL XX MOV EAX,ECX ADD EAX,EBX RETN 堆栈传参 –ESP寻址 PUSH 1 PUSH 2 CALL XXX MOV EAX,DWORD PTR SS:[ESP+8] //当内存中括号中包含ESP或者EBP的话 用SS ADD EAX,DWORD …

7.汇编-汇编中的函数

什么是函数 函数就是一系列指令的几个,为了完成某个会重复使用的特定功能 函数调用 用JMP来执行函数 用CALL来执行函数 函数的参数和返回值 通常情况下,会将函数的计算结果放到EAX寄存器中 EAX 通常用来放返回值 简单的加法函数 ADD ECX,EDX //传参 MOV EAX,ECX //传结果到EAX中 RETN 堆栈传参 如果参数很多怎么办?10 …

6.汇编-修改EIP的指令

EIP寄存器 EIP寄存器表示CPU下次执行的位置 JMP指令 JMP指令相当于给EIP寄存器赋值 JMP后面只能是32位的 指令格式: MPV EIP,寄存器/立即数/内存 简写:JMP 寄存器/立即数/内存 JMP 0x00FF19 -> MOV EIP,0X00FF19 JMP EAX -> MOV EIP,EAX JMP DWORD PTR …

3.汇编-常用汇编指令

1. MOV指令(赋值) 含义:前者被后者赋值 exp: MOV EAX,0xFFFFFFFF 此时 EAX = 0xFFFFFFFF 指令格式: MOV r/m8,r8 MOV r/m16,r16 MOV r/m32,r32 MOV r8,r/m8 MOV r16,r/m16 MOV r32,r/m/32 MOV r8,imm8 MOV r16,imm16 …