逆向分析-数据结构

数据结构是计算机存储,组织数据的方式。在逆向分析时,确定数据结构以后,算法就很容易得到了。有些时候,事情也会反过来,即根据特定算法来判断数据结构。

1.局部变量

  局部变量是函数内部定义的一个变量,其作用域和生命周期局限于索在函数内。使用局部变量使程序模块化封装成为可能。从汇编的角度看,局部变量分配空间时通常会使用栈和寄存器。

  (1)利用栈存放局部变量

    局部变量在栈中进行分配,函数执行后会释放这些栈,程序用“sub esp,8” 语句为局部变量分配空间,用【ebp-xxx】寻址调用这些变量,而参数调用相对于ebp偏移量是正的,即[ebp+xxxx],因此在逆向分析时比较容易区分。

    编译器在优化模式时,通过esp寄存器直接对局部变量和参数进行寻址。当函数退出时,用“add esp,8” 指令平衡栈,以释放局部变量占用的内存。有些编译器(例如Delphi) 通过给esp加一个负值来进行内存的分配。

    另外,编译器可能会用“push reg”指令取代“sub esp,4”以节省字节的空间。

    局部变量的起始值是随机的,是其他函数执行后留在栈中的垃圾数据,因此需要对其进行初始化。初始化局部变量有俩种方法:

      一种是通过mov指令为变量赋值

      另一种是直接压入栈中

  (2)利用寄存器存放局部变量

    除了栈占用俩个寄存器,编译器会利用剩下的6个通用寄存器尽可能有效地存放局部变量,这样可以少产生代码,提高程序效率。如果寄存器不够用,编译就会将变量放入栈中。在进行逆向分析时要注意,局部变量的生存周期较短。必须及时确定当前寄存器的变量是哪个变量。

2.全局变量

   全局变量作用于整个程序,它一直存在,放在全局变量的内存区中。局部变量则存在于函数的栈区中,函数调用结束后便会消失。在大多程序中,常数一般在全局变量中,例如一些注册版标记,测试版标记等。

   在大多数情况下,在汇编代码中识别全局变量比其他结构中要容易得多。全局变量通常位于数据区块(.data)的一个固定地址处,当程序需要访问全局变量时,一般会用一个固定的硬编码地址直接对内存进行寻址。

   全局变量可以被同一文件中的所有函数修改,如果某个函数改变了全局变量的值,就能影响其他函数(相当于函数间的传递通道),因此,可以利用全局变量来传递参数和函数返回值等。全局变量在程序的整个执行过程中占用内存单元,而不像局域网变量那样需要时才开辟内存单元。

3.数组

    数组是相同数据类型的元素的集合,它们在内存中按顺序连续存放在一起。在汇编状态下访问数组一般是通过基址+变址 寻址实现的。

    在内存中,数组可存在于栈,数据段及动态内存中。本例中的a[]数组就保存在数据段中。

原文地址:https://www.cnblogs.com/godoforange/p/10368015.html

时间: 2024-11-02 09:40:03

逆向分析-数据结构的相关文章

“金山杯2007逆向分析挑战赛”第一阶段第二题

注:题目来自于以下链接地址: http://www.pediy.com/kssd/ 目录:第13篇 论坛活动 \ 金山杯2007逆向分析挑战赛 \ 第一阶段 \ 第二题 \ 题目 \ [第一阶段 第二题] 题目描述: 己知是一个 PE 格式 EXE 文件,其三个(section)区块的数据文件依次如下:(详见附件)  _text,_rdata,_data 1. 将 _text, _rdata, _data合并成一个 EXE 文件,重建一个 PE 头,一些关键参数,如 EntryPoint,Imp

【Android SDK程序逆向分析与破解系列】之二:Android可执行程序DEX分析(一)

作者:郭嘉 邮箱:[email protected] 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWells [Android SDK程序逆向分析与破解系列]章节索引 一 DEX文件数据结构 DEX使用的数据类型如下表所示: u1~u8:表示1~8字节的无符号数. sleb128.uled128和uled128pl:DEX文件特有的LEB128数据类型.每个LEB128由1~5个字节组成,所有的字节组合在一起

一文了解安卓APP逆向分析与保护机制

"知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道."知物由学"希望通过一篇篇技术干货.趋势解读.人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你. 以下为文章正文: 想知道Android App常见的保护方法及其对应的逆向分析方法吗? 网易云易盾资深安全工程师 钟亚平 3月17日,安卓巴士全球开发者论坛在重庆举办,网易资深安全工程师钟

RE-1 逆向分析基础

逆向分析基础 0x01-0x0C 本笔记使用汇编指令为x86架构下汇编指令,ARM架构汇编指令不做介绍 0x01. 关于RE 逆向工程(Reverse Engineering RE) 逆向分析方法: 静态分析法:观察代码文件的外部特征.获取文件的类型(EXE.DLI.DOC.ZIP等).大小.PE头信息.Import/Export API.内部字符串.是否运行时解压缩.注册信息.调试信息.数字证书等多种信息,使用反汇编查看内部代码 动态分析法:通过调试来分析代码流,获取内存状态,可以在观察文件.

c++反汇编与逆向分析 小结

第一章  熟悉工作环境和相关工具1.1 熟悉OllyDBG  操作技巧1.2 反汇编静态分析工具 IDA(最专业的逆向工具)    快捷键    功能     Enter     跟进函数实现     Esc       返回跟进处    A         解释光标处的地址为一个字符串的首地址     B         十六进制数与二进制数转换    C         解释光标处的地址为一条指令     D         解释光标处的地址为数据,没按一次将会转换这个地址的数据长度   

IOS逆向分析——GL脚本的提取

总结:要逆一个程序必须清楚地知道程序的结构和常用的API函数,不清楚一个程序而去逆出结果是不可能滴 首先是glsl脚本运行的全过程,第一步是为shader的运行创建一个容器GLuint glCreateProgram(void),第二步是把编译好的shader附加到程序void glAttachShader(GLuint program, GLuint shader),编译好的shader可以是多个所以第二步可以重复多步把每一个编译好的一一附加到程序,顶点shader和像素shader一一成对,

Android逆向分析(2) APK的打包与安装

http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之鱼不如授之以渔,只有知道一些基本原理,才能让我们以后能自行解决更多问题. 那么,你知道么?从我们在Android Studio中,点击run,

逆向分析智能窗帘频射协议

近来我热衷于对家庭自动化设备的破解,然后将它们添加到我的Homekit集成包之中.这事情要从几个月前说起,当时我爸订购了大批量的RAEX 433MHz射频电动窗帘,以替代老式的手动式窗帘. 注意:你可以在Spotlight网店搜索Motion Motorised Roller Blind找到该窗帘. 我对这个电动窗帘非常满意,有了它我就不用跑上跑下的去打开/关闭窗户,可是为了控制它们,你需要购买RAEX的遥控器.RAEX有许多不同类型的遥控器产品,其中我选择购买了以下两种遥控器: R 型遥控器

Android动态逆向分析工具ZjDroid--脱壳神器

项目地址:https://github.com/BaiduSecurityLabs/ZjDroid 前提条件: 1.Root手机一部 2.须要通过Xposed installer( http://dl.xposed.info/latest.apk)安装Xposed Framework; 一.ZjDroid工具介绍 ZjDroid是基于Xposed Framewrok的动态逆向分析模块,逆向分析者能够通过ZjDroid完毕下面工作:1.DEX文件的内存dump2.基于Dalvik关键指针的内存Ba