• 标 题：WaterWall 5.01算法浅析
• 作 者：poppig
• 时 间：2004-2-08 周日, 上午10:58
• 链 接：http://bbs.pediy.com

WaterWall(5.01)是一个相当棒的桌面壁纸管理工具,具有多种与众不同的控制功能,

好了,这个软件由于是明码比较所以我就不说了,我们只是来分析一下如何写出自己的

004886E3  |. 6A 03          PUSH 3                        ; /Arg3 = 00000003
004886E5  |. 6A 05          PUSH 5                        ; |Arg2 = 00000005
004886E7  |. 6A 07          PUSH 7                        ; |Arg1 = 00000007
004886E9  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
004886EC  |. B1 01          MOV CL,1                      ; |           计算1
004886EE  |. 8BC3           MOV EAX,EBX                   ; |
004886F0  |. E8 C7FEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
004886F5  |. 8845 F0        MOV BYTE PTR SS:[EBP-10],AL
004886F8  |. 6A 04          PUSH 4                        ; /Arg3 = 00000004
004886FA  |. 6A 0A          PUSH 0A                       ; |Arg2 = 0000000A
004886FC  |. 6A 0C          PUSH 0C                       ; |Arg1 = 0000000C
004886FE  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
00488701  |. B1 02          MOV CL,2                      ; |           计算2
00488703  |. 8BC3           MOV EAX,EBX                   ; |
00488705  |. E8 B2FEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
0048870A  |. 8845 F1        MOV BYTE PTR SS:[EBP-F],AL
0048870D  |. 6A 0B          PUSH 0B                       ; /Arg3 = 0000000B
0048870F  |. 6A 0D          PUSH 0D                       ; |Arg2 = 0000000D
00488711  |. 6A 0F          PUSH 0F                       ; |Arg1 = 0000000F
00488713  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
00488716  |. B1 09          MOV CL,9                      ; |           计算3
00488718  |. 8BC3           MOV EAX,EBX                   ; |
0048871A  |. E8 9DFEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
0048871F  |. 8845 F2        MOV BYTE PTR SS:[EBP-E],AL
00488722  |. 6A 08          PUSH 8                        ; /Arg3 = 00000008
00488724  |. 6A 0E          PUSH 0E                       ; |Arg2 = 0000000E
00488726  |. 6A 10          PUSH 10                       ; |Arg1 = 00000010
00488728  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
0048872B  |. B1 06          MOV CL,6                      ; |            计算4
0048872D  |. 8BC3           MOV EAX,EBX                   ; |
0048872F  |. E8 88FEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
00488734  |. 8845 F3        MOV BYTE PTR SS:[EBP-D],AL

00488737  |. 6A 10          PUSH 10                       ; /Arg3 = 00000010
00488739  |. 6A 02          PUSH 2                        ; |Arg2 = 00000002
0048873B  |. 6A 0F          PUSH 0F                       ; |Arg1 = 0000000F
0048873D  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
00488740  |. B1 01          MOV CL,1                      ; |             计算5
00488742  |. 8BC3           MOV EAX,EBX                   ; |
00488744  |. E8 73FEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC;这个作为例子跟入
00488749  |. 8845 F4        MOV BYTE PTR SS:[EBP-C],AL
0048874C  |. 6A 0E          PUSH 0E                       ; /Arg3 = 0000000E
0048874E  |. 6A 04          PUSH 4                        ; |Arg2 = 00000004
00488750  |. 6A 0D          PUSH 0D                       ; |Arg1 = 0000000D
00488752  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
00488755  |. B1 03          MOV CL,3                      ; |             计算6
00488757  |. 8BC3           MOV EAX,EBX                   ; |
00488759  |. E8 5EFEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
0048875E  |. 8845 F5        MOV BYTE PTR SS:[EBP-B],AL
00488761  |. 6A 0C          PUSH 0C                       ; /Arg3 = 0000000C
00488763  |. 6A 06          PUSH 6                        ; |Arg2 = 00000006
00488765  |. 6A 0B          PUSH 0B                       ; |Arg1 = 0000000B
00488767  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
0048876A  |. B1 05          MOV CL,5                      ; |             计算7
0048876C  |. 8BC3           MOV EAX,EBX                   ; |
0048876E  |. E8 49FEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
00488773  |. 8845 F6        MOV BYTE PTR SS:[EBP-A],AL
00488776  |. 6A 0A          PUSH 0A                       ; /Arg3 = 0000000A
00488778  |. 6A 08          PUSH 8                        ; |Arg2 = 00000008
0048877A  |. 6A 09          PUSH 9                        ; |Arg1 = 00000009
0048877C  |. 8D55 DF        LEA EDX,DWORD PTR SS:[EBP-21] ; |
0048877F  |. B1 07          MOV CL,7                      ; |             计算8
00488781  |. 8BC3           MOV EAX,EBX                   ; |
00488783  |. E8 34FEFFFF    CALL WATERWAL.004885BC        ; WATERWAL.004885BC
00488788  |. 8845 F7        MOV BYTE PTR SS:[EBP-9],AL
0048878B  |. BB 08000000    MOV EBX,8
00488790  |. 8D4D F0        LEA ECX,DWORD PTR SS:[EBP-10]
00488793  |> 33C0           /XOR EAX,EAX
00488795  |. 8A01           |MOV AL,BYTE PTR DS:[ECX]
00488797  |. BF 0A000000    |MOV EDI,0A
0048879C  |. 99             |CDQ
0048879D  |. F7FF           |IDIV EDI
0048879F  |. 83C2 30        |ADD EDX,30
004887A2  |. 8811           |MOV BYTE PTR DS:[ECX],DL
004887A4  |. 41             |INC ECX
004887A5  |. 4B             |DEC EBX
004887A6  |.^75 EB          JNZ SHORT WATERWAL.00488793  ;该循环是通过上面的8个字符来取数

