首页
社区
课程
招聘
一小段代码没看懂什么意思,大大诣点下
发表于: 2010-4-5 12:50 3960

一小段代码没看懂什么意思,大大诣点下

2010-4-5 12:50
3960
00550E50  /$  51            push    ecx                                      
00550E51  |.  3D 00100000   cmp     eax, 1000                             ;eax = 23F4
00550E56  |.  8D4C24 08     lea     ecx, dword ptr [esp+8]
00550E5A  |.  72 14         jb      short 00550E70
00550E5C  |>  81E9 00100000 /sub     ecx, 1000
00550E62  |.  2D 00100000   |sub     eax, 1000
00550E67  |.  8501          |test    dword ptr [ecx], eax
00550E69  |.  3D 00100000   |cmp     eax, 1000
00550E6E  |.^ 73 EC         \jnb     short 00550E5C
00550E70  |>  2BC8          sub     ecx, eax
00550E72  |.  8BC4          mov     eax, esp
00550E74  |.  8501          test    dword ptr [ecx], eax
00550E76  |.  8BE1          mov     esp, ecx
00550E78  |.  8B08          mov     ecx, dword ptr [eax]
00550E7A  |.  8B40 04       mov     eax, dword ptr [eax+4]
00550E7D  |.  50            push    eax                            ;  LiveBadu.005161FF
00550E7E  \.  C3            retn

这就是一个函数过程, 其中我们看到00550E56行处ecx = esp + 8, 但后面将他减1000,我没懂, 这样作完ecx里的值还能代表什么意义.
谁能帮忙解释下这段代码作了什么?

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

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
将ECX 压栈(这个函数使用到ECX)。
比较EAX 是否大于1000
esp+8的 地址 给ecx(这里用到了ECX,ECX指向ESP+8地址)
如果EAX小于1000,则跳转
将EAX减去1000
将ECX减去1000
test 这个逐条指令无法解释,不知道ESP+8初始值是多少。

直到

00550E5C  |>  81E9 00100000 /sub     ecx, 1000
00550E62  |.  2D 00100000   |sub     eax, 1000
00550E67  |.  8501          |test    dword ptr [ecx], eax
00550E69  |.  3D 00100000   |cmp     eax, 1000
00550E6E  |.^ 73 EC         \jnb     short 00550E5C

此命令为循环。循环测试 EAX 是否大于1000. 直到小于1000才执行
00550E70  |>  2BC8          sub     ecx, eax
开始的代码。并置了一个标志。(test语句)

ECX=ECX-EAX
EAX=ESP
比较ECX跟 EAX
。。。

返回 EAX。

函数主要将 EAX跟ECX进行减1000运算。然后得出一个标志。
EAX 经过一系列运算后,将结果返回主函数。

你跟踪一下 ESP ECX EAX 各个值即可。其中 EAX 是主函数传递过来的参数。需要重点关注。
2010-4-5 13:50
0
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
3
__alloca_probe
2010-4-5 14:11
0
雪    币: 1981
活跃值: (771)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
4
这是VC检查堆栈溢出的函数 _chkstk

00550E50  /$  51            push    ecx                                      
00550E51  |.  3D 00100000   cmp     eax, 1000               ;比较要分配的空间是否大于4K
00550E56  |.  8D4C24 08     lea     ecx, dword ptr [esp+8]  ;ecx指向分配的堆栈地址
00550E5A  |.  72 14         jb      short 00550E70     ;还要分配的大小小于4K
00550E5C  |>  81E9 00100000 /sub     ecx, 1000   ;分配4k
00550E62  |.  2D 00100000   |sub     eax, 1000   ;还要分配多少
00550E67  |.  8501          |test    dword ptr [ecx], eax ;测试ecx指向的内存地址是否有效,如果该地址不可读,则会产生异常
00550E69  |.  3D 00100000   |cmp     eax, 1000  
00550E6E  |.^ 73 EC         \jnb     short 00550E5C
00550E70  |>  2BC8          sub     ecx, eax  ;分配小于4K的空间
00550E72  |.  8BC4          mov     eax, esp  
00550E74  |.  8501          test    dword ptr [ecx], eax
00550E76  |.  8BE1          mov     esp, ecx ; esp=分配后的地址
00550E78  |.  8B08          mov     ecx, dword ptr [eax]  ;
00550E7A  |.  8B40 04       mov     eax, dword ptr [eax+4] ;覆盖返回地址
00550E7D  |.  50            push    eax                            ;  LiveBadu.005161FF
00550E7E  \.  C3            retn
2010-4-5 14:11
0
雪    币: 41
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
非常受益    刚从图书馆从来   看了汇编的书   知道了些  谢谢
2010-4-5 15:17
0
雪    币: 18
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
005161E0   .  6A FF         push    -1
005161E2   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
005161E8   .  68 3EDB5600   push    0056DB3E
005161ED   .  50            push    eax
005161EE   .  B8 F4230000   mov     eax, 23F4
005161F3   .  64:8925 00000>mov     dword ptr fs:[0], esp
005161FA   .  E8 51AC0300   call    00550E50                       ;  _chkstk
005161FF   .  A1 B4135E00   mov     eax, dword ptr [5E13B4]
00516204   .  53            push    ebx
00516205   .  55            push    ebp
00516206   .  56            push    esi
00516207   .  85C0          test    eax, eax
00516209   .  57            push    edi
0051620A   .  8BE9          mov     ebp, ecx                       ;  EBP

谢谢各位解答, 上面这段代码执行后 ecx指向的地址是不是就是刚刚分配好23F4大小栈空间的首地址啊?我比较关心最后的ebp
2010-4-5 16:44
0
雪    币: 25
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
貌似是用来检查堆栈溢出的吧
2010-4-6 09:25
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习一下  菜鸟看这个有点难度
2010-4-8 05:02
0
雪    币: 1000
活跃值: (382)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gbl
9
嘿嘿
2010-4-8 09:13
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
学习一下  菜鸟看这个有点难度
2010-4-8 20:13
0
游客
登录 | 注册 方可回帖
返回
//