包含标签 逆向 articles

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 "stdafx.h" int main(int argc, char* argv[]) { int age[10] = {1,2,3,4,5,6,7,8,9,10}; return 0; } 8: int age[10] = {1,2,3,4,5,6,7,8,9,10}; 00401028 C7 45 D8 01 00 00 00 mov dword ptr [ebp-28h],1 0040102F C7 45 DC 02 00 00 00 mov dword ptr [ebp-24h],2 00401036 C7……

Continue reading

C语言8 循环语句

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

Continue reading

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

switch语句的定义 语法 switch(表达式) { case 常亮表达式1: 语句; break; case 常亮表达式: 语句; break; case 常亮表达式: 语句; break; ...... default: 语句; break; } 需要注意的点 表达式结束不能使浮点数 case后的值不能一样 case后的值必须是常量 break: break非常重要,当执行到一个分支后 如果没有break就会继续向……

Continue reading

计算机中的运算

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

Continue reading

9.汇编-JCC

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

Continue reading

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 PTR SS:[ESP+4] RETN 8 堆栈传参 –EBP寻址 PUSH 1 PUSH 2 CALL XXX PUSH EBP MOV EBP,ESP SUB ESP,10 //提升堆栈 MOV EAX,DWORD PTR SS:[EBP+8] //通过EBP获得参数 参数位置 +4 ADD EAX,DWPRD PTR SS:[EBP+0xC] MOV ESP,EBP POP EBP //恢复堆栈……

Continue reading

7.汇编-汇编中的函数

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

Continue reading

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 DS:[0x18ffa0] ->MOV EIP,DWORD PTR DS:[0x18ffa0] #这里内存指针只能用32位的 CALL指令 PUSH下一行地……

Continue reading

5.汇编-堆栈相关指令

什么是堆栈 程序启动的时候操作系统会给每个程序一块虚拟的4G内存当程序需要使用的时候必须要和操作系统申请内存 堆栈是程序的心脏,程序中需要用到的重要数据,都在堆栈中体现 就是一块特殊的内存,操作系统在程序启动的时候已经分配好的,供程序执行时使用 和数据结构的堆栈无关 查看堆栈 正常内存使用从……

Continue reading

2.汇编-内存

寄存器数量和容量有限,为了存储大量数据,所以我们需要内存 每个程序都会有自己的独立的4GB内存空间( 这里的内存其实是虚拟的,并不是真的给了程序4G内存,当程序读或者写这段内存的时候,操作系统才会把使用的内存映射到物理内存上 物理内存和内存条之间还有一层映射 WX20170916-044017 1Bit 就是一个位 也就是可以存储……

Continue reading