zoukankan      html  css  js  c++  java
  • 【逆向工具】IDA使用3-全局变量、数组、结构体

    全局变量

    测试代码

    全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建。全局变量是可以被本程序所有对象或函数引用。下面这段代码中将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代码

  • 相关阅读:
    Python的垃圾回收机制
    标准库
    常用数据库命令备忘录(持续增量更新)
    Springboot配置excludePathPatterns不生效问题 (2020-06-28 22:21)
    Android 子线程无法刷新UI界面
    如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似)
    Android Studio 如何获取 text文本内容
    Css设置最优先
    CentOS7下MySQL服务启动失败原因及解决方法
    Js/Jquery获取input file的文件名
  • 原文地址:https://www.cnblogs.com/17bdw/p/6629643.html
Copyright © 2011-2022 走看看