我们在上面488744(计算5后的CaLL)处跟入:
004885BC  /\$ 55             PUSH EBP
004885BD  |. 8BEC           MOV EBP,ESP
004885BF  |. 83C4 F8        ADD ESP,-8
004885C2  |. 884D FB        MOV BYTE PTR SS:[EBP-5],CL ;把cl=1保存
004885C5  |. 8955 FC        MOV DWORD PTR SS:[EBP-4],EDX
004885C8  |. 8D55 FA        LEA EDX,DWORD PTR SS:[EBP-6]
004885CB  |. 8B7D FC        MOV EDI,DWORD PTR SS:[EBP-4]
004885CE  |. 31DB           XOR EBX,EBX
004885D0  |. 8A5D FB        MOV BL,BYTE PTR SS:[EBP-5] ;bl=1
004885D3  |. 8A041F         MOV AL,BYTE PTR DS:[EDI+EBX] ;取一个字符
004885D6  |. 8A5D 10        MOV BL,BYTE PTR SS:[EBP+10] ;取参数Arg3,即10H
004885D9  |. 32041F         XOR AL,BYTE PTR DS:[EDI+EBX] ;取数进行xor
004885DC  |. 8A5D 0C        MOV BL,BYTE PTR SS:[EBP+C] ;取Arg2,即2
004885DF  |. 8A0C1F         MOV CL,BYTE PTR DS:[EDI+EBX] ;取数送给cl
004885E2  |. D2C0           ROL AL,CL ;
004885E4  |. 8A5D 08        MOV BL,BYTE PTR SS:[EBP+8] ;取Arg1,即0FH
004885E7  |. 32041F         XOR AL,BYTE PTR DS:[EDI+EBX]
004885EA  |. 8845 FA        MOV BYTE PTR SS:[EBP-6],AL
004885ED  |. 8A02           MOV AL,BYTE PTR DS:[EDX] ;AL即最后的运算结果,出来后保存进字母表
004885EF  |. 59             POP ECX
004885F0  |. 59             POP ECX
004885F1  |. 5D             POP EBP
004885F2  . C2 0C00        RETN 0C

我想大家应该看懂了吧,它是判断注册名是否大于4个,如果是的话则凑足8个,

HKEY_LOCAL_MACHINESoftwarePegtopWaterWallRegName写入信息.
由于篇幅的关系,下面给出注册机的关键部分:

Generate  proc  hWnd
local  TempName[120]:byte
local  MiMa[50]:byte
lea  edi,KeyName
mov  nLen,9
cmp  eax,4
jl  @1
cmp  eax,7
jg  @2 ;大于8个就跳
sub  nLen,eax
jmp  @3
@3:  invoke  strupr ;把小写字母转换成大写字母,MASM32里面没有所以要自己写
mov  ecx,0
lea  esi,MiMa
invoke  GetOneChar,7H,5H,3H,1H ;调用CALL WATERWAL.004885BC,算出数字
mov  [esi+ecx],al ;al为出口参数,保存到MiMa里面
inc  ecx
invoke  GetOneChar,0CH,0AH,4H,2H
mov  [esi+ecx],al
inc  ecx
invoke  GetOneChar,0FH,0DH,0BH,9H
mov  [esi+ecx],al
inc  ecx
invoke  GetOneChar,10H,0EH,8H,6H
mov  [esi+ecx],al
inc  ecx
invoke  GetOneChar,0FH,2H,10H,1H
mov  [esi+ecx],al
inc  ecx
invoke  GetOneChar,0DH,4H,0EH,3H
mov  [esi+ecx],al
inc  ecx
invoke  GetOneChar,0BH,6H,0CH,5H
mov  [esi+ecx],al
inc  ecx
invoke  GetOneChar,9H,8H,0AH,7H
mov  [esi+ecx],al
lea  esi,GoogBoy  ;用于存放真正的注册码
mov  ebx,8        ;注册码规定了是8位
lea  ecx,MiMa
@4:  xor  eax,eax
mov  al,[ecx]
mov  edi,0AH
cdq
idiv  edi
mov  [esi],dl
inc  ecx
inc  esi
dec  ebx
jnz  @4
jmp  @5
@5:
ret
Generate  endp

;依次传递参数Arg1,Arg2,Arg3,而Arg4则是传入的CL的值,可以看上面的反汇编代码

GetOneChar  proc  Arg1,Arg2,Arg3,Arg4
push  ebx
push  ecx
push  edi
xor  eax,eax
xor  ebx,ebx
xor  ecx,ecx
mov  bl,byte ptr Arg4
mov  edi,offset KKeyName
mov  al,[edi+ebx-1]
mov  bl,byte ptr Arg3
xor  al,[edi+ebx-1]
mov  bl,byte ptr Arg2
mov  cl,[edi+ebx-1]
rol  al,cl
mov  bl,byte ptr Arg1
xor  al,[edi+ebx-1] ;al作为出口参数
pop  edi
pop  ecx
pop  ebx
ret
GetOneChar  endp

Name:dengkeng[DFCG]
Key :95097319