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作者讲授!