(由于时间仓促,难免有不周之处。)
电子书制作软件介绍:我想熟悉电子书制作的人,应该知道这个软件。我喜欢它,是我常用的
一个工具。此软件是用aspack加的壳,很容易去的。未注册版本不能编辑和编译大于15个节点的项目。此次pj只是为了学习它的算法。为了作者的权益,我想各位如果喜欢这个软件
的话,请购买正版软件,以支持作者继续开发下去。同时也请作者海涵。
使用工具:trw2000。win32dasm(我用它只是为了取它的代码)
你可以设中断BPX
HMEMCPY 剩下怎么追法就不用我说了吧。
:004F2440 8BD8
mov ebx, eax
:004F2442 8B55FC
mov edx, dword ptr [ebp-04]
:004F2445
8BC3 mov
eax, ebx
:004F2447 E89464FFFF call
004E88E0
:004F244C C6434400
mov [ebx+44], 00
*
Possible StringData Ref from Code Obj ->"F0E1"此字符串的作用是与你的用户名所计算
的数值相异或。
|
:004F2450 BA70254F00
mov edx, 004F2570此处地址存的就是F0E1
:004F2455 8BC3
mov eax, ebx
:004F2457
E82864FFFF call 004E8884
:004F245C
8BC3 mov
eax, ebx
:004F245E E81967FFFF call
004E8B7C按F8进入吧。
:004F2463 837B3400
cmp dword ptr [ebx+34], 00000000
:004F2467 0F84CB000000
je 004F2538
:004F246D 8B4334
mov eax, dword ptr [ebx+34]真码
:004F2470
8B55F8 mov edx,
dword ptr [ebp-08]假码
:004F2473 E83429F1FF
call 00404DAC比较二者是否相等。
如果你单纯想找到注册码,那么至此就可以了,如果你想学习它的算法,就请继续
往下看。
*******************************************************************
注册算法:
首先是计算注册码的前两位。
:004E89AA
BF64000000 mov edi, 00000064它实际就是注册码的前两位
:004E89AF
8D45F0 lea eax,
dword ptr [ebp-10]
:004E89B2 50
push eax
:004E89B3 897DDC
mov dword ptr [ebp-24], edi
:004E89B6 C645E000
mov [ebp-20], 00
:004E89BA
8D55DC lea edx,
dword ptr [ebp-24]
:004E89BD 33C9
xor ecx, ecx
*
Possible StringData Ref from Code Obj ->"%1.2x"
|
:004E89BF B8688B4E00
mov eax, 004E8B68
:004E89C4 E8CB17F2FF
call 0040A194按F8进入吧。
欲知它的作用请看下文
:00409F52 80F944
cmp cl, 44
:00409F55
7415 je 00409F6C
:00409F57
80F955 cmp cl, 55
:00409F5A
7422 je 00409F7E
:00409F5C
80F958 cmp cl, 58
:00409F5F
0F8530FFFFFF jne 00409E95
:00409F65
B910000000 mov ecx, 00000010除数
:00409F6A
EB17 jmp
00409F83
:00409F86 31D2
xor edx,
edx为零
:00409F88 F7F1
div ecx EAX为64
:00409F8A 80C230
add dl, 30余数DL与30相加
:00409F8D 80FA3A
cmp dl, 3A
:00409F90 7203
jb 00409F95
:00409F92
80C207 add dl, 07
*
Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00409F90(C)
|
:00409F95
4E dec
esi串首地址减1
:00409F96 8816
mov byte ptr [esi], dl把结果存入ESI中
:00409F98 09C0
or eax, eax为刚才计算时的商。
:00409F9A
75EA jne
00409F86不相等就继续计算,
总结:此部分代码首先是计算注册码的第二位,然后再计算第一位,结果是64
:00409F9C 8D4D9F
lea ecx, dword ptr [ebp-61]
:00409F9F
29F1 sub
ecx, esi
:00409FA1 8B55DC
mov edx, dword ptr [ebp-24]
:00409FA4 83FA10
cmp edx, 00000010
:00409FA7 7601
jbe 00409FAA
:00409FA9
C3 ret
***************************
第二步是根据你的用户名以及字符串F0E1计算剩下的几位注册码。注意所计算的ASCII值就是注册码,
用户名的位数乘以2就是注册码的位数。
0167:004E89DC
MOV DWORD [EBP-14],01
0167:004E89E3 MOV
EAX,[EBP-04]你所输入的用户名
0167:004E89E6 MOV EDX,[EBP-14]用户名的序号。
0167:004E89E9
MOVZX EAX,BYTE [EAX+EDX-01]取用户名中的一个字节
0167:004E89EE ADD
EAX,EDI EDI是上一次计算出的密码。
0167:004E89F0 MOV
ECX,FF除数
0167:004E89F5 CDQ
0167:004E89F6 IDIV
ECX
0167:004E89F8 MOV EBX,EDX余数存入EBX中
0167:004E89FA
CMP ESI,[EBP-0C] ESI是字符串F0E1的序号,
[EBP-0C]是F0E1这个字符串的个数(也就是4)
0167:004E89FD
JNL 004E8A02大于就跳
0167:004E89FF INC
ESI序号加1
0167:004E8A00 JMP SHORT 004E8A07
0167:004E8A02
MOV ESI,01重新赋值为1
0167:004E8A07 MOV
EAX,[EBP-08]<==为字符串F0E1
0167:004E8A0A MOVZX EAX,BYTE
[EAX+ESI-01]从字符串F0E1中取一个字符。
0167:004E8A0F XOR EBX,EAX二者相互异或。运行后EBX的值就是注册码。
0167:004E8A11
LEA EAX,[EBP-28]
0167:004E8A14 PUSH
EAX
0167:004E8A15 MOV [EBP-24],EBX把注册码存入[EBP-24]中。
0167:004E8A18
MOV BYTE [EBP-20],00
0167:004E8A1C LEA
EDX,[EBP-24]
0167:004E8A1F XOR ECX,ECX
0167:004E8A21
MOV EAX,004E8B68
0167:004E8A26 CALL
0040A194
0167:004E8A2B MOV EDX,[EBP-28]
0167:004E8A2E
LEA EAX,[EBP-10]
0167:004E8A31 CALL
00404C70
0167:004E8A36 MOV EDI,EBX
0167:004E8A38
INC DWORD [EBP-14]
0167:004E8A3B DEC
DWORD [EBP-1C]
0167:004E8A3E JNZ 004E89E3
举例说明:用户名:abcde(它们的ASCII值分别是61、62、63、64、65)
一、首先按照第一步的方法计算它的前两位注册码即64。
二、根据你的用户名以及字符串F0E1计算后几位注册码。
有几位用户名就得计算几次。
1、计算3、4位的密码。
取用户名的首字a(61),与前一步的注册码(64)相加,结果为c5;然后c5除以FF,
余数为c5,最后取F0E1中的F(ASCII值为46)相异或,结果为83,这就是第三、四
位的注册码。
2、计算5、6位的密码。
取用户名的第二个字符b(62),与前一步的注册码(83)相加,结果为e5;然后e5除以FF,
余数为e5,最后取F0E1中的0(ASCII值为30)相异或,结果为D5,这就是第五、六
位的注册码。
3、计算7、8位的密码。
取用户名的第三个字符c(63),与前一步的注册码(D5)相加,结果为138;然后138除以FF,
余数为39,最后取F0E1中的E(ASCII值为45)相异或,结果为7C,这就是第七、八
位的注册码。
4、计算9、10位的密码。
取用户名的第四个字符d(64),与前一步的注册码(7C)相加,结果为E0;然后E0除以FF,
余数为E0,最后取F0E1中的1(ASCII值为31)相异或,结果为D1,这就是第九、十
位的注册码。
5、计算11、12位的密码。
取用户名的第五个字符e(65),与前一步的注册码(D1)相加,结果为136;然后136除以FF,
余数为37,因为字符串F0E1已经循环完毕,所以重新设指针,取F0E1中的F(ASCII值为46)相异或,结果为71,这就是第11、12
位的注册码。
也就是:用户名:abcde
注册码:6483D57CD171
当用户名为汉字时与此同。
另:因特殊原因,软件名称隐去。如果想知道这个软件的名称及下载地址请给我发消息。