能力值:
( LV2,RANK:10 )
|
-
-
2 楼
就是初始化啊,你管它是不是0CCCCC干嘛,C语言写的,vc的Hello Word 反汇编初始化也是0CCCCC,这个是规定,不用理它,SE程序那个是系统弄的,也不用管,直接找main就 OK了
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
有的时候还会出现
push ebp
mov ebp,esp
and esp,0FFFFFFF0h 或者 and esp,0FFFFFC68h或者and esp,0FFFFFFF0
这里的不同的数值到底有何意思?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你可以看下 函数调用原理 ,这个就是开辟占空间,
|
能力值:
( LV12,RANK:400 )
|
-
-
5 楼
0CCCCCCCCh是有特定用处的,因为CC就是Int3指令,所以在变量空间中填写这个指令,可以尽可能 的防止缓冲区溢出。如果程序执行到这里,就自动停下来,而不会再乱执行。
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
好的 你说的对
|
能力值:
( LV12,RANK:400 )
|
-
-
7 楼
只是恰巧知道而已,还得继续学习。。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
高手,一语中的
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
至于 "and esp,FFFFFFF0h"
因为0xFFFFFFF0 = 11111111 11111111 11111111 11110000
这个相当于把esp的最后4个bit位清零, 也就是把stack往低地址对齐使其能够被16整除...这样对32位或者64位CPU来说,所有的的stack上的基本变量都可以一次访问到(如果地址没有对齐,那么有可能CPU需要访问两次内存来获得一个8 byte的变量) -- 这样看来,实际上将stack地址在8 byte上对齐对32位甚至64位的CPU都足够了...但是问题是对于一些 SIMD (single instruction, multiple data) 的指令*规定*访问的地址必须向16 byte对齐 (也就是必须被16为整除 -- 这是从指令效率的方面来设计的).
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
这个可以管一下的。 你知道VC里面有名的 烫烫烫烫烫 么。 就是这货。
VC为了防溢出,对栈中申请的数据,未初始化的都由编译器初始化为0xCCCC ,如果出现未初始化使用,编译器就会检测到。然后提示用户。
对应的堆中使用的是0xFEFF
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
对, 当在heap里面分配新内存的时候,VC会对新的区域加初始化为0xCDCDCDCD,
0xCD也是中断指令(interrupt,带8位直接参数的). 这样万一程序因为什么bug执行到了这段是0xCC或者0xCD的内存,就会引发中断, 从而被你觉得奇怪的那个编译器生成的SEH 代码捕捉到,而这些生成的SEH很多时候是把发生问题处的内存内容显示出来,这样如果是0xCC的话,在中文的区域设置里面,对于MBCS字符集,就是"烫烫烫烫烫";如果是0xCD的话,就是“屯屯屯屯屯”...
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
你搞个Release版本的出来再调就是xor eax,eax rep stosd了.
|
|
|