序列号放在c:\windows\system\serial.sys中,
注册码放在c:\windows\system\secret.sys中。
这两个文件都是加密过的,算法很简单,用unfoxall(我只有demo版,而且这个demo版的40个文件限制无法去除,因强行修改40个文件限制会死机)对serial.exe进行反编译可以得到其加密和解密的算法。如下:
加密算法:
PROCEDURE secret
PARAMETER CSTRING
ESTRING = ''
NLONG = LEN(CSTRING)
FOR I = 1 TO NLONG
ESTRING = ESTRING + CHR(ASC(SUBSTR(CSTRING,I,1)) + I + NLONG)
ENDFOR
RETURN ESTRING
ENDPROC
解密算法:
PROCEDURE desecret
PARAMETER CSTRING
ESTRING = ''
NLONG = LEN(CSTRING)
FOR I = 1 TO NLONG
ESTRING = ESTRING + CHR(ASC(SUBSTR(CSTRING,I,1)) - I - NLONG)
ENDFOR
RETURN ESTRING
ENDPROC
用SoftICE跟踪它读取注册码后判断的过程,知道上述解密算法对应的汇编程序段如下:
0167:0C0746D7 MOV ESI,ECX
0167:0C0746D9 MOV EAX,[ESI] //取一个字节
0167:0C0746DB SUB EAX,[EDX] //相减
0167:0C0746DD JO 0C12995B
0167:0C0746E3 MOV [ESI],EAX
0167:0C0746E5 SUB EAX,EAX
解开一个字符后,回到下面的地方,把解开的字符保存起来:
0167:0C018C1F CALL 0C00CDEB //解开一个字符
0167:0C018C24 MOV ESI,EAX
//EAX中存放该字符
0167:0C018C26 MOV ECX,ESI
0167:0C018C28 CALL 0C018C75
0167:0C018C2D CMP ESI,000000FF
0167:0C018C33 MOV EDI,EAX
0167:0C018C35 JA 0C0D95E5
0167:0C018C3B MOV EDX,EDI
0167:0C018C3D LEA ECX,[ESP+0E]
之后它要把你输入的8位的注册码的前4位和后四位调换一下,比如我输入的为“12345678”,调换后变成“56781234”,
然后转换成一个数,对此数进行简单的浮点运算。
0167:0C09F332 LEA EAX,[EDI*4+EDI]
0167:0C09F335 LEA EDI,[EAX*2+ECX-30] //每次转换一个字符
0167:0C09F339 MOV AL,[ESP+11]
0167:0C09F33D INC ESI
0167:0C09F33E TEST AL,AL
0167:0C09F340 JNZ 0C09F383
0167:0C09F342 XOR ECX,ECX
0167:0C09F344 MOV CL,[ESI]
0167:0C09F346 LEA EAX,[ECX-30]
0167:0C09F349 CMP EAX,35
0167:0C09F34C JA 0C09F367
0167:0C09F34E XOR EDX,EDX
0167:0C09F350 MOV DL,[EAX+0C09F424]
0167:0C09F356 JMP [EDX*4+0C09F410]
0167:0C09F35D MOV EAX,[ESP+18]
0167:0C09F361 TEST EAX,EAX
0167:0C09F363 JZ 0C09F339
0167:0C09F365 JMP 0C09F311
0167:0C09F367 MOV CL,[ESP+2C]
0167:0C09F36B MOV AL,[ESI]
0167:0C09F36D CMP AL,CL
0167:0C09F36F JZ 0C09F378
0167:0C09F371 MOV BYTE PTR [ESP+11],01
0167:0C09F376 JMP 0C09F339
0167:0C09F378 MOV [ESP+11],BL
0167:0C09F37C MOV EBX,00000001
0167:0C09F381 JMP 0C09F339
0167:0C09F383 MOV EAX,[ESP+24]
0167:0C09F387 MOV DL,[ESP+13]
0167:0C09F38B MOV [ESP+14],EDI //保存转换结果
0167:0C09F38F MOV [EAX],DL
0167:0C09F391 MOV AL,[ESP+12]
0167:0C09F395 TEST AL,AL
0167:0C09F397 JNZ 0C0EC5A9
0167:0C09F39D MOV EAX,[ESP+18]
0167:0C09F3A1 CMP EAX,09
0167:0C09F3A4 JG 0C0EC5BE
0167:0C09F3AA FILD DWORD PTR [ESP+14] //转换结果变成浮点数
离找到注册码还差一步,用SoftICE跟实在太累!