做数据逆向分析最先应该区分数据是常量、变量,还是指针。可是作为二进制数据本身不会标记自己是什么,然而编译器将不同的的类别储存在不同的区域。
变量数据应分为这两类:
1. 局部非静态变量:
对于1KB以下的该种变量,一般都要放在栈区,那么它的寻址必然用到ebp寄存器来间接变址进行寻址。另外,有些编译器(比如gcc)出于优化考虑,也会用到esp寄存器。
举例:
1 | void fun() |
2. 全局变量、局部静态变量:
它们统一储存在数据节,因为它们的实现方式是一样的,都是直接寻址方式来寻址,只是全局变量,在所有区域均可访问,而局部静态变量只能在函数内部访问。
举例
1 |
|
常量
常量和全局变量、静态变量实现方法使一样的,使用直接寻址,但区别是:只能读、不可写。
比如:
1 | 1. mov eax, [417034h] |
指针
指针可以当做是存储地址的变量,它即可以是全局变量,也可以是局部非静态变量,但与普通变量的区别是:”初始化时使用offset或lea,使用指向内容时二次寻址”。
举例:初始化:
1 | 1.mov [417034h],offset “AAAA”//全局指针 |