全局变量

测试代码

全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。下面这段代码中将int、float、char变量定义在main函数之外。

// 变量.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h" //全局变量
// 整型
int a_nNum = 22; // 浮点型
float fNum = 2.5; // 字符型
char ch = 'A'; int main()
{
// 整型
int nNum = 1; printf("int %d ,int %d, float %f ,char %c", a_nNum, nNum, fNum, ch); return 0;
}

VS反汇编结果

IDA反汇编结果

局部变量标识区只有ver_8一个变量,而全局变量则集中保存在.data区域。IDA帮我们识别出变量的类型,byte、dword,双击变量可以看到数据的定义。

双击全局变量可以进入全局变量存放区,根据右键显示的数据可以修改名称。

数组

测试代码

#include "stdafx.h"

int main()
{
int nArr[5] = { 1,2,3,4,5 };
int n = 2;
nArr[n] = 20; return 0;
}

VS反汇编结果

当在函数内定义数组时候,如果没有其他声明,该数组即为局部变量,拥有局部变量的所有特性,数组中的数据在内存中的存储是线性连续的,其数据排列顺序由低地址到高地址。数组名称表示该数组的首地址。

这是数组在内存中的数据分布的样子

IDA反汇编结果

数组中的各项元素均为同一类型的数据,而局部变量赋值时的类型都不相同。根据此特征即可判断局部变量不是数组中的元素。在寻址的过程中,数组不同于局部变量,不会因为被赋予了常量值而使用常量传播。

在IDA中反汇编代码中,可以看出连续使用了5个4字节的内存地址,依次赋值整型数据1、2、3、4、5。双击标号“var_18”定位到标号定义处,在IDA下单击此标号,按键盘上的“*”或者右键【Array】将连续的变量定义为数组。

新建一个数组定义,大小设置为5

回到反汇编视图,选取"var_18“并使用快捷键"N”键将标号重新命名为“nAarray”,程序中所有用到该数组标号的地方将全部被修改。

IDA中F5后可看到的源代码,这款静态分析工具果真是牛逼。

结构体

测试代码

#include "stdafx.h"

//定义结构体
struct MyStruct
{
int nNum;
float fNum;
char chA; }; void Print(MyStruct stc)
{
printf("int %d , y %f , z %c",stc.nNum,stc.fNum,stc.chA);
} int main()
{
//结构体初始化
MyStruct stc = { 1,2.2,'A' };
stc.fNum = 5.5;
Print(stc);
return 0;
}

VS反汇编结果

IDA反汇编结果

在反汇编结果中,初始化赋值整型变量、浮点型变量、字符型变量,而函数体内浮点型变量是赋值了第二次的。熟记结构体中所有变量都共享一片内存的特性,在反汇编中识别出结构体则在于三个变量一起传入了堆栈。逆向过程中更主要是靠猜,不对的话我们再改回来。而且改之前一定要有想法,知道自己要做什么。

为了使反汇编更利于逆向中的阅读,我们首先在结构体窗口点击【insert】键插入一个结构体

选择结构体的ends部分,点击快捷键【d】,增加结构体变量

00000001 struc_1         ends

增加三个变量,使用快捷键【n】将三个变量改名。这里要注意基础数据类型都为DD,否则有可能导致数据类型不匹配出现两个结构体问题。

00000000 struc_5         struc ; (sizeof=0x4, mappedto_25)
00000000 nNum dd?
00000001 fNum dd?
00000003 chA dd?
00000004 struc_5 ends

回到反汇编窗口,双击变量。到 stack of sub_xxx(局部堆栈) 窗口下将变量转换成结构体类型

可以使用快捷键【alt+Q】,转换成指定结构体。

使用结构体解析变量后,可以看到反汇编窗口中变量以结构体形式显示。F5大法后还原高度仿真的伪C代码

