逆向C++学习手记(1)
最近常遇到的尴尬是看着汇编代码却无法在脑中反应出正确的C、C++代码 。近日偶得一篇好文《reverse C++》,细读下来收获不少。遂打算在《reverse C++》的基础上扩展,从汇编角度来认识一些C、C++中的语法现象~先从一些简单的开始...
一、数组数组是非常基本的数据结构,C++中的数组表现为一段连续可用的内存。注意这段内存地址是连续的,这与很多动态语言中的数组不一样,举例来说PHP中的数组实际上是一种hash表式的实现,因而肯定不会是一段连续的内存。
?
对于充当全局变量的数组,会自动为数组中的每个变量附上默认值;而对于声明在函数体内部的局部变量,则需要手动进行初始化。来看一段简单的代码:
?数组arr 被放到了数据区 00406030 - 00406057 的区域。很显然,这里无法利用ESP + XXX 或者 EBP - XXX 来直接对数组中的内容进行访问,因为arr 并不是存在于栈区。因此在main函数中,对该数组的访问直接写成了硬编码的地址。一旦PE 被映射进内存,就可以直接操作写死的内存地址。这里的main 函数编译成如下:
mov???? dword ptr [406044], 1
retn?
一般对数组的访问都是由基地址(数组首地址)+偏移量组成。
首地址形如: ESP+XXX 或者 EBP-XXX
偏移量形如: ElementSize*INDEX(ElementSize是数组中元素的大小,index放在eax或者ecx等寄存器中)
?
但是这里直接写死的地址406044,406044就表示arr[5],甚至连“基址 + 偏移量”都没用到。
?
?
?
?
1 楼 RednaxelaFX 2011-05-31 话说,要是读过Inside the C++ Object Model的话可能很多东西都会觉得很直观了
还有就是留意一下不同编译器生成的代码的差异… 2 楼 driftcloudy 2011-05-31 RednaxelaFX 写道话说,要是读过Inside the C++ Object Model的话可能很多东西都会觉得很直观了
还有就是留意一下不同编译器生成的代码的差异…
内力不够深啊TT...我去瞅瞅那本书