C++反汇编与逆向分析之数据类型的基本表现学习笔记
来源:互联网 发布:数据流算法 编辑:程序博客网 时间:2024/05/21 06:39
float GetFloat(){return 12.25f;}void Add(int &nVar){nVar++;}int main(int argc, char* argv[]){// 在未使用到浮点数的情况下// VC++ 6.0中输入小数会报错,即没有对浮点寄存器初始化// 解决办法是在任意位置声明一个浮点类型的变量对浮点寄存器初始化即可// int nInt = 0;// scanf("%f",nInt);// 在VC6中,遵循C调用约定,以小端方式存储,&fFloat = 0x0012ff7c// &fFloat 在内存中存储为 414400,转为2进制为:0100 0001 0100 0100 0000 0000 共32位// float 遵循IEEE编码方式 0~22 共23位存储尾数 23~30 8位存储指数部分 第31位最高有效位为符号位// IEEE 规定127 即 01111111 为0//float fFloat = 12.25f;// fFloat = 1.3f 内存中为 3f a6 66 66 转为 2进制为 0011 1111 1010 0110 0110 0110 0110 0110 // 后面乘不尽// fFloat = 1.3f;// fFloat = 0.0f;// C++比较浮点数是否为0时,要做区间比较/*float fTemp = 0.0001f;if (fFloat >= -fTemp && fFloat <= fTemp){//fTemp为0printf("%f",fFloat);}*///浮点数与整数的转换/*int nInt = 4;float fFloat = (float)argc;printf("%f",fFloat);argc = (int)fFloat;printf("%d",argc);*//*00412940 fld dword ptr [ebp-4]00412943 sub esp,800412946 fstp qword ptr [esp]不能直接利用PUSH压入堆栈传参,浮点寄存器为8字节,而在32位的80386的机器上,PUSH 只能压入4字节的数据所以程序将浮点数装载尽ST(0)寄存器,先提高堆栈空间,分配8个字节,然后从ST(0)弹出到ESP栈顶单元进行传参*/// float fFloat = GetFloat();// printf("%f",fFloat);// 字符串/*char *pcChar = "Hello World";wchar_t *pwChar = L"Hello World";pcChar = "逆向分析";pwChar = L"逆向分析";*///bool// bool bBool;// if (argc > 0)// {// bBool = true;// }// else// {// bBool = false;// }// 地址、指针和引用// 对指针取内容// int nVar = 12345678;// // int *pnVar = &nVar;// char *pcVar = (char *)&nVar;// short *psnVar = (short *)&nVar;// // printf("%08x \r\n",*pnVar);// printf("%08x \r\n",*pcVar);// printf("%08x \r\n",*psnVar);// 指针偏移// 指针寻址的公式,即 p + n = 首地址 + sizeof(指针类型type) * n;// 求数组元素的个数// 指针相减必须是两个同类型的指针类型相减,否则没有意义// char cVar[5] = {0x01,0x23,0x45,0x67,0x89};// int *pnVar = (int *)cVar;// char *pcVar = (char *)cVar;// short *psnVar = (short *)cVar;// // pnVar += 1;// pcVar += 1;// psnVar += 1;// 引用类型// 从汇编代码可以看出,引用类型其实等同于指针,在内存中占4个字节的内存空间,保存的是地址// 引用类型是对指针的封装,更加安全可靠,不用担心数据被不小心破坏掉导致程序的崩溃// int nVar = 12345678;// int &nVarType = nVar;// // Add(nVar);// printf("%d",nVar);// 常量// 字符串常量,在内存中直接存放,在程序运行之前就已经存在了的,不可以修改的。// 字符串常量的首地址 - 程序的基地址,即为其在文件中(没有加载到内存时)的偏移地址// Hello World的字符串常量的便宜地址为 00427018 - 00400000 = 27018 // 打开16进制编辑工具可以直接GO到该地址,查看其在可执行文件中所对应的数据// 00427018 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Hello World!................// char *pString = "Hello World!";// printf("%c",*pString);// 常量有真常量#define 和 假常量 const 在编译过程中由编译器判断的,在内存中仍有内存占用的变量,只是在程序编译的时候// 检查在定义之后,是否有修改,如果有,则报错。// project -> settings -> C/C++ -> project Options 添加 /P选项,将预处理文件生成到.i文件中// const int nVar = 1;// printf("const = %d #define = %d \r\n",nVar,1);// 可以看到Number_One被1替换了// #define NUMBER_ONE 1// // const int nVar = NUMBER_ONE;// printf("const = %d #define = %d \r\n",nVar,NUMBER_ONE);// Const 常量 其实是可以修改的// 当在内存中时,其值被动态修改了。但是为什么输出还是没有变得值呢。因为nConst的值是已知的,如果是未知的话就可以被修改了const int nConst = 0;int *pConst = (int *)&nConst;*pConst = 6;printf("%d",nConst);getchar();return 0;}
0 0
- C++反汇编与逆向分析之数据类型的基本表现学习笔记
- c&c++反汇编与逆向分析学习笔记(3)--基本数据类型表现形式
- c&c++反汇编与逆向分析学习笔记(2)--反汇编静态分析工具IDA
- c&c++反汇编与逆向分析学习笔记(5)--加法的求值过程和编译器优化
- c&c++反汇编与逆向分析学习笔记(1)--调试工具OllyDBG
- c&c++反汇编与逆向分析学习笔记(4)--启动函数和用户入口
- c&c++反汇编与逆向分析学习笔记(6)--减法表达式
- c&c++反汇编与逆向分析学习笔记(7)--乘法表达式
- c&c++反汇编与逆向分析学习笔记(8)--除法表达式
- c&c++反汇编与逆向分析学习笔记(9)--自增和自减
- c&c++反汇编与逆向分析学习笔记(10)--关系及逻辑运算
- C++反汇编与逆向分析技术揭秘小笔记
- 反汇编与逆向分析技术_笔记
- C++反汇编与逆向之识别main函数学习笔记
- 反汇编学习笔记-数据类型
- c++反汇编学习笔记----------1.基本数据类型
- c++反汇编与逆向分析 小结
- c++反汇编与逆向分析
- 桶式排序
- 穷举法猜数字
- ObservableCollection<T>类
- mysql之root密码问题
- java中List集合的遍历和两种实现类的比较分析
- C++反汇编与逆向分析之数据类型的基本表现学习笔记
- 腾讯SNG移动端开发实习生面试之电话面试
- LintCode 96. 链表划分
- 由中序与前序、中序与后序重建二叉树
- hpu 1799 循环多少次?
- SDWebImage的运行原理
- shell之gcc用法汇总
- 回音消除技术概述
- 利用RFI劫持mysql连接