文書處理大師 3.0 破解~~~附序號產生器 (17千字)

看雪資料發表於2002-03-24

名稱:文書處理大師(TextFile) 3.0
下載:http://www.esoftware.com.cn/file/utility/reader/2002032101.shtml

簡介:
    主要是對文字和資料庫的各種處理,如:在每一行之前(或某個位址)加上某一字串,強大的替換功能,在多檔案中查詢的功能,處理從網頁中複製貼上來的文字中的特殊字元,挺有用的一些功能

限制:
    未註冊的“文書處理大師”使用上會有一些限制,一是會禁用某一功能,這一被禁用的功能是隨機抽出來的,重新開啟程式後,初禁用的功能可能會變為另一個。所以說未註冊的使用者也是可以完全使用本程式的功能的,只是在使用在有一些不便。

為何釋出序號產生器:
    (Readme中原文)“文字處理大師”其實對未註冊版並沒有太多的限制,但是還是有極少數.分子.釋出它的破解版。我們必須說明的是,這些破解都是不完全的,破解人僅僅是做到將“未註冊”這個提示及操作灰顯去掉而已,我們的資料處理和加密是密不可分的破解人去掉了這些也就去掉了某一些的功能,並且有可能觸發“文字處理大師”的陷井,所以在此提醒各位使用者切勿使用盜版以免資料破壞。


    開始~~~~~~~~程式是用delphi開發的,我不大喜歡delphi的軟體,老覺得它重複執行一些無用的命令,毫無效率,也許是作者故意放的垃圾程式碼.進入後程式顯示[未註冊],點註冊,此程式註冊有點特別,填入資料後無確定鍵可按,直接退出程式後再進入,如正確程式顯示[正式版]

    破解思路:如果你一開始就將它反彙編(未加殼)查詢以上特徵字串的話,你會看到Code 2的程式碼,仔細除錯可以找到比較的地方,不過比較的資料全為0,通常你會去除錯00524255和0052425F兩個地方,因為下面有跳轉,這樣你會什麼都找不到,或者你會爆破,但你看了作者的話後還會這樣做嗎?在很多東西還是未知數的情況下只能用動態的bpm老方法了,除錯過程中一不小心讓我看到了GetPrivateProfileString函式,呵呵,程式在讀INI檔案,不過還是挺難追的,可能是我機器裡裝了太多東西影響了除錯吧.終於讓我確定了它的核心地方,請先看Code 1和Code 2兩個地方,在Code 2的地方往上一點你可以看到"sys1.ini"字串(我沒貼出來),不用說Code 2是程式啟動時執行的,Code 1是程式退出時執行的,因為我們還沒有註冊,當然在Code 2處是看不到比較的啦.好啦往下看~~

==Code 1==================================================================
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004CF749(C)
|
:004CF7B8 E84F6D0500              call 0052650C      <---這裡是核心
:004CF7BD 8B45F8                  mov eax, dword ptr [ebp-08]
:004CF7C0 50                      push eax
:004CF7C1 8D55F0                  lea edx, dword ptr [ebp-10]
:004CF7C4 A138CE5200              mov eax, dword ptr [0052CE38]
:004CF7C9 8B8000030000            mov eax, dword ptr [eax+00000300]
:004CF7CF E8B478F7FF              call 00447088
:004CF7D4 8B55F0                  mov edx, dword ptr [ebp-10]
:004CF7D7 58                      pop eax
:004CF7D8 E88B56F3FF              call 00404E68
:004CF7DD 755A                    jne 004CF839
:004CF7DF 8D55EC                  lea edx, dword ptr [ebp-14]
:004CF7E2 A138CE5200              mov eax, dword ptr [0052CE38]
:004CF7E7 8B8000030000            mov eax, dword ptr [eax+00000300]
:004CF7ED E89678F7FF              call 00447088
:004CF7F2 8B45EC                  mov eax, dword ptr [ebp-14]
:004CF7F5 50                      push eax
:004CF7F6 A1ACBA5200              mov eax, dword ptr [0052BAAC]
:004CF7FB 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"註冊碼"
                                  |
