[C++逆向] 8 数组和指针的寻址

  • 数组是相同类型数据的集合,以先行方式连续储存在内冲中
  • 而指针只是一个保存地址值的4字节变量。

数组在函数中

  • 数组定义在函数中时,如果没有其他声明,数组为局部变量
    • 数组在内存中时线性连续的,数据排列顺序由低地址到高地址,数组名是数组的首地址
  • 反汇编之后,数组很像是连续定义了好几个变量,区分他们的方法
    • 观察类型,如果一些连续定义的变量中出现不同的类型,那就不是数组
    • 内存中是否一致
  • 数组不会因为被赋予常量值而使用常量传播
  • IDA中解析数组的方法
    • 双击标号定位首地址
    • 按下"*" 以这里为首地址
    • 填写数组大小
    • 按下"N" 重命名

字符串

  • 字符串本身就是数组,最后一个数据使用‘0’作为结束符
  • VC6中,为字符串类型赋值,是字符串赋值的过程。每次复制4字节,如果不是4的倍数,就依次减少
    • 4 4 2 1 的方式来复制11字节数据
  • 复制的时候使用eax,ecx,edx三个寄存器

数组作为参数

  • 数组作为参数的时候,只传递首地址

以下代码,在Debug模式下,汇编之后可以看到call _strlen

image-20200427131705061

image-20200427131649577

但是在Release模式下,编译器将函数作为内联函数处理了。

image-20200427143146630

  • MMX 寄存器

MMX 为一种 SIMD 技术,即可通过一条指令执行多个数据运算,共有8个64位寄存器,分别为mm0 – mm7,
他与其他普通64位寄存器的区别在于通过它的指令进行运算,可以同时计算2个32位数据,或者4个16位数据等等,
可以应用为图像处理过程中图形 颜色的计算。
另外需要特别注意的是,MMX并非一种新的寄存器,而是FPU 80位寄存器的低64位,也就是说,使用MMX指令集,会影响浮点运算!

  • XMM 寄存器

XMM 同 MMX,只是他有 8 个 128 位寄存器,分别为 xmm0 – xmm7,另外还包含计算过程中的状态和控制寄存器

原文链接:https://blog.csdn.net/lidonghat/article/details/70244288

下标寻址和指针寻址

两种寻址方式

  • 下标寻址
    • 直接通过数组首地址和下标计算的偏移得到数据地址(首地址+(sizeof(type)*下标))
    • 下标值为整形常量的寻址:直接计算数据所在地址
    • 下标值为整形变量的寻址:需要计算偏移,形如:dword ptr [ebp+ecx*4-14h]
    • 下标值为整形表达式的寻址:如果是常量表达式,会常量折叠,编译期间算出结果
  • 指针寻址
    • 通过指针变量获取数据地址的地址,再去找数据地址(两次寻址)

多维数组

  • 将多维数组转为一维数组

存放指针类型数据的数组

  • 数组中全部都是类型相同的指针构成的数组
  • 字符串指针数组指向的是字符串的地址,但是二维字符数组就是内容

指向数组的指针变量

  • 定义方式:char (*pArray)[10];
  • 代码如下:
#include<iostream>
using namespace std;

int main()
{
    char sArray[3][10] = {"Hello","World","!!!"};
    char(*pArray)[10] = sArray;
    for (int i = 0; i < 3; i++)
    {
        cout << *pArray << endl;
        *pArray++;
    }
    return 0;
}

函数指针

  • 保存函数首地址的指针
  • 例子代码如下:
#include <stdio.h>

int addNum(int i,int j)
{
    printf("%xn%dn",i,i);
    return i & 0x7;
}

int main()
{
    int(*addNumP)(int, int) = NULL; //定义一个函数指针
    addNumP = &addNum;  //将函数地址赋值给函数指针
    printf("%dn",addNumP(-3,2));
    return 0;
}

struct v
{
    int(*addNumP)(int, int);    //第一个成员 函数指针
    char c = 48;                //第二个成员 一字节数据
};

原文链接: https://www.cnblogs.com/cjdty/p/12801510.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    [C++逆向] 8 数组和指针的寻址

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/345115

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午3:03
下一篇 2023年3月2日 上午3:04

相关推荐