随笔分类 - 逆向
摘要:代码节空白区添加代码 在一个可执行文件中插入一段代码,并执行 此文章在一个win32程序执行前插入一个MessageBox函数 一、准备需要添加的代码 寻找MessageBox的调用地址 CPP代码: #include <windows.h> using namespace std; int mai
阅读全文
摘要:节表 节表的结构 在winnt.h中的定义 #define IMAGE_SIZEOF_SHORT_NAME 8 typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD Physi
阅读全文
摘要:PE结构 一览图 PE磁盘文件与内存镜像结构图 DOS/NT头结构 DOS头结构 PE文件中的DOS部分由MZ格式的文件头和可执行代码部分组成,可执行代码被称为DOS块(DOS stub),MZ格式的文件头由IMAGE_DOS_HEADER结构定义,在C语言头文件winnt.h中有对这个DOS结构详
阅读全文
摘要:读取exe文件到内存中并存储到另一个exe文件 滴水逆向三期,内存分配-文件读写的练习题 实现代码 #include "stdafx.h" #include "stdlib.h" #define F_PATH "C:\\WINDOWS\\system32\\notepad.exe" #define
阅读全文
摘要:指针-字符数组 字符数组与字符串 字符数组: char arr[6] = {'A','B','C','D','E','F'}; 字符串 char names[] = "ABCDEF"; //编译器会在后面添一个00作为字符串的结束标记 测试: char arr[6] = {'A','B','C','
阅读全文
摘要:指针-模拟CE内存搜索 滴水逆向三期初级,指针3 使用C语言模拟CE内存搜索 模拟搜索 题目 这一堆数据中存储了角色的血值信息,假设血值的类型为int类型,值为100(10进制),请列出所有可能的值以及该值对应的地址. 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
阅读全文
摘要:指针(二) 忘记指针,重学指针 指针的类型转换 类型转换 将一个类型的数据赋值给另一种类型的变量 例: char x; int y = 10; x = y; //这里是一个省略写法,完整写法为 x = (char)y; 并不是所有类型都能互相转换 例: struct student { int id
阅读全文
摘要:指针 忘记指针,重学指针 指针类型引入 可以简单的将指针类型看作为一个带*的的类型 所有的类型后面加一个或者多个*即为指针类型 指针类型的声明 一般类型声明 char c; short s; int i; __int64 l; float f; double d; struct student {
阅读全文
摘要:循环语句逆向分析 从反汇编的角度简单分析while,do-while和for循环语句 while CPP代码: #include "stdafx.h" void Fun() { int s = 0, i = 1; while (i <= 10) { s += i++; } } int main(in
阅读全文
摘要:switch语句逆向 通过反汇编深入了解switch语句,并从中理解为何在某些情况下其性能优于if...else语句 语句结构 switch (整形表达式) { case 常量表达式1: 语句块; break; case 常量表达式2: 语句块; break; ...... ...... .....
阅读全文
摘要:基于缓冲区溢出的HelloWorld CPP代码 #include "stdafx.h" void HelloWorld() { printf("Hello World"); getchar(); } void Fun() { int arr[5] = {1,2,3,4,5}; arr[6] = (
阅读全文
摘要:IF多分支逆向分析 案例 CPP代码 #include "stdafx.h" int cnt; void Function(int x, int y) { if (x == 1) { cnt = 1; } else if (y == 1) { cnt = 1; } else { cnt = 0; }
阅读全文
摘要:IF-ELSE逆向分析 案例 CPP代码: #include "stdafx.h" int max_num; void Function(int x, int y) { if (x > y) { max_num = x; } else { max_num = y; } } int main(int
阅读全文
摘要:IF语句逆向分析 内存图 代码区 存放指令,可读,可执行 堆栈 存放参数、局部变量、临时数据 堆 同态申请的,大小是可变的,可读,可写 全局变量区 存放全局变量,可读,可写 常量区 存放常量,只读 全局变量与局部变量 全局变量 int g_n = 10; //g_n存储到全局变量区 int Func
阅读全文
摘要:C/C++数据类型 一、分类表格 C语言数据类型 基本类型 整数类型 浮点类型 构造类型 数组类型 结构体类型 共用体(联合)类型 指针类型 空类型(void) 二、数据类型三要素 存储数据的宽度 存储数据的格式 作用范围(作用域) 三、整数类型 类型 宽度 字节数 char 8bit 1字节 sh
阅读全文
摘要:查找程序入口 win32控制台程序查找程序入口 一、调用特征 main函数被调用前要先调用的函数如下 GetVersion() _heap_init() GetCommandLineA() _crtGerEnviromentStringsA() _setargv() _setEnvp _cinit(
阅读全文
摘要:调用约定 规定了参数的传递 一、常见的调用约定 调用约定 参数压栈顺序 平衡堆栈 __cdecl 从右至左入栈 调用者清理栈 __stdcall 从右至左入栈 自身清理堆栈 __fastcall ECX/EDX传送前两个剩下的从右至左入栈 自身清理堆栈 __cdecl为默认调用约定 二、各调用约定的
阅读全文
摘要:裸函数 编译器不会做出保存现场、提升堆栈、恢复现场等功能,在调用函数时只会生成CALL指令 一、普通函数 声明 int plus(int a, int b) { return a + b; } 汇编表示 函数代码及断点设置 调用普通函数时编译器的处理 参数处理 CALL调用 外平栈 返回值处理 JM
阅读全文
摘要:JCC EIP的值决定cpu即将执行的指令 JMP指令 JMP指令 直接修改EIP MOV EIP,R/IMM ;以上指令功能由JMP表示为 JMP R/IMM CALL指令 跳转前将下一指令的地址压入栈 PUSH M1 MOV EIP,M2/R ;以上指令功能由CALL表示为 CALL M2/R
阅读全文
摘要:MOVS,STOS和REP MOVS 移动数据 MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI]简写为MOVSB MOVS WORD PTR ES:[EDI],WORD PTR DS:[ESI]简写为MOVSW MOVS DWORD PTR ES:[EDI],DWOR
阅读全文

浙公网安备 33010602011771号