:004CF7FD B978F84C00              mov ecx, 004CF878

* Possible StringData Ref from Code Obj ->"註冊"
                                  |
:004CF802 BA88F84C00              mov edx, 004CF888
:004CF807 8B18                    mov ebx, dword ptr [eax]
:004CF809 FF5304                  call [ebx+04]
:004CF80C 8D55E8                  lea edx, dword ptr [ebp-18]
:004CF80F A138CE5200              mov eax, dword ptr [0052CE38]
:004CF814 8B80F8020000            mov eax, dword ptr [eax+000002F8]
:004CF81A E86978F7FF              call 00447088
:004CF81F 8B45E8                  mov eax, dword ptr [ebp-18]
:004CF822 50                      push eax
:004CF823 A1ACBA5200              mov eax, dword ptr [0052BAAC]
:004CF828 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"使用者名稱"
                                  |
:004CF82A B998F84C00              mov ecx, 004CF898

* Possible StringData Ref from Code Obj ->"註冊"
                                  |
:004CF82F BA88F84C00              mov edx, 004CF888
:004CF834 8B18                    mov ebx, dword ptr [eax]
:004CF836 FF5304                  call [ebx+04]

==Code 2==================================================================
* Possible StringData Ref from Code Obj ->"使用者名稱"
                                  |
:00524218 B954475200              mov ecx, 00524754

* Possible StringData Ref from Code Obj ->"註冊"
                                  |
:0052421D BA64475200              mov edx, 00524764
:00524222 A110825300              mov eax, dword ptr [00538210]
:00524227 8B18                    mov ebx, dword ptr [eax]
:00524229 FF13                    call dword ptr [ebx]
:0052422B 6A00                    push 00000000
:0052422D 8D45F8                  lea eax, dword ptr [ebp-08]
:00524230 50                      push eax

* Possible StringData Ref from Code Obj ->"註冊碼"
                                  |
:00524231 B974475200              mov ecx, 00524774

* Possible StringData Ref from Code Obj ->"註冊"
                                  |
:00524236 BA64475200              mov edx, 00524764
:0052423B A110825300              mov eax, dword ptr [00538210]
:00524240 8B18                    mov ebx, dword ptr [eax]
:00524242 FF13                    call dword ptr [ebx]
:00524244 8D55E4                  lea edx, dword ptr [ebp-1C]
:00524247 8B45FC                  mov eax, dword ptr [ebp-04]
:0052424A E8BD220000              call 0052650C      <---這裡才是核心
:0052424F 8B45E4                  mov eax, dword ptr [ebp-1C]
:00524252 8B55F8                  mov edx, dword ptr [ebp-08]
:00524255 E80E0CEEFF              call 00404E68
:0052425A 7511                    jne 0052426D
:0052425C 8B45FC                  mov eax, dword ptr [ebp-04]
:0052425F E8C00AEEFF              call 00404D24
:00524264 83F802                  cmp eax, 00000002
:00524267 0F8D2E020000            jnl 0052449B

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0052425A(C)
|
:0052426D 8D55E0                  lea edx, dword ptr [ebp-20]
:00524270 8BC6                    mov eax, esi
:00524272 E8112EF2FF              call 00447088
:00524277 8D45E0                  lea eax, dword ptr [ebp-20]

* Possible StringData Ref from Code Obj ->" - [未註冊]"


==Step 1=================================================================
注意在除錯過程中我是先找到核心部分才找到Code 1和Code 2的,我們先進來看看

