包含标签 逆向 articles

c++ 调试输出简单封装

#include <windows.h> #include <fmt/printf.h> #include <string> #include <type_traits> template <typename CharType, typename... Args> void GlobalOutputDebugString(const CharType* format, Args... args) { // 使用 fmt::sprintf 格式化字符串 std::basic_string<CharType> formatted = fmt::sprintf(format, args...); // 根据字符类型调用相应的 OutputDebugString 函数 if constexpr (std::is_same_v<CharType, char>) { OutputDebugStringA(formatted.c_str()); } else if constexpr (std::is_same_v<CharType, wchar_t>) { OutputDebugStringW(formatted.c_str()); } } // 这个宏将根据项目设置自动选择正确的字符类型。 // 如果项目设置为使用 Unicode 字符集,那么 _T 和 __FUNCTIONT__ 将解析为 L 和 __FUNCTIONW__。 // 如果项目设置为使用多……

Continue reading

硬编码-什么是硬编码

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

Continue reading

win32中的宽字符

win32中的宽字符 宽字符 数据类型 容器、模板 ASCII 一个字符 一个字节 GB码(扩展了的ASCII) 英文字符 一个字节 GB码 中文字符 两个字节 UNICODE字符集(unicode编码实际指的是utf-16) 常用字符 两个字节 宽字符: 用多个字节来表示的字符称之为宽字符(只要不是以单字节存储都可称为……

Continue reading

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 [ebp-4],1 11: printf("%x \n",*(a +1)); 0040102F mov eax,dword ptr [ebp-4] 00401032 mov ecx,dword ptr [eax+4] 00401035 push ecx 00401036 push offset string “%x \n” (0042201c) 0040103B call printf (00401070) 00401040 add esp,8 当然这里运行的时候肯定出错 因为 1 是一个异常的不存在的地址 探测 * 指针类型 的类型 int*** a; int***** b; int******* c; int*……

Continue reading

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; 总结: 任何带有*的变量类型的标准写法:变量类型* 变量名 任何类型都可以带* 加上* 以后是新的类型,统称为“指针类型” *可以使任意多个。 指针变量赋值 char* x; char*** x; char******* x; short* ~~ int* ~~ Student* ~~……

Continue reading

结构体 字节对齐的练习

分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; struct S2 { char c1; char c2; char c3; double d; }; struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(1) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 #pragma pack(4) struct S1 { char c1; double d; char c2; char c3; }; #pragma pack() struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 struct S1 { char c1; double d; char c2; char c3; }; #pragma pack(1) struct S3 { char c1; S1……

Continue reading

C语言 13 结构体数组

结构体数组的定义 类型 变量名[常量表达式]; //定义结构体类型 struct stStudent { int Age; int Level; } //定义结构体变量 struct stStudent st; //定义结构体数组 struct stStudent arr[10]; //或者 stStudent arr[10]; 结构体数组初始化 struct stStudent{ int Age; int Level; }; struct stStudent arr[5] = {{0,0},{1,1},{2,2},{3,3},{4,4}}; //或者 arr[0].Age=100; arr[0].Level=100; 结构体成员的使用 格式 : 结构体数组名[下标].成员名 arr[0].Age = 10; 字符串成员的处理 struct stStudent{ int Age; char Name[0x20]; } struct stStudent……

Continue reading

C语言12 字节对齐

#include char x; short y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E2 55 42 00 01 mov byte ptr [x (004255e2)],1 14: y=2; 0040103F 66 C7 05 E0 55 42 00 mov word ptr [y (004255e0)],offset check+26h (00401046) //下面将y的类型改为 int #include char x; int y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E4 55 42 00 01 mov byte ptr [x (004255e4)],1 14:……

Continue reading

C语言11 结构体

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

Continue reading

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] ,又成为多维数组. 多维数组的初始化 int arr[3][4] = { {1,2,3,4}, {5,6,7,8}, {9,7,6,5} }; 多维数组的存储方式 int arr[3][4]; 反汇编对比 8: int arr[3*4] = {1,2,3,4,5,6,7,8,9,10,11,12}; 00401028 C7 45 D0 01 00……

Continue reading