IDA使⽤-全局变量、数组、结构体
全局变量
全局变量既可以是某对象函数创建,也可以是在本程序任何地⽅创建。全局变量是可以被本程序所有对象或函数引⽤。下⾯这段代码中将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;
}
局部变量标识区只有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;
}
当在函数内定义数组时候,如果没有其他声明,该数组即为局部变量,拥有局部变量的所有特性,数组中的数据在内存中的存储是线性连续的,其数据排列顺序由低地址到⾼地址。数组名称表⽰该数组的⾸地址。
这是数组在内存中的数据分布的样⼦
数组中的各项元素均为同⼀类型的数据,⽽局部变量赋值时的类型都不相同。根据此特征即可判断局部变量不是数组中的元素。在寻址的过程中,数组不同于局部变量,不会因为被赋予了常量值⽽使⽤常量传播。
在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)
{sizeof结构体大小
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;
}
在反汇编结果中,初始化赋值整型变量、浮点型变量、字符型变量,⽽函数体内浮点型变量是赋值了第⼆次的。熟记结构体中所有变量都共享⼀⽚内存的特性,在反汇编中识别出结构体则在于三个变量⼀起传⼊了堆栈。逆向过程中更主要是靠猜,不对的话我们再改回来。⽽且改之前⼀定要有想法,知道⾃⼰要做什么。
为了使反汇编更利于逆向中的阅读,我们⾸先在结构体窗⼝点击【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代码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论