《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

时间:2023-03-09 15:55:06
《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

---恢复内容开始---

  • 基本的浮点数指令

示例代码:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

Visual Studio 2013的反汇编代码是:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

对于movss,表示移动标量单精度浮点值

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

将标量单精度浮点值从源操作数(第二个操作数)移到目标操作数(第一个操作数)。源操作数与目标操作数可以是 XMM 寄存器或 32 位内存位置。此指令可用于将单精度浮点值移入/移出 32 位内存位置与 XMM 寄存器的低位双字,或是用于在两个 XMM 寄存器的低位双字之间移动单精度浮点值。此指令不能用于在内存位置之间传输数据。

对于cvtsi2ss指令,起到的是一个转换的功能:

cvtps2pi MM,XMM/m64
把源存储器低64位两个32位单精度浮点数转为两个32位有符号(补码)整数,放入目的寄存器。

cvtss2sd

cvtss2sd XMM,XMM/m32
把源存储器低32位1个单精度浮点数变成1个双精度浮点数,结果送入目的寄存器的低64位,高64位不变.

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

cvttss2si

将源操作数(第二个操作数)中的单精度浮点值转换成目标操作数(第一个操作数)中的有符号双字整数。

  • 指针

示例:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

这里不管指针是什么类型的,由于都是32位的指针,所以都是的dword ptr。但是下面就因为数据类型的不同,导致分别使用的是byte ptr、dword ptr、word ptr:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

示例代码:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

不同类型的指针加1,增长的大小其实是不同的,加的是这个类型的长度:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

  • 引用

引用类型其实就是指针类型,只不过它用于存放地址的内存空间对使用者而言是隐藏的。

示例:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

这里nVarType保存的实际上就是nVar变量的地址:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

再来看Add函数的反汇编:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

eax中保存的是传递下来的nVar的地址。

  • 常量

常量数据在程序运行前就已经存在,它们被编译到可执行文件中。当程序启动后,便会被加载进来。这些数据通常都会在常量数据区中保存,该节的属性中是没有可写权限的,所以在对常量进行修改时会报错。

示例:

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式

《C++反汇编与逆向分析技术揭秘》——基本数据类型的表现形式