全局分配数组、栈分配数组、堆分配数组在IDA反汇编中的不同——《IDA权威指南》例子尝试

本文深入探讨数组在不同内存区域的分配方式:全局、栈和堆。通过实例代码,解析每种分配方式的特点及反汇编过程中的识别技巧,适合汇编初学者理解数组在内存中的表现形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

  • 本文例子均来自《IDA PRO 权威指南》第八章第一节
  • 阅读前需要掌握基本的汇编指令

例子

1、全局分配的数组

int global_array[3];

int main() {
   int idx = 2;
   global_array[0] = 10;
   global_array[1] = 20;
   global_array[2] = 30;
   global_array[idx] = 40;
}

在这里插入图片描述
在这里插入图片描述

  • 全局变量存在.data或者.bss节内
  • 在使用ida反汇编的时候没办法知道数据到底是不是数组,要自己分析

2、栈分配的数组

int main() {
   int stack_array[3];
   int idx = 2;
   stack_array[0] = 10;
   stack_array[1] = 20;
   stack_array[2] = 30;
   stack_array[idx] = 40;
}

在这里插入图片描述

  • array[0](var_10,-10h)储存数组内第一个数的偏移量
  • 通过idx的赋值位置,可以分析出数组的大小,(10h-4h)/4h=3

3、堆分配数组

#include <stdlib.h>

int main() {
   int *heap_array = (int*)malloc(3 * sizeof(int));
   int idx = 2;
   heap_array[0] = 10;
   heap_array[1] = 20;
   heap_array[2] = 30;
   heap_array[idx] = 40;
}

在这里插入图片描述
在这里插入图片描述

  • 不太明白书中说的为什么每次访问数组的时候都要进行一次array地址的读取,执行完之后array的地址应该是已经确定了的,频繁的读取[ebp+array]不知道为什么

总结

  • 都很容易看出每个元素大小
  • 在不知道源码的情况下并不能很快人出是数组
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜会美丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值