* Referenced by a CALL at Addresses:
|:004CF7B8  , :0052424A          <------=====:-)
|
:0052650C 55                      push ebp
:0052650D 8BEC                    mov ebp, esp
:0052650F 83C4F8                  add esp, FFFFFFF8
:00526512 53                      push ebx
:00526513 56                      push esi
:00526514 57                      push edi
:00526515 33C9                    xor ecx, ecx
:00526517 894DF8                  mov dword ptr [ebp-08], ecx
:0052651A 8BDA                    mov ebx, edx
:0052651C 8945FC                  mov dword ptr [ebp-04], eax
:0052651F 8B45FC                  mov eax, dword ptr [ebp-04]
:00526522 E8E5E9EDFF              call 00404F0C
:00526527 33C0                    xor eax, eax
:00526529 55                      push ebp
:0052652A 68AA655200              push 005265AA
:0052652F 64FF30                  push dword ptr fs:[eax]
:00526532 648920                  mov dword ptr fs:[eax], esp
:00526535 8BC3                    mov eax, ebx
:00526537 8B55FC                  mov edx, dword ptr [ebp-04]
:0052653A E881E5EDFF              call 00404AC0
:0052653F 8BC3                    mov eax, ebx
:00526541 E826E5EDFF              call 00404A6C
:00526546 8B45FC                  mov eax, dword ptr [ebp-04]
:00526549 E8D6E7EDFF              call 00404D24
:0052654E 8BF0                    mov esi, eax
:00526550 85F6                    test esi, esi
:00526552 7E29                    jle 0052657D
:00526554 BF01000000              mov edi, 00000001

-------------------------------------------------------------------
這一小段就是算出註冊碼的地方,請在此處設斷,我的註冊名 Sam Von

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0052657B(C)
|
:00526559 8B45FC                  mov eax, dword ptr [ebp-04]
:0052655C 8A4438FF                mov al, byte ptr [eax+edi-01]<---取註冊名的第一位
:00526560 346E                    xor al, 6E      <---xor掉,al=3D
:00526562 25FF000000              and eax, 000000FF
:00526567 8D55F8                  lea edx, dword ptr [ebp-08]
:0052656A E89D30EEFF              call 0040960C    <---進去,請先跳到Step 2處
:0052656F 8B55F8                  mov edx, dword ptr [ebp-08]
:00526572 8BC3                    mov eax, ebx
:00526574 E8B3E7EDFF              call 00404D2C    <---儲存註冊碼
:00526579 47                      inc edi
:0052657A 4E                      dec esi          <---迴圈n次,n是註冊名的長度
:0052657B 75DC                    jne 00526559
------------------------------------------------------------------

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00526552(C)
|                                                      這裡下d *ebx就可看到最後得到的字串
:0052657D 53                      push ebx        <---"61153785610"這個是正確的註冊碼嗎?不!
:0052657E 8B03                    mov eax, dword ptr [ebx]
:00526580 B906000000              mov ecx, 00000006
:00526585 BA01000000              mov edx, 00000001
:0052658A E8EDE9EDFF              call 00404F7C    <---裡面就是比較的地方,看上面ecx=6,不管你上面
:0052658F 33C0                    xor eax, eax        的結果是多長,程式最多取6位,自己跟進去看看
:00526591 5A                      pop edx              我的註冊碼是611537
:00526592 59                      pop ecx
:00526593 59                      pop ecx
:00526594 648910                  mov dword ptr fs:[eax], edx
:00526597 68B1655200              push 005265B1

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005265AF(U)
|
:0052659C 8D45F8                  lea eax, dword ptr [ebp-08]
:0052659F BA02000000              mov edx, 00000002
:005265A4 E8E7E4EDFF              call 00404A90
:005265A9 C3                      ret


==Step 2=================================================================
為了節約版面,之前的一大段我認為是垃圾的程式碼略掉,如果你不先在0052656A處設斷而在這裡設斷的話,你會發現程式會經常呼叫這個地方.

