電子書製作軟體

看雪資料發表於2015-11-15

標 題:電子書製作軟體

發信人:飛狐

時 間:2002/08/18 07:56pm

詳細資訊: 




(由於時間倉促,難免有不周之處。)
電子書製作軟體介紹:我想熟悉電子書製作的人,應該知道這個軟體。我喜歡它,是我常用的
一個工具。此軟體是用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
當使用者名稱為漢字時與此同。
另:因特殊原因,軟體名稱隱去。如果想知道這個軟體的名稱及下載地址請給我發訊息。

相關文章