首页
社区
课程
招聘
[小发现]freecell随机数使用的小bug
发表于: 2008-6-4 15:31 6974

[小发现]freecell随机数使用的小bug

Fpc 活跃值
4
2008-6-4 15:31
6974

最近在玩系统自带的freecell,XP下它带了1m的开局,但发现为什么总是随机开局都超不过几万,初步怀疑是不是种子有什么问题。
用od加载,定位rand函数,呵呵,原来是程序与dll之间的衔接有点小问题:

01003153  /$  56            push    esi
01003154  |.  6A 00         push    0                                ; /timer = NULL
01003156  |.  FF15 E4110001 call    dword ptr [<&msvcrt.time>]       ; \time
0100315C  |.  50            push    eax                              ; /seed
0100315D  |.  FF15 E8110001 call    dword ptr [<&msvcrt.srand>]      ; \srand,这句是初始化随机种子
01003163  |.  8B35 EC110001 mov     esi, dword ptr [<&msvcrt.rand>]  ;  msvcrt.rand
01003169  |.  59            pop     ecx
0100316A  |.  59            pop     ecx
0100316B  |.  FFD6          call    esi                              ; [rand,连续三次计算随机数,看起来没什么问题
0100316D  |.  FFD6          call    esi
0100316F  |>  FFD6          call    esi
01003171  |.  83F8 01       cmp     eax, 1                      ;是否为0或者是负数
01003174  |.^ 72 F9         jb      short 0100316F         ;不符合要求则继续rand
01003176  |.  3D 40420F00   cmp     eax, 0F4240            ;比较是否大于1M
0100317B  |.^ 77 F2         ja      short 0100316F
0100317D  |.  5E            pop     esi
0100317E  \.  C3            retn


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 7357
活跃值: (3878)
能力值: (RANK:1130 )
在线值:
发帖
回帖
粉丝
2
把rand改成GetTickCount
然后除以1M
2008-6-4 15:41
0
雪    币: 598
活跃值: (282)
能力值: ( LV13,RANK:330 )
在线值:
发帖
回帖
粉丝
3
感谢海风,对原程序做了下修改,随机性能可能还有改进余地,不过已经影响不大了。
我用了rdtsc

01003163  |.  8B35 EC110001 mov     esi, dword ptr [<&msvcrt.rand>]  ;  msvcrt.rand
01003169  |.  59            pop     ecx
0100316A  |.  59            pop     ecx
0100316B  |.  FFD6          call    esi                              ; [rand
0100316D  |.  33C8          xor     ecx, eax                    ; 借用上一步rand的结果
0100316F  |.  0F31          rdtsc                                    ; 伪随机eax, edx没用到,空间不够了
01003171  |.  33C1          xor     eax, ecx
01003173  |.  B9 40420F00   mov     ecx, 0F4240
01003178  |.  F7F9          idiv    ecx                             ; 用1m除一下
0100317A  |.  8BC2          mov     eax, edx                  ; 取余数
0100317C  |.  90            nop
0100317D  |.  5E            pop     esi
0100317E  \.  C3            retn




附上修改后的freecell:
上传的附件:
2008-6-6 13:31
0
游客
登录 | 注册 方可回帖
返回