首页
社区
课程
招聘
[求助]非常奇怪的函数
2008-4-19 20:42 5413

[求助]非常奇怪的函数

2008-4-19 20:42
5413

0054B410 >/$  CMP EAX,1000
0054B415  |.  JNB SHORT main.0054B425
0054B417  |.  NEG EAX
0054B419  |.  ADD EAX,ESP
0054B41B  |.  ADD EAX,4
0054B41E  |.  TEST [DWORD DS:EAX],EAX
0054B420  |.  XCHG EAX,ESP
0054B421  |.  MOV EAX,[DWORD DS:EAX]
0054B423  |.  PUSH EAX
0054B424  |.  RET
0054B425  |> PUSH ECX
0054B426  |.  LEA ECX,[DWORD SS:ESP+8]               
0054B42A  |>  SUB ECX,1000
0054B430  |.  |SUB EAX,1000
0054B435  |.  |TEST [DWORD DS:ECX],EAX                 
0054B437  |.  |CMP EAX,1000
0054B43C  |.^ \JNB SHORT main.0054B42A
0054B43E  |.  SUB ECX,EAX
0054B440  |.  MOV EAX,ESP
0054B442  |.  TEST [DWORD DS:ECX],EAX
0054B444  |.  MOV ESP,ECX
0054B446  |.  MOV ECX,[DWORD DS:EAX]
0054B448  |.  MOV EAX,[DWORD DS:EAX+4]
0054B44B  |.  PUSH EAX
0054B44C  \.  RET

这是一个函数
不知道有什么用
那位大哥办个忙  帮我分析下~~~ 感激不尽~~~~

mov eax,$1004
call 0054B410
.......

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
点赞7
打赏
分享
最新回复 (9)
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tyxjob 2008-4-19 20:56
2
0
对了,顺便说一下, 该程序时用 C++ 编译的。
实在太奇怪了,估计没有人能回答/。
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
rmb 2008-4-20 00:14
3
0
个人认为做这样的分析最好能够结合寄存器和堆栈值的变化来分析~
例如eax初始值是 $1004,那进入0054B410之后会发生什么变化呢?

或许不是最好的办法,但是不妨试一下~
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tyxjob 2008-4-20 06:25
4
0
2楼这位大哥,不知阁下又没有注意最后 2行,
  push eax
   ret
就这2行就够受的
都不知道 函数返回到什么地方去了,
还有就是 这个程序没有办法动态跟踪。所以还拿出来求助~

不过还是感谢 。
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tyxjob 2008-4-20 06:28
5
0
补充一点,我猜想可能是  分配 1004 个byte 空间(局部变量)
比如 byte  bytes[]=new bytes[1004]
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
justlovemm 2008-4-20 12:10
6
0
用IDA看看吧,我估计IDA应该识别出来是probexx之类的吧,是栈上的内存分配

另外,看了一下lz的发帖时间,你不会是从昨天晚上8点一直搞到今天早上吧,呵呵。如果有这股劲,那什么都能高定的。不过我是菜鸟,只是随便说说了,不能作为指导意见。
雪    币: 297
活跃值: (27)
能力值: ( LV13,RANK:380 )
在线值:
发帖
回帖
粉丝
tnttools 9 2008-4-20 16:56
7
0
这样,你满意了吧!

确实是如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指令的意图,...
剩下的代码再通过上面的代码举一反三,就知道意思了。
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tyxjob 2008-4-20 18:43
8
0
  


哈哈~~~ 知道了~~~
不过还是谢谢  n 个恢复的人~~~

我在 chkstk.asm 文件中已经找到答案~~
因为版本不同, chkstk。asm 的 内容也有差异!
不过大同小异~~~
欧也~~~~~
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shaofang 2008-4-20 21:46
9
0
学习了
雪    币: 87
活跃值: (47)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wangdell 6 2008-4-20 22:30
10
0
学习了。
不看几位牛人的解释,我还以为又是扭曲变换。怎么库函数也用这种push eax,ret.
游客
登录 | 注册 方可回帖
返回