滴水-day22-PE空白区添加代码
手动在代码空白区添加代码 注意文件与内存对齐。 添加代码的地址是ImageBuffer中的偏移,而不是文件中的。 call(E8)跳转的地址不是真正的地址,而是由真正的地址经过运算得到的硬编码 call(E8) X (X是四字节) X = E8 - (E8当前地址+5) 这些地址说的都是内存中的。
滴水-day21-PE文件-联合体-文件对齐
PE文件 文件对齐和内存对齐 直接读取文件内存得到的数据是文件在硬盘中的数据一样的。 数据读到内存中后无法直接运行,因为在硬盘中的数据和在内存中的数据是不一样的 数据在内存中需要进行拉伸, 数据拉伸的开始地址是imageBase+AddressOfEntryPoint的地址处开始 就是在硬盘中的数据
滴水-day20-宏定义-内存分配
宏定义 define 标识符1 标识符2 给一个标识符起一个新的名字,在编译前会把标识符1替换为标识符2. \#deinfe 0 在程序中写FALSE后,在编译前会把FALSE替换为0; /*if (DEBUG == 1) { printf("%d", ftellResult); }*/
滴水-day19-位运算-掩码
位运算 sar 算数右移,不改变符号位.,最高位补符号位 sal 算数左移 最高位进CF,低位补0 sol 循环逻辑左移 高位移动给CF再移动到低位 sor 循环逻辑右移 低位移动到CF再移动到高位 rcl 带进位循环左移 高位移动给CF,CF移动给低位。 rcr 带进位循环右移 低位移动给CF,C
滴水-day18-数组指针-函数指针
数组指针 // 二维数组指针 char(*arr)[2][3] = (char(*)[2][3])array; printf("%x\\\\n", *(*(*(arr + 2) + 3) + 4)); //3*6+2*3+5==18+6+5=29 printf("%x\\\\n",
滴水-day17-多级指针-数组指针
多级指针 一级指针 // 一级指针 int x = 10; int* p = &x; // p保存的x的地址 printf("%p %d\\\\n", p, *p); 00A5538F mov dword ptr [ebp-0Ch],0Ah // x 00A55396 lea
滴水-day16-指针常量-指针函数
day16_01 模仿CE搜索内存功能 // char字节 char* pChar = (char*)data; for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) { if (*(pChar + i) == 0x64) {
滴水-day15-指针-类型转换
day15_0 指针 PS:在操作指针时尽量保持数据类型一致 宽度 任何数据类型加上一个后的数据宽度是4字节,不管有多少个都是4字节。 stu* stu1; int* a; char* b; short* c; a = (int*)1; b = (char*)2; c = (short*)3; st
滴水-day14-SWITCH反汇编-循环反汇编
Switch基础 switch的参数必须是整数表达式 case匹配的必须是常量表达式且不能重复 default是可以不写的,当case没有匹配上后会执行default case后必须就break,不然程序会在匹配csae执行后继续往下执行case直到遇到break。 sub的立即数永远都是最小的那一
滴水-day13-结构体-字节对齐
结构体 定义结构体 struct name { int a; char b; short c; char s[20]; } 结构体与int,short,char....是同级的,只是这些内置的数据类型无法满足需求。 结构体中可以存储除自身外的任何数据类型。 结构体