【逆向工具】IDA使用3-全局变量、数组、结构体的更多相关文章

  1. keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    以前写单片机程序时总是把所用函数和变量都写在一个c文件里,后来遇到大点的项目,程序动则几千行,这种方式无疑会带来N多麻烦,相信大家都有所体验吧! 后来学会了在keil里进行模块化编程,即只把功能相同或 ...

  2. 详解keil采用C语言模块化编程时全局变量、结构体的定义、声明以及头文件包含的处理方法

    一.关于全局变量的定义.声明.引用: (只要是在.h文件中定义的变量,然后在main.c中包含该.h文件,那么定义的变量就可以在main函数中作为全局变量使用) 方法1: 在某个c文件里定义全局变量后 ...

  3. C语言基础知识点整理(函数/变量/常量/指针/数组/结构体)

    函数 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...

  4. C数组&结构体&联合体快速初始化

    背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元 ...

  5. c++ 数组 结构体

    接下来的一点时间我将会记录下我看的c++的一些心得体会,人贵在坚持,希望我可以一直坚持下去!!Go Fighting!   一.c++复合数据类型: 数组类型的一些注意事项: sizeof的用法: 当 ...

  6. C89,C99: C数组&结构体&联合体快速初始化

    1. 背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组 ...

  7. Leetcode LRU缓存,数组+结构体实现

    一.算法思路 LRUCache类有以下函数和变量: LRUCache(int capacity): capacity是当前对象能够存储的键值对(key,value)最大个数. int get(int ...

  8. 【C++】结构体/结构体数组/结构体指针/结构体嵌套/函数参数/const

    一.结构体声明 struct Student { //成员列表 string name; int age; int score; }; //s3;定义时直接声明 int main() { struct ...

  9. C# Struct结构体里数组长度的指定

    typedef struct Point{ unsigned short x; unsigned short y; }mPoint;//点坐标 typedef struct Line{ mPoint ...

随机推荐

  1. FreeBSD ZFS

    FreeBSD ZFS https://www.cnblogs.com/hadex/p/6068476.html 参考資料 http://docs.oracle.com/cd/E37934_01/ht ...

  2. LOJ #6270. 数据结构板子题 (离线+树状数组)

    题意 有 \(n\) 个区间,第 \(i\) 个区间是 \([l_i,r_i]\) ,它的长度是 \(r_i-l_i\) . 有 \(q\) 个询问,每个询问给定 \(L,R,K\) ,询问被 \([ ...

  3. JOISC 2017 自然公园

    吐槽 YMD的课件是真的毒,YYB的也很毒. 题目链接 LOJ sol 我是一个一个Subtask做的... Subtask 1 \(O(n^2)\)枚举每两个点有没有边即可. Subtask 2 链 ...

  4. hdu3516 Tree Construction (区间dp+四边形优化)

    构造方法肯定是把相邻两个点连到一起,变成一个新点,然后再把新点和别的点连到一起.... 设f[i,j]为把第i到j个点都连到一起的代价,那么答案就是f[1,n] f[i,j]=min{f[i,k]+f ...

  5. 【POJ3585】Accumulation Degree 二次扫描与换根法

    简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...

  6. 关于使用vw单位适配H5项目(二)

    一些比较小的H5页面,我觉得全没有必要一定要使用框架的,比如vue和react之类的,我觉得原生的js,html5也可以写好移动端. 最近刚好要赶10多个h5页面,适配移动端的,各种手机型号都要适配, ...

  7. SpaceNet 数据集

    SpaceNet 数据集 SpaceNet是DigitalGlobe商业卫星公司提供的遥感图像集合,包含一些标记信息可用作机器学习研究. SpaceNet Challenge主页: https://s ...

  8. 解决Win8.1 IE11兼容性问题的方法

    装了64位win8.1企业版,IE11出现了一些兼容性问题,如个别网银网页兼容问题,还有office.迅雷.adobe reader.旋风等等插件不兼容不能加载的问题. 折腾了一天总算全部解决了,主要 ...

  9. 泛型List小项目

    页面设计: 显示图书列表运行效果: 添加集合元素运行效果: 插入集合元素运行效果: 删除选中对象: 项目我已经上传到我的百度云盘,下载链接:http://pan.baidu.com/s/1mi3BjY ...

  10. ECharts图表引用json数据

    来讲两个图表,一个折线图,一个饼图. 先来看看效果图: 现在来看看代码,先来折线图,后台: (这里的后台太麻烦了,写的太多.可以使用Linq的方式,Linq比较简单写的也少.参考我的这篇文章的2018 ...