0187:0040A156 B90A000000      MOV      ECX,0A
0187:0040A15B 8D759F          LEA      ESI,[EBP-61]
0187:0040A15E 31D2            XOR      EDX,EDX
0187:0040A160 F7F1            DIV      ECX      <---這時eax=3D,相當於註冊名的第一位
0187:0040A162 80C230          ADD      DL,30    <---dl=1,
0187:0040A165 80FA3A          CMP      DL,3A
0187:0040A168 7203            JC      0040A16D
0187:0040A16A 80C207          ADD      DL,07
0187:0040A16D 4E              DEC      ESI
0187:0040A16E 8816            MOV      [ESI],DL  <---儲存,d esi可看到字元"1"
0187:0040A170 09C0            OR      EAX,EAX  <---如果eax不為0的話就往上跳
0187:0040A172 75EA            JNZ      0040A15E  <---註冊名的第一位算出了字串"61"
0187:0040A174 8D4D9F          LEA      ECX,[EBP-61]
0187:0040A177 29F1            SUB      ECX,ESI
0187:0040A179 8B55DC          MOV      EDX,[EBP-24]
0187:0040A17C 83FA10          CMP      EDX,BYTE +10
0187:0040A17F 7601            JNA      0040A182
0187:0040A181 C3              RET
從這裡返回後再經過一段垃圾,我們回到了Step 1處,需要注意的是,在除錯時,程式會經過很多次迴圈,通常第一次迴圈完後就可以找到它儲存註冊碼的地址,但有些程式的註冊碼是一部分一部分產生的,它儲存的地址在第n次迴圈時可能會變,特別是delphi做的軟體,我試過好幾個都是這樣,最好是在它儲存註冊碼的Call處設斷,不要每次都用F10帶過,這樣很容易跟丟的.現在我們回到Step 1

==End====================================================================

其實程式的演算法並不難,只不過不容易找到而已,下面講一點小技巧:
=========================================================================
象delphi這樣的程式有很多過程好象都是沒用的(個人認為),上面的Step 2是經過了好大一段程式碼才找到的,我在第一次除錯時看到記憶體裡的不少資料,如我發貼問過的-663098319(25 64 00 00),總認為它們會參於運算,但最終運算就一點關係都沒有,那在第一次除錯時當我們發現某個Call裡做的事情基本可以確定與演算法無關,我們就把它記在紙上,以後再遇上時就用F10代過,這樣可以省不少功夫,也不會被程式搞暈了頭.如果要確定一個Call有無作用,一般可在進入Call之前看看各暫存器指向的地址是否指向我們的註冊名或註冊碼等,另外象Step 1中我的註冊名第一位"S" xor 6E=3D,這個3D一定要留意,看到它的出現,就離成功很近了.

如下這一段基本無用,只是將註冊碼儲存而已!

