首页
社区
课程
招聘
[旧帖] 扫雷中有些代码不懂,求解 0.00雪花
发表于: 2010-5-13 11:20 3226

[旧帖] 扫雷中有些代码不懂,求解 0.00雪花

2010-5-13 11:20
3226
010036CD  |.  E8 6E020000        call    winmine.01003940                            ;  call rand
010036D2  |.  FF35 38530001      push    dword ptr ds:[1005338]                      ;  高
010036D8  |.  8BF0               mov     esi, eax                                    ;  esi=随即宽
010036DA  |.  46                 inc     esi                                         ;  esi+=1
010036DB  |.  E8 60020000        call    winmine.01003940                            ;  call rand
010036E0  |.  40                 inc     eax                                         ;  随机高+=1
010036E1  |.  8BC8               mov     ecx, eax
010036E3  |.  C1E1 05            shl     ecx, 5                                      ;  ecx=(随机高+1)*32
010036E6  |.  F68431 40530001 80 test    byte ptr ds:[ecx+esi+1005340], 80           ;  [10050340+(随机高+1)*32+随机宽+1]

布雷函数
查msdn发现rand函数没参数啊,

rand
Generates a pseudorandom number.

int rand( void );

为什么前面push宽和高进去呢,是想取0到宽,0-高之间的随机数么?

还有为什么rand完了之后要inc一下?

还有初始化内存区域的时候:
01002ED5  /$  B8 60030000        mov     eax, 360
01002EDA  |>  48                 /dec     eax                                        ;  循环1005340到1005340+360 赋值为0f
01002EDB  |.  C680 40530001 0F   |mov     byte ptr ds:[eax+1005340], 0F
01002EE2  |.^ 75 F6              \jnz     short winmine.01002EDA
01002EE4  |.  8B0D 34530001      mov     ecx, dword ptr ds:[1005334]                 ;  ecx=20=宽
01002EEA  |.  8B15 38530001      mov     edx, dword ptr ds:[1005338]                 ;  edx=高=11
01002EF0  |.  8D41 02            lea     eax, dword ptr ds:[ecx+2]                   ;  eax=22
01002EF3  |.  85C0               test    eax, eax                                    ;  判断eax等不等于0
01002EF5  |.  56                 push    esi
01002EF6  |.  74 19              je      short winmine.01002F11                      ;  等于0就跳
01002EF8  |.  8BF2               mov     esi, edx                                    ;  esi=宽=11
01002EFA  |.  C1E6 05            shl     esi, 5                                      ;  宽左移5位,相当于x32,esi=esi*32
01002EFD  |.  8DB6 60530001      lea     esi, dword ptr ds:[esi+1005360]             ;  esi=1005360+esi*32
01002F03  |>  48                 /dec     eax                                        ;  eax=eax+2=宽+2
01002F04  |.  C680 40530001 10   |mov     byte ptr ds:[eax+1005340], 10              ;  从1005340开始赋值为10,.到1005340+宽
01002F0B  |.  C60406 10          |mov     byte ptr ds:[esi+eax], 10                  ;  [1005360+宽*32+高]
01002F0F  |.^ 75 F2              \jnz     short winmine.01002F03
01002F11  |>  8D72 02            lea     esi, dword ptr ds:[edx+2]                   ;  esi=高+2
01002F14  |.  85F6               test    esi, esi
01002F16  |.  74 21              je      short winmine.01002F39                      ;  等于0则跳
01002F18  |.  8BC6               mov     eax, esi                                    ;  eax=高+2
01002F1A  |.  C1E0 05            shl     eax, 5                                      ;  左移5位,eax=(高+2)*32
01002F1D  |.  8D90 40530001      lea     edx, dword ptr ds:[eax+1005340]             ;  edx=1005340+(高+2)*32
01002F23  |.  8D8408 41530001    lea     eax, dword ptr ds:[eax+ecx+1005341]         ;  eax=1005341+(高+2)*32+宽
01002F2A  |>  83EA 20            /sub     edx, 20                                    ;  循环高
01002F2D  |.  83E8 20            |sub     eax, 20
01002F30  |.  4E                 |dec     esi
01002F31  |.  C602 10            |mov     byte ptr ds:[edx], 10
01002F34  |.  C600 10            |mov     byte ptr ds:[eax], 10
01002F37  |.^ 75 F1              \jnz     short winmine.01002F2A                     ;  循环赋值为10
01002F39  |>  5E                 pop     esi
01002F3A  \.  C3                 retn

为什么老是要lea     eax, dword ptr ds:[ecx+2] ,
                        lea     esi, dword ptr ds:[edx+2]
好像把高和宽都加了2,这个是干什么的呢?还有这段代码一直在循环赋值内存为10,不知道干什么的

求解,本人灰常菜,求高人指点1 2

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 174
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
rand就是一个产生伪随机数的函数,没有需要解释的;其他的问题不懂,友情帮顶~
2010-5-13 13:27
0
雪    币: 40
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yya
3
跟进去
01003940  /$  FF15 B0110001 call    dword ptr [<&msvcrt.rand>]       ; [<--rand,没有参数
01003946  |.  99            cdq
01003947  |.  F77C24 04     idiv    dword ptr [esp+4]                ;  <---随机结果除[esp+4]即参数1
0100394B  |.  8BC2          mov     eax, edx                         ;  <---取余
0100394D  \.  C2 0400       retn    4

所以那个参数不是给rand的,winmine.01003940是一个子程序
int winmine_01003940(int a)
{
    return rand()%a;
}


01002F11  |>  8D72 02            lea     esi, dword ptr ds:[edx+2]                   ;  esi=高+2
不是     esi=高+2    ......
不知道不是你的表达错误....如果不知道lea去查查汇编手册
2010-5-14 12:21
0
雪    币: 221
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
rand的搞懂了,多谢楼上的,lea还是没懂

网上拷来的:   
比如你要算EAX*4+EBX+3,结果放入EDX,怎么办?   
   mov    edx,    eax   
   shl    edx,    2   
   add    edx,    ebx   
   add    edx,    3   
   现在用lea一条指令搞定:   
   lea    edx,    [ebx+eax*4+3]

这里的edx不就等于ebx+eax*4+3么?
lea本来不就是传输地址的么?

在论坛里找到笨笨熊老大07年解答别人的帖子:http://bbs.pediy.com/showthread.php?t=39047

eax=1
eax+eax*4=5
很好理解啊。。。
为什么理解不了呢?
[]里面的就是地址啊
lea eax [eax+eax*4]将地址的计算结果保存在EAX中,前面已经计算得出是5了,所以该指令的运行结果,EAX就是5啊

有哪里不明白的?

这个指令一般用于加法或者乘法的优化,以获得更高的运行效率

所以就单一指令而言,也可以把它理解为计算eax+eax*4这条表达式的值

所以上面的lea     esi, dword ptr ds:[edx+2]的结果就是
esi=edx+2.不知道这里为什么要加2.
2010-5-14 22:16
0
雪    币: 65
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
指针向后加2个字节
2010-5-15 18:35
0
游客
登录 | 注册 方可回帖
返回
//