能力值:
( LV2,RANK:10 )
|
-
-
2 楼
对了,顺便说一下, 该程序时用 C++ 编译的。
实在太奇怪了,估计没有人能回答/。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
个人认为做这样的分析最好能够结合寄存器和堆栈值的变化来分析~
例如eax初始值是 $1004,那进入0054B410之后会发生什么变化呢?
或许不是最好的办法,但是不妨试一下~
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
2楼这位大哥,不知阁下又没有注意最后 2行,
push eax
ret
就这2行就够受的
都不知道 函数返回到什么地方去了,
还有就是 这个程序没有办法动态跟踪。所以还拿出来求助~
不过还是感谢 。
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
补充一点,我猜想可能是 分配 1004 个byte 空间(局部变量)
比如 byte bytes[]=new bytes[1004]
|
能力值:
( LV3,RANK:20 )
|
-
-
6 楼
用IDA看看吧,我估计IDA应该识别出来是probexx之类的吧,是栈上的内存分配
另外,看了一下lz的发帖时间,你不会是从昨天晚上8点一直搞到今天早上吧,呵呵。如果有这股劲,那什么都能高定的。不过我是菜鸟,只是随便说说了,不能作为指导意见。
|
能力值:
( LV13,RANK:380 )
|
-
-
7 楼
这样,你满意了吧!
确实是如justlovemm所说,是最常见的库函数__alloc_probe(size)
楼主的猜想很正确,向楼主这种求知精神表示敬意。
其函数的作用是分配堆栈空间,对堆栈空间进行安全检查。
算法如下,
当要求分配的堆栈空间小于1000时,
neg eax
add eax, esp
add eax, 4
; 这三条指令作用是算出正确的堆栈指针,最后加4,是因为在调用此函数时本身往堆栈中压入了4字节的返回地址
test [eax], eax
; 对堆栈桢底部进行非破坏性的读测试,其实源操作数可以是任意寄存器,比如test [eax], ebx
使用eax是效率最高的
; 读测试时,如果当前堆栈不可存取,便会出错。不用等到caller函数执行时出错。是程序可以采用的内存管理安全措施之一,其它还有Heap Cookie, ...
xchg eax, esp
; esp被赋值,与原值的差值是caller函数需要的堆栈桢大小
; eax被赋值,指向callee的返回地址
mov eax, [eax]
push eax
retn
; 只要知道eax最后等于返回地址,就不难理解这段代码了吗
当要求分配的堆栈空间大于1000时,以0x1000为分配单位,小心的分配,小心的测试
probepage:
sub ecx, 1000h ; ecx是堆栈指针
sub eax, 1000h ; eax是尺寸
test [ecx], eax ; 非破坏性读测试
cmp eax, 1000h
jnb short probepage ;
在理解的时候,注意堆栈上的返回地址,堆栈指针的传递,test指令的意图,...
剩下的代码再通过上面的代码举一反三,就知道意思了。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
学习了
|
能力值:
( LV12,RANK:250 )
|
-
-
10 楼
学习了。
不看几位牛人的解释,我还以为又是扭曲变换。怎么库函数也用这种push eax,ret.
|
|
|