:00404D2C 85D2                    test edx, edx
:00404D2E 743F                    je 00404D6F
:00404D30 8B08                    mov ecx, dword ptr [eax]
:00404D32 85C9                    test ecx, ecx
:00404D34 0F8486FDFFFF            je 00404AC0
:00404D3A 53                      push ebx
:00404D3B 56                      push esi
:00404D3C 57                      push edi
:00404D3D 89C3                    mov ebx, eax
:00404D3F 89D6                    mov esi, edx
:00404D41 8B79FC                  mov edi, dword ptr [ecx-04]
:00404D44 8B56FC                  mov edx, dword ptr [esi-04]
:00404D47 01FA                    add edx, edi
:00404D49 39CE                    cmp esi, ecx
:00404D4B 7417                    je 00404D64
:00404D4D E856030000              call 004050A8
:00404D52 89F0                    mov eax, esi
:00404D54 8B4EFC                  mov ecx, dword ptr [esi-04]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00404D6D(U)
|
:00404D57 8B13                    mov edx, dword ptr [ebx]
:00404D59 01FA                    add edx, edi
:00404D5B E8A8DCFFFF              call 00402A08  <---進去看看,請看Call 1
:00404D60 5F                      pop edi
:00404D61 5E                      pop esi
:00404D62 5B                      pop ebx
:00404D63 C3                      ret
==Call 1================================================================
* Referenced by a CALL at Addresses:
|:004027BD  , :00402F37  , :004030F2  , :0040310C  , :00404ADB 
|:00404B78  , :00404D16  , :00404D5B  , :00404DAE  , :00404DBD 
|:00404E40  , :00404F49  , :00404FED  , :00405048  , :00405055 
|:004050F8  , :0040536C  , :0040537A  , :004053BF  , :00405527 
|:0040577F  , :00405868  , :00406216  , :00406385  , :004093FC 
|:00409432  , :0040956C  , :00409C0C  , :0040B499  , :0041931C 
|:004194AA  , :00419920  , :0041AB0C  , :0041AB2A  , :0041B517 
|:0041B7A0  , :0041C04E  , :0041C1E5  , :00422AC1  , :00424206 
|:004267EF  , :004269D5  , :00428BC4  , :00429CAA  , :004355E3 
|:0043F71A  , :004404BA  , :00481F9B  , :00481FB8  , :0048B6B7 
|:0048C6B8  , :00498F72  , :0049CA50  , :0049CB36  , :004A1E59 
|:004A1EA8  , :004A1F54  , :004A48D7  , :004A4955  , :004A505F 
|:004A50AC  , :004A56DE  , :004A56F9  , :004A8107  , :004A87DF 
|:004B71D1  , :004B73AC  , :004B7874  , :004B788A  , :004B7D13 
|:004B9601  , :004BB6D6  , :004BB7B6  , :0050760C  , :0050A913 
|:0050ACCA  , :0050AE4E  , :0050B1D3  , :0050B1F7  , :0050C057 
|:0050C1B1  , :0050C1CB  , :0050C2FE  , :0050C34A  , :0050C90F 
|:0050E871  , :0051375D  <-----=====哇~~~~~~~~~~~~~
|
:00402A08 56                      push esi
:00402A09 57                      push edi
:00402A0A 89C6                    mov esi, eax
:00402A0C 89D7                    mov edi, edx
:00402A0E 89C8                    mov eax, ecx
:00402A10 39F7                    cmp edi, esi
:00402A12 7713                    ja 00402A27
:00402A14 742F                    je 00402A45
:00402A16 C1F902                  sar ecx, 02
:00402A19 782A                    js 00402A45
:00402A1B F3                      repz
:00402A1C A5                      movsd
:00402A1D 89C1                    mov ecx, eax
:00402A1F 83E103                  and ecx, 00000003
:00402A22 F3                      repz    <---看清楚這個Call裡的內容後就可確定它有無用處了.
:00402A23 A4                      movsb

==KeyGen==================================================================
附上序號產生器,將下面程式碼儲存為.rek檔案,用序號產生器編寫器編譯,序號產生器編寫器1.65測試透過.
支援中文名

.data
szHomePage db "http://www.365hz.net",0
szEmail    db "mailto:ljyljx@163.com",0
szErrMess  db "請輸入註冊名!",0
szTemp    db 100 dup(0)
szBuffer  db 100 dup(0)
.code
mov ebx,eax
mov eax,0
mov ecx,50
lea edi,szTemp
rep stosw
invoke lstrlen,ebx
push eax
lea edi,szTemp
mov ebp,esp
mov esi,ebp

Start:
xor eax,eax
mov al,byte ptr [ebx]
xor al,6Eh
PRO0:
xor edx,edx
mov ecx,0Ah
div ecx
add dl,30h
cmp dl,3Ah
jc PRO1
add dl,7

PRO1:
dec esi
mov [esi],byte ptr dl
or eax,eax
jnz PRO0
inc ebx
mov ecx,ebp
sub ecx,esi
rep movsb
mov eax,dword ptr [ebp]
dec eax
mov [ebp],dword ptr eax
jnz Start

lea esi,szTemp
lea edi,szBuffer
mov ecx,6
rep movsb
lea eax,szBuffer


;==Code End====================================================

      _/_/_/
    _/          _/_/_/  _/_/_/  _/_/
    _/_/    _/    _/  _/    _/    _/
        _/  _/    _/  _/    _/    _/
_/_/_/      _/_/_/  _/    _/    _/

                                              Sam.com
                                          4:54 2002-3-24

相關文章