如有侵權,請告知。
【應用平台】Win2000
【作者郵箱】chubing6143@sina.com
【使用工具】 peid, OllyDbg1.10
【軟件限制】狗
【破解工具】OllyDbg v1.10
採用USB狗加密這種方式的軟件很多,例如PAWS等,還有些軟件是狗與Flexlm加密綜合使用的,我打狗棒法未曾學精,但也打過一兩個簡單狗,見罈子上大家學習打狗棒法熱情也很高,就將自己的淺薄經驗拿出來與大家分享.高手飄過!
一、超級簡單的打狗
這樣的軟件基本上是通過一個函數對狗的有無進行驗證,然後一個關鍵跳轉,錯誤彈出對話框,正確繼續執行,下面是某程序的例子:
0042ADF0 > \6A FF PUSH -1
0042ADF2 . 68 2F465200 PUSH Eb.0052462F ; SE handler installation
0042ADF7 . 64:A1 0000000>MOV EAX,DWORD PTR FS:[0]
0042ADFD . 50 PUSH EAX
0042ADFE . 64:8925 00000>MOV DWORD PTR FS:[0],ESP
0042AE05 . 81EC C8000000 SUB ESP,0C8
0042AE0B . 55 PUSH EBP
0042AE0C . 56 PUSH ESI
0042AE0D . 8BE9 MOV EBP,ECX
0042AE0F . 6A 00 PUSH 0
0042AE11 . 896C24 10 MOV DWORD PTR SS:[ESP+10],EBP
0042AE15 . E8 C2510A00 CALL <JMP.&MFC42.#561>
0042AE1A . 8DB5 C4000000 LEA ESI,DWORD PTR SS:[EBP+C4]
0042AE20 . C78424 D80000>MOV DWORD PTR SS:[ESP+D8],0
0042AE2B . 8BCE MOV ECX,ESI
0042AE2D . FF15 48255300 CALL DWORD PTR DS:[<&customui.??0CBCGWorkspace@@>; customui.??0CBCGWorkspace@@QAE@XZ
0042AE33 . 8D8D DC000000 LEA ECX,DWORD PTR SS:[EBP+DC]
0042AE39 . C68424 D80000>MOV BYTE PTR SS:[ESP+D8],1
0042AE41 . FF15 24255300 CALL DWORD PTR DS:[<&customui.??0CBCGKeyboardMan>; customui.??0CBCGKeyboardManager@@QAE@XZ
0042AE47 . 8D8D E0000000 LEA ECX,DWORD PTR SS:[EBP+E0]
0042AE4D . C68424 D80000>MOV BYTE PTR SS:[ESP+D8],2
0042AE55 . FF15 A8265300 CALL DWORD PTR DS:[<&customui.??0CBCGMouseManage>; customui.??0CBCGMouseManager@@QAE@XZ
0042AE5B . 8D8D 38010000 LEA ECX,DWORD PTR SS:[EBP+138]
0042AE61 . C68424 D80000>MOV BYTE PTR SS:[ESP+D8],3
0042AE69 . FF15 B0255300 CALL DWORD PTR DS:[<&customui.??0CBCGContextMenu>; customui.??0CBCGContextMenuManager@@QAE@XZ
0042AE6F . 8D8D 74010000 LEA ECX,DWORD PTR SS:[EBP+174]
0042AE75 . C68424 D80000>MOV BYTE PTR SS:[ESP+D8],4
0042AE7D . E8 54510A00 CALL <JMP.&MFC42.#459>
0042AE82 . 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10]
0042AE86 . C68424 D80000>MOV BYTE PTR SS:[ESP+D8],5
0042AE8E . 50 PUSH EAX
0042AE8F . C745 00 48705>MOV DWORD PTR SS:[EBP],Eb.00537048
0042AE96 . C706 10705300 MOV DWORD PTR DS:[ESI],Eb.00537010
0042AE9C . E8 BFF3FFFF CALL Eb.0042A260
0042AEA1 . 83C4 04 ADD ESP,4
0042AEA4 . 85C0 TEST EAX,EAX
0042AEA6 . 75 6A JNZ SHORT Eb.0042AF12 ; 關鍵跳轉,前面函數檢查加密狗是否存在,此處必須跳轉
0042AEA8 . E8 33310000 CALL Eb.0042DFE0
0042AEAD . 66:85C0 TEST AX,AX
0042AEB0 . BE 63000000 MOV ESI,63
0042AEB5 . 74 1A JE SHORT Eb.0042AED1
0042AEB7 . 6A 01 PUSH 1
0042AEB9 . C705 789A5500>MOV DWORD PTR DS:[559A78],460
0042AEC3 . 8935 749A5500 MOV DWORD PTR DS:[559A74],ESI
0042AEC9 . E8 5241FEFF CALL Eb.0040F020
0042AECE . 83C4 04 ADD ESP,4
0042AED1 > E8 9AFDFFFF CALL Eb.0042AC70
0042AED6 . 85C0 TEST EAX,EAX
0042AED8 . 74 1A JE SHORT Eb.0042AEF4
0042AEDA . 6A 03 PUSH 3
0042AEDC . C705 789A5500>MOV DWORD PTR DS:[559A78],474
0042AEE6 . 8935 749A5500 MOV DWORD PTR DS:[559A74],ESI
0042AEEC . E8 2F41FEFF CALL Eb.0040F020
0042AEF1 . 83C4 04 ADD ESP,4
0042AEF4 > E8 27310000 CALL Eb.0042E020
0042AEF9 . 8BC5 MOV EAX,EBP
0042AEFB . 5E POP ESI
0042AEFC . 5D POP EBP
0042AEFD . 8B8C24 C80000>MOV ECX,DWORD PTR SS:[ESP+C8]
0042AF04 . 64:890D 00000>MOV DWORD PTR FS:[0],ECX
0042AF0B . 81C4 D4000000 ADD ESP,0D4
0042AF11 . C3 RETN
0042AF12 > 57 PUSH EDI
0042AF13 . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
0042AF17 . E8 B6420A00 CALL <JMP.&MFC42.#540>
0042AF1C . 68 98B45500 PUSH Eb.0055B498 ; "授權使用"
0042AF21 . 8D4C24 10 LEA ECX,DWORD PTR SS:[ESP+10]
0042AF25 . C68424 E00000>MOV BYTE PTR SS:[ESP+E0],6
0042AF2D . E8 D6420A00 CALL <JMP.&MFC42.#860>
0042AF32 . 8B7C24 0C MOV EDI,DWORD PTR SS:[ESP+C]
0042AF36 . 83C9 FF OR ECX,FFFFFFFF
0042AF39 . 33C0 XOR EAX,EAX
0042AF3B . 8D5424 54 LEA EDX,DWORD PTR SS:[ESP+54]
0042AF3F . F2:AE REPNE SCAS BYTE PTR ES:[EDI]
0042AF41 . F7D1 NOT ECX
0042AF43 . 2BF9 SUB EDI,ECX
0042AF45 . 8BC1 MOV EAX,ECX
0042AF47 . 8BF7 MOV ESI,EDI
0042AF49 . 8BFA MOV EDI,EDX
0042AF4B . 8D5424 54 LEA EDX,DWORD PTR SS:[ESP+54]
0042AF4F . C1E9 02 SHR ECX,2
0042AF52 . F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
0042AF54 . 8BC8 MOV ECX,EAX
0042AF56 . 33C0 XOR EAX,EAX
0042AF58 . 83E1 03 AND ECX,3
0042AF5B . 50 PUSH EAX ; /Style => MB_OK|MB_APPLMODAL
0042AF5C . F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; |
0042AF5E . 8D7C24 18 LEA EDI,DWORD PTR SS:[ESP+18] ; |
0042AF62 . 83C9 FF OR ECX,FFFFFFFF ; |
0042AF65 . F2:AE REPNE SCAS BYTE PTR ES:[EDI] ; |
0042AF67 . F7D1 NOT ECX ; |
0042AF69 . 2BF9 SUB EDI,ECX ; |
0042AF6B . 68 98B45500 PUSH Eb.0055B498 ; |Title = "授權使用"
0042AF70 . 8BF7 MOV ESI,EDI ; |
0042AF72 . 8BFA MOV EDI,EDX ; |
0042AF74 . 8BD1 MOV EDX,ECX ; |
0042AF76 . 83C9 FF OR ECX,FFFFFFFF ; |
0042AF79 . F2:AE REPNE SCAS BYTE PTR ES:[EDI] ; |
0042AF7B . 8BCA MOV ECX,EDX ; |
0042AF7D . 4F DEC EDI ; |
0042AF7E . C1E9 02 SHR ECX,2 ; |
0042AF81 . F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; |
0042AF83 . 8BCA MOV ECX,EDX ; |
0042AF85 . 8D4424 5C LEA EAX,DWORD PTR SS:[ESP+5C] ; |
0042AF89 . 83E1 03 AND ECX,3 ; |
0042AF8C . 50 PUSH EAX ; |Text
0042AF8D . F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; |
0042AF8F . 6A 00 PUSH 0 ; |hOwner = NULL
0042AF91 . FF15 38235300 CALL DWORD PTR DS:[<&USER32.MessageBoxA>] ; \MessageBoxA
0042AF97 . 8D4C24 0C LEA ECX,DWORD PTR SS:[ESP+C]
0042AF9B . C68424 DC0000>MOV BYTE PTR SS:[ESP+DC],5
0042AFA3 . E8 48420A00 CALL <JMP.&MFC42.#800>
0042AFA8 . 8B8C24 D40000>MOV ECX,DWORD PTR SS:[ESP+D4]
0042AFAF . 5F POP EDI
0042AFB0 . 8BC5 MOV EAX,EBP
0042AFB2 . 5E POP ESI
0042AFB3 . 5D POP EBP
0042AFB4 . 64:890D 00000>MOV DWORD PTR FS:[0],ECX
0042AFBB . 81C4 D4000000 ADD ESP,0D4
0042AFC1 . C3 RETN
看到沒有0042AEA6 處就是一個函數的判斷,然後跟著判斷跳轉,只需要爆破就可。當然這樣爆破彈出的「授權使用」的名稱的是亂碼,為此,可以自己DIY了。
為了使得彈出的"授權使用"的對話框能夠顯示我自己的名稱,我利用PEID 打開程序,點 EP 段後面的那個 > 號,隨便選擇一個區段右擊,
選「搜索全0處」(原版好像是cave什麼的):找到RVA為130025,偏移為130025,長度為0xFDB的全0處.利用UltraEdit編輯130025處為
"授權使用laowang!",然後利用Hiew編輯代碼
0042AF85 . 8D4424 5C LEA EAX,DWORD PTR SS:[ESP+5C] ; |
0042AF89 . 83E1 03 AND ECX,3 ; |
0042AF8C . 50 PUSH EAX ; |Text
修改為
0042AF85 . 68 25005300 PUSH 復件_Eb.00530025 ; |Text = "授權使用laowang!"
0042AF8A . 90 NOP ; |
0042AF8B . 90 NOP ; |
0042AF8C . 90 NOP ; |
這樣,就能彈出授權laowang的對話框了.大功告成.
二、略微複雜的打狗
某軟件的破解主要針對RYC_OPEN,RYC_READ等函數即可.具體需要修改多處.為了某種需要將軟件名稱用「****」代替,其實這是脫殼之後的流程。
文中通過「-----」表示一級函數調用,「========」表示二級函數調用,請大家參看地址讀該軟件流程。
00402D60 . 55 push ebp
00402D61 . 8B6C24 08 mov ebp,dword ptr ss:[esp+8]
00402D65 . 56 push esi
00402D66 . 8B7424 10 mov esi,dword ptr ss:[esp+10]
00402D6A . 57 push edi
00402D6B . 8BF9 mov edi,ecx
00402D6D . 8B47 0C mov eax,dword ptr ds:[edi+C]
00402D70 . 85C0 test eax,eax
00402D72 . 896F 04 mov dword ptr ds:[edi+4],ebp
00402D75 . 8977 08 mov dword ptr ds:[edi+8],esi
00402D78 . 75 06 jnz short ****.00402D80
00402D7A . 5F pop edi
00402D7B . 5E pop esi
00402D7C . 5D pop ebp
00402D7D . C2 0800 retn 8
00402D80 > 53 push ebx
00402D81 . 8B18 mov ebx,dword ptr ds:[eax]
00402D83 . 837B 14 00 cmp dword ptr ds:[ebx+14],0
00402D87 . 74 05 je short ****.00402D8E
00402D89 . E8 D2C90000 call ****.0040F760 ; 判斷是否插入了USB狗
--------------------------------------------------------------------------------------------------------
此處F7進去:
0040F760 /$ 56 push esi
0040F761 |. 57 push edi
0040F762 |. 33FF xor edi,edi
0040F764 |. 8D73 04 lea esi,dword ptr ds:[ebx+4]
0040F767 |> 833E 00 /cmp dword ptr ds:[esi],0
0040F76A |. 74 0D |je short ****.0040F779
0040F76C |. 8B0E |mov ecx,dword ptr ds:[esi]
0040F76E |. 8B01 |mov eax,dword ptr ds:[ecx]
0040F770 |. 8B50 04 |mov edx,dword ptr ds:[eax+4]
0040F773 |. FFD2 |call edx ; 當循環到edi==3時,查詢是否插入Rockey USB狗的關鍵函數,此時F7進去
=========================================================================================================
此處F7進去:
00412700 . 81EC 08020000 sub esp,208
00412706 . A1 8C924800 mov eax,dword ptr ds:[48928C]
0041270B . 33C4 xor eax,esp
0041270D . 898424 04020000 mov dword ptr ss:[esp+204],eax
00412714 . 56 push esi
00412715 . 8BF1 mov esi,ecx
00412717 . 837E 30 00 cmp dword ptr ds:[esi+30],0
0041271B . 0F84 95000000 je ****.004127B6
00412721 . 837E 0C 00 cmp dword ptr ds:[esi+C],0
00412725 . 74 4E je short ****.00412775
00412727 . 8B46 18 mov eax,dword ptr ds:[esi+18]
0041272A . FFD0 call eax ; 調用RY2_Find函數
0041272C 85C0 test eax,eax ; 改為xor eax,eax
0041272E . 0F8E 82000000 jle ****.004127B6 ; nop掉
00412734 . 8B56 1C mov edx,dword ptr ds:[esi+1C]
00412737 . 8D4C24 04 lea ecx,dword ptr ss:[esp+4]
0041273B . 51 push ecx
0041273C . 68 2DEE9384 push 8493EE2D
00412741 . 6A 01 push 1
00412743 . FFD2 call edx ; 調用Rockye2.RY2_Open函數
00412745 . 85C0 test eax,eax ; 改為xor eax,eax
00412747 . 7C 6D jl short ****.004127B6 ; nop掉
00412749 . 8B4C24 04 mov ecx,dword ptr ss:[esp+4]
0041274D . 894E 08 mov dword ptr ds:[esi+8],ecx
00412750 > 8946 04 mov dword ptr ds:[esi+4],eax
00412753 . C746 10 01000000 mov dword ptr ds:[esi+10],1
0041275A > B8 01000000 mov eax,1
0041275F . 5E pop esi
00412760 . 8B8C24 04020000 mov ecx,dword ptr ss:[esp+204]
00412767 . 33CC xor ecx,esp
00412769 . E8 ACFC0400 call ****.0046241A
0041276E . 81C4 08020000 add esp,208
00412774 . C3 retn
00412775 > 837E 10 00 cmp dword ptr ds:[esi+10],0
00412779 . 75 27 jnz short ****.004127A2
0041277B . 8B56 18 mov edx,dword ptr ds:[esi+18]
0041277E . FFD2 call edx
00412780 . 85C0 test eax,eax
00412782 . 7E 32 jle short ****.004127B6
00412784 . 8B4E 1C mov ecx,dword ptr ds:[esi+1C]
00412787 . 8D4424 04 lea eax,dword ptr ss:[esp+4]
0041278B . 50 push eax
0041278C . 68 2DEE9384 push 8493EE2D
00412791 . 6A 01 push 1
00412793 . FFD1 call ecx
00412795 . 85C0 test eax,eax
00412797 . 7C 1D jl short ****.004127B6
00412799 . 8B5424 04 mov edx,dword ptr ss:[esp+4]
0041279D . 8956 08 mov dword ptr ds:[esi+8],edx
004127A0 .^ EB AE jmp short ****.00412750
004127A2 > 8B4E 04 mov ecx,dword ptr ds:[esi+4]
004127A5 . 8B56 28 mov edx,dword ptr ds:[esi+28]
004127A8 . 8D4424 08 lea eax,dword ptr ss:[esp+8]
004127AC . 50 push eax
004127AD . 6A 00 push 0
004127AF . 51 push ecx
004127B0 . FFD2 call edx
004127B2 . 85C0 test eax,eax
004127B4 .^ 7D A4 jge short ****.0041275A
004127B6 > 8B8C24 08020000 mov ecx,dword ptr ss:[esp+208]
004127BD . 5E pop esi
004127BE . 33CC xor ecx,esp
004127C0 . 33C0 xor eax,eax
004127C2 . E8 53FC0400 call ****.0046241A
004127C7 . 81C4 08020000 add esp,208
004127CD . C3 retn
004127CE CC int3
004127CF CC int3
004127D0 . 33C0 xor eax,eax
004127D2 . 3941 30 cmp dword ptr ds:[ecx+30],eax
004127D5 . 0F95C0 setne al
004127D8 . C3 retn
=========================================================================================================
0040F775 |. 85C0 |test eax,eax
0040F777 |. 75 15 |jnz short ****.0040F78E
0040F779 |> 83C7 01 |add edi,1
0040F77C |. 83C6 04 |add esi,4
0040F77F |. 83FF 04 |cmp edi,4
0040F782 |.^ 7C E3 \jl short ****.0040F767
0040F784 |. 5F pop edi
0040F785 |. C743 18 FFFFFFFF mov dword ptr ds:[ebx+18],-1
0040F78C |. 5E pop esi
0040F78D |. C3 retn
0040F78E |> 897B 18 mov dword ptr ds:[ebx+18],edi
0040F791 |. 5F pop edi
0040F792 |. 5E pop esi
0040F793 \. C3 retn
--------------------------------------------------------------------------------------------------------
00402D8E > 837B 18 FF cmp dword ptr ds:[ebx+18],-1
00402D92 . 0F84 0A010000 je ****.00402EA2 ; 錯誤跳轉1
00402D98 . 8B43 18 mov eax,dword ptr ds:[ebx+18]
00402D9B . 8B4C83 04 mov ecx,dword ptr ds:[ebx+eax*4+4]
00402D9F . 8B11 mov edx,dword ptr ds:[ecx]
00402DA1 . 8B42 04 mov eax,dword ptr ds:[edx+4]
00402DA4 . FFD0 call eax ; 此處與402DB9一樣再次判斷是否插入了USB狗,前面的爆破搞定
00402DA6 . 85C0 test eax,eax
00402DA8 . 0F84 F4000000 je ****.00402EA2 ; 錯誤跳轉2
00402DAE . 8B47 0C mov eax,dword ptr ds:[edi+C]
00402DB1 . 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
00402DB5 . 51 push ecx
00402DB6 . E8 552C0000 call ****.00405A10 ; 讀取狗中數據,進行驗證
--------------------------------------------------------------------------------------------------------
此處F7進去:
00405A10 /$ 51 push ecx
00405A11 |. 53 push ebx
00405A12 |. 8B18 mov ebx,dword ptr ds:[eax]
00405A14 |. 837B 14 00 cmp dword ptr ds:[ebx+14],0
00405A18 |. 74 05 je short ****.00405A1F
00405A1A |. E8 419D0000 call ****.0040F760 ; 判斷是否插入了USB狗,前面處理過了
00405A1F |> 837B 18 FF cmp dword ptr ds:[ebx+18],-1
00405A23 |. 74 20 je short ****.00405A45
00405A25 |. 8B4B 18 mov ecx,dword ptr ds:[ebx+18]
00405A28 |. 8B4C8B 04 mov ecx,dword ptr ds:[ebx+ecx*4+4]
00405A2C |. 8B11 mov edx,dword ptr ds:[ecx]
00405A2E |. 8B52 0C mov edx,dword ptr ds:[edx+C]
00405A31 |. 8D4424 04 lea eax,dword ptr ss:[esp+4]
00405A35 |. 50 push eax
00405A36 |. 6A 04 push 4
00405A38 |. 6A 30 push 30
00405A3A |. 68 E2850000 push 85E2
00405A3F |. FFD2 call edx ; 讀狗數據
=========================================================================================================
004127E0 . 81EC 04020000 sub esp,204
004127E6 . A1 8C924800 mov eax,dword ptr ds:[48928C]
004127EB . 33C4 xor eax,esp
004127ED . 898424 00020000 mov dword ptr ss:[esp+200],eax
004127F4 . 56 push esi
004127F5 . 8BF1 mov esi,ecx
004127F7 . 837E 30 00 cmp dword ptr ds:[esi+30],0
004127FB . 57 push edi
004127FC . 8BBC24 1C020000 mov edi,dword ptr ss:[esp+21C]
00412803 . 75 04 jnz short ****.00412809
00412805 > 33C0 xor eax,eax
00412807 . EB 4C jmp short ****.00412855
00412809 > 68 00020000 push 200 ; /n = 200 (512.)
0041280E . 8D4424 0C lea eax,dword ptr ss:[esp+C] ; |
00412812 . 6A 00 push 0 ; |c = 00
00412814 . 50 push eax ; |s
00412815 . E8 9EFC0400 call <jmp.&MSVCR80.memset> ; \memset
0041281A . 8B56 04 mov edx,dword ptr ds:[esi+4]
0041281D . 8B46 28 mov eax,dword ptr ds:[esi+28]
00412820 . 83C4 0C add esp,0C
00412823 . 8D4C24 08 lea ecx,dword ptr ss:[esp+8]
00412827 . 51 push ecx
00412828 . 6A 00 push 0
0041282A . 52 push edx
0041282B . FFD0 call eax ; 調用Rockey2.RY2_Read函數,讀取狗中的數據進行驗證
0041282D . 85C0 test eax,eax ; 爆破為xor eax,eax
0041282F .^\7C D4 jl short ****.00412805
00412831 . 0FBF8C24 18020000 movsx ecx,word ptr ss:[esp+218]
00412839 . 0FBF9424 14020000 movsx edx,word ptr ss:[esp+214]
00412841 . 51 push ecx ; /n
00412842 . 8D4414 0C lea eax,dword ptr ss:[esp+edx+C] ; |
00412846 . 50 push eax ; |src
00412847 . 57 push edi ; |dest
00412848 . E8 B5FC0400 call <jmp.&MSVCR80.memcpy> ; \memcpy
0041284D . 83C4 0C add esp,0C
00412850 . B8 01000000 mov eax,1
00412855 > 8B8C24 08020000 mov ecx,dword ptr ss:[esp+208]
0041285C . 5F pop edi
0041285D . 5E pop esi
0041285E . 33CC xor ecx,esp
00412860 . E8 B5FB0400 call ****.0046241A
00412865 . 81C4 04020000 add esp,204
0041286B . C2 1000 retn 10
=========================================================================================================
00405A41 |. 85C0 test eax,eax
00405A43 |. 75 0A jnz short ****.00405A4F
00405A45 |> B8 01000000 mov eax,1
00405A4A |. 5B pop ebx
00405A4B |. 59 pop ecx
00405A4C |. C2 0400 retn 4
00405A4F |> \8B4424 04 mov eax,dword ptr ss:[esp+4]
00405A53 |. 8B4C24 0C mov ecx,dword ptr ss:[esp+C]
00405A57 8901 mov dword ptr ds:[ecx],eax ; 為了402DC3處的比較,爆破為mov dword ptr ds:[ecx],esi
00405A59 |. 33C0 xor eax,eax
00405A5B |. 5B pop ebx
00405A5C |. 59 pop ecx
00405A5D \. C2 0400 retn 4
--------------------------------------------------------------------------------------------------------
00402DBB . 85C0 test eax,eax
00402DBD . 0F85 DF000000 jnz ****.00402EA2 ; 錯誤跳轉3
00402DC3 . 397424 14 cmp dword ptr ss:[esp+14],esi
00402DC7 . 0F85 D5000000 jnz ****.00402EA2 ; 錯誤跳轉4
00402DCD . 8B47 0C mov eax,dword ptr ds:[edi+C]
00402DD0 . 8D5424 14 lea edx,dword ptr ss:[esp+14]
00402DD4 . 33DB xor ebx,ebx
00402DD6 . 52 push edx
00402DD7 . 895C24 18 mov dword ptr ss:[esp+18],ebx
00402DDB . E8 C02B0000 call ****.004059A0
00402DE0 . 85C0 test eax,eax
00402DE2 . 75 09 jnz short ****.00402DED
00402DE4 . 66:817C24 14 0408 cmp word ptr ss:[esp+14],804
00402DEB . 75 12 jnz short ****.00402DFF
00402DED > 81FD 04080000 cmp ebp,804
00402DF3 . 74 0A je short ****.00402DFF
00402DF5 . 8B7F 2C mov edi,dword ptr ds:[edi+2C]
00402DF8 . 3BFB cmp edi,ebx
00402DFA . E9 A8000000 jmp ****.00402EA7
00402DFF > 8B4F 0C mov ecx,dword ptr ds:[edi+C]
00402E02 . 8D77 18 lea esi,dword ptr ds:[edi+18]
00402E05 . 895F 10 mov dword ptr ds:[edi+10],ebx
00402E08 . E8 D32A0000 call ****.004058E0 ; 驗證函數
--------------------------------------------------------------------------------------------------------
此處F7進去:
004058E0 /$ 83EC 1C sub esp,1C
004058E3 |. A1 8C924800 mov eax,dword ptr ds:[48928C]
004058E8 |. 33C4 xor eax,esp
004058EA |. 894424 18 mov dword ptr ss:[esp+18],eax
004058EE |. 33C0 xor eax,eax
004058F0 |. 53 push ebx
004058F1 |. 8B19 mov ebx,dword ptr ds:[ecx]
004058F3 |. 894424 10 mov dword ptr ss:[esp+10],eax
004058F7 |. 894424 14 mov dword ptr ss:[esp+14],eax
004058FB |. 884424 18 mov byte ptr ss:[esp+18],al
004058FF |. 3943 14 cmp dword ptr ds:[ebx+14],eax
00405902 |. 74 05 je short ****.00405909
00405904 |. E8 579E0000 call ****.0040F760 ; 查詢USB狗是否存在,前面爆破了
00405909 |> 837B 18 FF cmp dword ptr ds:[ebx+18],-1
0040590D |. 74 20 je short ****.0040592F
0040590F |. 8B43 18 mov eax,dword ptr ds:[ebx+18]
00405912 |. 8B4C83 04 mov ecx,dword ptr ds:[ebx+eax*4+4]
00405916 |. 8B11 mov edx,dword ptr ds:[ecx]
00405918 |. 8B52 0C mov edx,dword ptr ds:[edx+C]
0040591B |. 8D4424 10 lea eax,dword ptr ss:[esp+10]
0040591F |. 50 push eax
00405920 |. 6A 08 push 8
00405922 |. 6A 24 push 24
00405924 |. 68 E2850000 push 85E2
00405929 |. FFD2 call edx ; 讀USB狗數據,前面爆破了
0040592B |. 85C0 test eax,eax
0040592D |. 75 15 jnz short ****.00405944
0040592F |> B8 01000000 mov eax,1
00405934 |. 5B pop ebx
00405935 |. 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
00405939 |. 33CC xor ecx,esp
0040593B |. E8 DACA0500 call ****.0046241A
00405940 |. 83C4 1C add esp,1C
00405943 |. C3 retn
00405944 |> 33C0 xor eax,eax
00405946 |. 894424 04 mov dword ptr ss:[esp+4],eax
0040594A |. 894424 08 mov dword ptr ss:[esp+8],eax
0040594E |. 884424 0C mov byte ptr ss:[esp+C],al
00405952 |. 8D4424 04 lea eax,dword ptr ss:[esp+4]
00405956 |. 50 push eax
00405957 |. B8 70C64800 mov eax,****.0048C670
0040595C |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
00405960 |. E8 3BAC0000 call ****.004105A0
00405965 |. 8B4C24 08 mov ecx,dword ptr ss:[esp+8]
00405969 |. 81C1 03250000 add ecx,2503
0040596F |. F7D1 not ecx
00405971 |. 83C4 04 add esp,4
00405974 |. 66:394C24 08 cmp word ptr ss:[esp+8],cx
00405979 |.^ 75 B4 jnz short ****.0040592F ; nop掉
0040597B |. 0FB75424 04 movzx edx,word ptr ss:[esp+4]
00405980 |. 8B4C24 1C mov ecx,dword ptr ss:[esp+1C]
00405984 |. 5B pop ebx
00405985 |. 33CC xor ecx,esp
00405987 |. 8916 mov dword ptr ds:[esi],edx
00405989 |. 33C0 xor eax,eax
0040598B |. E8 8ACA0500 call ****.0046241A
00405990 |. 83C4 1C add esp,1C
00405993 \. C3 retn
--------------------------------------------------------------------------------------------------------
00402E0D . 85C0 test eax,eax
00402E0F . 74 0A je short ****.00402E1B ; 錯誤跳轉5
00402E11 . 8B7F 2C mov edi,dword ptr ds:[edi+2C]
00402E14 . 3BFB cmp edi,ebx
00402E16 . E9 8C000000 jmp ****.00402EA7
00402E1B > \8B4F 0C mov ecx,dword ptr ds:[edi+C]
00402E1E . E8 2D260000 call ****.00405450 ; 驗證函數2
--------------------------------------------------------------------------------------------------------
此處F7進去:
00405450 /$ 83EC 1C sub esp,1C
00405453 |. A1 8C924800 mov eax,dword ptr ds:[48928C]
00405458 |. 33C4 xor eax,esp
0040545A |. 894424 18 mov dword ptr ss:[esp+18],eax
0040545E |. 33C0 xor eax,eax
00405460 |. 53 push ebx
00405461 |. 8B19 mov ebx,dword ptr ds:[ecx]
00405463 |. 894424 10 mov dword ptr ss:[esp+10],eax
00405467 |. 894424 14 mov dword ptr ss:[esp+14],eax
0040546B |. 884424 18 mov byte ptr ss:[esp+18],al
0040546F |. 3943 14 cmp dword ptr ds:[ebx+14],eax
00405472 |. 74 05 je short ****.00405479
00405474 |. E8 E7A20000 call ****.0040F760 ; 查詢USB狗是否存在
00405479 |> 837B 18 FF cmp dword ptr ds:[ebx+18],-1
0040547D |. 74 20 je short ****.0040549F
0040547F |. 8B43 18 mov eax,dword ptr ds:[ebx+18]
00405482 |. 8B4C83 04 mov ecx,dword ptr ds:[ebx+eax*4+4]
00405486 |. 8B11 mov edx,dword ptr ds:[ecx]
00405488 |. 8B52 0C mov edx,dword ptr ds:[edx+C]
0040548B |. 8D4424 10 lea eax,dword ptr ss:[esp+10]
0040548F |. 50 push eax
00405490 |. 6A 08 push 8
00405492 |. 6A 14 push 14
00405494 |. 68 E2850000 push 85E2
00405499 |. FFD2 call edx ; 讀取USB狗數據
0040549B |. 85C0 test eax,eax
0040549D |. 75 15 jnz short ****.004054B4
0040549F |> B8 01000000 mov eax,1
004054A4 |. 5B pop ebx
004054A5 |. 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
004054A9 |. 33CC xor ecx,esp
004054AB |. E8 6ACF0500 call ****.0046241A
004054B0 |. 83C4 1C add esp,1C
004054B3 |. C3 retn
004054B4 |> 33C0 xor eax,eax
004054B6 |. 894424 04 mov dword ptr ss:[esp+4],eax
004054BA |. 894424 08 mov dword ptr ss:[esp+8],eax
004054BE |. 884424 0C mov byte ptr ss:[esp+C],al
004054C2 |. 8D4424 04 lea eax,dword ptr ss:[esp+4]
004054C6 |. 50 push eax
004054C7 |. B8 70C64800 mov eax,****.0048C670
004054CC |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
004054D0 |. E8 CBB00000 call ****.004105A0
004054D5 |. 8B4424 08 mov eax,dword ptr ss:[esp+8]
004054D9 |. 8D88 29090000 lea ecx,dword ptr ds:[eax+929]
004054DF |. F7D1 not ecx
004054E1 |. 83C4 04 add esp,4
004054E4 |. 3B4C24 08 cmp ecx,dword ptr ss:[esp+8]
004054E8 |.^ 75 B5 jnz short ****.0040549F ; nop掉
004054EA |. 8B4C24 1C mov ecx,dword ptr ss:[esp+1C]
004054EE |. 33D2 xor edx,edx
004054F0 |. 3D 73743612 cmp eax,12367473
004054F5 |. 0F95C2 setne dl
004054F8 |. 5B pop ebx
004054F9 |. 33CC xor ecx,esp
004054FB |. 8BC2 mov eax,edx
004054FD |. E8 18CF0500 call ****.0046241A
00405502 |. 83C4 1C add esp,1C
00405505 \. C3 retn
--------------------------------------------------------------------------------------------------------
00402E23 . 85C0 test eax,eax
00402E25 . 75 03 jnz short ****.00402E2A ; 錯誤跳轉6
00402E27 . 895F 14 mov dword ptr ds:[edi+14],ebx
00402E2A > 395F 14 cmp dword ptr ds:[edi+14],ebx
00402E2D . 74 67 je short ****.00402E96
00402E2F . 8B4F 0C mov ecx,dword ptr ds:[edi+C]
00402E32 . 8D7424 14 lea esi,dword ptr ss:[esp+14]
00402E36 . E8 F5280000 call ****.00405730 ; 驗證函數3
--------------------------------------------------------------------------------------------------------
此處F7進去:
00405730 /$ 83EC 1C sub esp,1C
00405733 |. A1 8C924800 mov eax,dword ptr ds:[48928C]
00405738 |. 33C4 xor eax,esp
0040573A |. 894424 18 mov dword ptr ss:[esp+18],eax
0040573E |. 33C0 xor eax,eax
00405740 |. 53 push ebx
00405741 |. 8B19 mov ebx,dword ptr ds:[ecx]
00405743 |. 894424 10 mov dword ptr ss:[esp+10],eax
00405747 |. 894424 14 mov dword ptr ss:[esp+14],eax
0040574B |. 884424 18 mov byte ptr ss:[esp+18],al
0040574F |. 3943 14 cmp dword ptr ds:[ebx+14],eax
00405752 |. 74 05 je short ****.00405759
00405754 |. E8 07A00000 call ****.0040F760
00405759 |> 837B 18 FF cmp dword ptr ds:[ebx+18],-1
0040575D |. 74 20 je short ****.0040577F
0040575F |. 8B43 18 mov eax,dword ptr ds:[ebx+18]
00405762 |. 8B4C83 04 mov ecx,dword ptr ds:[ebx+eax*4+4]
00405766 |. 8B11 mov edx,dword ptr ds:[ecx]
00405768 |. 8B52 0C mov edx,dword ptr ds:[edx+C]
0040576B |. 8D4424 10 lea eax,dword ptr ss:[esp+10]
0040576F |. 50 push eax
00405770 |. 6A 08 push 8
00405772 |. 6A 1C push 1C
00405774 |. 68 E2850000 push 85E2
00405779 |. FFD2 call edx
0040577B |. 85C0 test eax,eax
0040577D |. 75 15 jnz short ****.00405794
0040577F |> B8 01000000 mov eax,1
00405784 |. 5B pop ebx
00405785 |. 8B4C24 18 mov ecx,dword ptr ss:[esp+18]
00405789 |. 33CC xor ecx,esp
0040578B |. E8 8ACC0500 call ****.0046241A
00405790 |. 83C4 1C add esp,1C
00405793 |. C3 retn
00405794 |> 33C0 xor eax,eax
00405796 |. 894424 04 mov dword ptr ss:[esp+4],eax
0040579A |. 894424 08 mov dword ptr ss:[esp+8],eax
0040579E |. 884424 0C mov byte ptr ss:[esp+C],al
004057A2 |. 8D4424 04 lea eax,dword ptr ss:[esp+4]
004057A6 |. 50 push eax
004057A7 |. B8 70C64800 mov eax,****.0048C670
004057AC |. 8D4C24 14 lea ecx,dword ptr ss:[esp+14]
004057B0 |. E8 EBAD0000 call ****.004105A0
004057B5 |. 8B4424 08 mov eax,dword ptr ss:[esp+8]
004057B9 |. 8D88 AC200000 lea ecx,dword ptr ds:[eax+20AC]
004057BF |. F7D1 not ecx
004057C1 |. 83C4 04 add esp,4
004057C4 |. 3B4C24 08 cmp ecx,dword ptr ss:[esp+8]
004057C8 |.^ 75 B5 jnz short ****.0040577F ; nop掉
004057CA |. 8B4C24 1C mov ecx,dword ptr ss:[esp+1C]
004057CE |. 5B pop ebx
004057CF |. 8906 mov dword ptr ds:[esi],eax
004057D1 |. 33CC xor ecx,esp
004057D3 |. 33C0 xor eax,eax
004057D5 |. E8 40CC0500 call ****.0046241A
004057DA |. 83C4 1C add esp,1C
004057DD \. C3 retn
--------------------------------------------------------------------------------------------------------
00402E3B . 85C0 test eax,eax
00402E3D . 74 07 je short ****.00402E46 ; 錯誤跳轉7
00402E3F . 8B7F 2C mov edi,dword ptr ds:[edi+2C]
00402E42 . 3BFB cmp edi,ebx
00402E44 . EB 61 jmp short ****.00402EA7
00402E46 > 8B4424 14 mov eax,dword ptr ss:[esp+14]
00402E4A . 8D48 FF lea ecx,dword ptr ds:[eax-1]
00402E4D . 81F9 0E0E0000 cmp ecx,0E0E
00402E53 . 77 19 ja short ****.00402E6E ; 是否過期判斷
00402E55 . 8B7F 28 mov edi,dword ptr ds:[edi+28]
00402E58 . 3BFB cmp edi,ebx
00402E5A . 74 3A je short ****.00402E96
00402E5C . 50 push eax
00402E5D . FFD7 call edi
00402E5F . 83C4 04 add esp,4
00402E62 . 5B pop ebx
00402E63 . 5F pop edi
00402E64 . 5E pop esi
00402E65 . B8 01000000 mov eax,1
00402E6A . 5D pop ebp
00402E6B . C2 0800 retn 8
00402E6E > 3BC3 cmp eax,ebx
00402E70 . 75 24 jnz short ****.00402E96
00402E72 . 8B47 30 mov eax,dword ptr ds:[edi+30]
00402E75 . 3BC3 cmp eax,ebx
00402E77 . 74 02 je short ****.00402E7B
00402E79 . FFD0 call eax
00402E7B > 8B17 mov edx,dword ptr ds:[edi]
00402E7D . 8B42 18 mov eax,dword ptr ds:[edx+18]
00402E80 . 8BCF mov ecx,edi
00402E82 . FFD0 call eax
00402E84 . 8B4F 0C mov ecx,dword ptr ds:[edi+C]
00402E87 . E8 C4250000 call ****.00405450
00402E8C . 85C0 test eax,eax
00402E8E . 75 1B jnz short ****.00402EAB
00402E90 . 895F 14 mov dword ptr ds:[edi+14],ebx
00402E93 . 895F 10 mov dword ptr ds:[edi+10],ebx
00402E96 > 5B pop ebx
00402E97 . 5F pop edi
00402E98 . 5E pop esi
00402E99 . B8 01000000 mov eax,1
00402E9E . 5D pop ebp
00402E9F . C2 0800 retn 8
00402EA2 > 8B7F 2C mov edi,dword ptr ds:[edi+2C]
00402EA5 . 85FF test edi,edi
00402EA7 > 74 02 je short ****.00402EAB
00402EA9 . FFD7 call edi
00402EAB > 5B pop ebx
00402EAC . 5F pop edi
00402EAD . 5E pop esi
00402EAE . 33C0 xor eax,eax
00402EB0 . 5D pop ebp
00402EB1 . C2 0800 retn 8
總結可以發現軟件打狗主要需要針對RYC_OPEN,RYC_READ函數調用進行爆破,具體爆破需要根據軟件流程進行爆破,很難三言兩語進行交待,我等菜鳥湊合看吧!
高手飄過。
2010年5月7日 星期五
簡單打狗文章一二
速達3000PRO加密狗軟體學習
我寫這篇文章是以技術交流為主,希望論壇的前輩多多指點。
看過XIAQIN[CCG]的文章後,想找個速達3000PRO加密狗軟體學習一下。恰好我有個朋友是其地區級的代理商,我去找到他給我了一張試用光碟,一看上面什麼軟體都有,於是決定試試。 下面談談我的學習程序。
這是小弟第六次學習加密狗的軟體,水準有限。不足之處,請各位大俠指點。
軟體簡介:《速達3000 PRO》軟體是非常著名的進銷存財務軟體。
破解工具:
Trw2000
SuperBPM
WINHEX
OFFCAL
在沒有安裝加密狗之前,在啟動軟體時會彈出「未檢測到本軟體使用的軟體狗,本軟體將工作試驗版狀態」對話視窗。在軟體的啟動畫面中醒目的有紅色「試用版」三個字。就進入了「選項公司帳套」。在進入軟體後。在 「關於速達3000 PRO」中同樣有紅色「試用版」三個字。
該軟體靜態分析時列機(用的W32Dasm),IDA又太慢,所以只好直接動態分析了。經過仔細跟蹤來到CC3250.EXE的領空,繼續單步跟蹤,一路上有很多的花指令,但用點技巧也是很容易走出來的。直到:
0167:3257DBEB PUSH EAX
0167:3257DBEC CALL NEAR [ESI+18] //F10走過時彈出對話視窗,F8進入
0167:3257DBEF ADD ESP,BYTE +10
0167:3257DBF2 PUSH EAX
0167:3257DBF3 CALL `CC3250MT!_exit`
0167:3257DBF8 POP ECX
0167:3257DBF9 JMP SHORT 3257DC1C
0167:3257DBFB MOV EDX,[325AD400]
0167:3257DC01 PUSH EDX
0167:3257DC02 MOV ECX,[325AD3FC]
從3257DBEC進入後來到:
.
.
.
0167:00401859 XOR EAX,EAX
0167:0040185B MOV EDX,[EBP-38]
0167:0040185E MOV [FS:00],EDX
0167:00401865 JMP 00401C52
0167:0040186A MOV BYTE [00B25934],00
0167:00401871 CMP BYTE [00B25934],00
0167:00401878 JNZ NEAR 004019A1
0167:0040187E MOV BYTE [00B25934],01
0167:00401885 CALL 00939944
0167:0040188A TEST AL,AL
0167:0040188C JZ 0040189A
0167:0040188E MOV BYTE [00B25934],00
0167:00401895 JMP 00401963
0167:0040189A MOV WORD [EBP-28],14
0167:004018A0 LEA EAX,[EBP-08]
0167:004018A3 CALL 00401C5C
0167:004018A8 INC DWORD [EBP-1C]
0167:004018AB CALL `SD3000PRO!@Dogtestpro@_ManCheckDlgDan$qqrv` //DOG
0167:004018B0 MOV WORD [EBP-28],08
0167:004018B6 MOV WORD [EBP-28],20
0167:004018BC MOV EDX,00942C1F
0167:004018C1 LEA EAX,[EBP-0C]
0167:004018C4 CALL 00939C34
0167:004018C9 INC DWORD [EBP-1C]
0167:004018CC LEA EDX,[EBP-0C]
0167:004018CF LEA EAX,[EBP-08]
0167:004018D2 CALL 00939FAC
0167:004018D7 PUSH EAX
0167:004018D8 DEC DWORD [EBP-1C]
0167:004018DB LEA EAX,[EBP-0C]
0167:004018DE MOV EDX,02
0167:004018E3 CALL 00939EC8
0167:004018E8 POP ECX
0167:004018E9 TEST CL,CL
0167:004018EB JZ 004018FF
0167:004018ED CALL `SD3000PRO!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
0167:004018F2 TEST AL,AL
0167:004018F4 JZ 0040194D
0167:004018F6 MOV BYTE [00B25934],00
.
.
.
0167:00401932 TEST CL,CL
0167:00401934 JZ 0040194D
0167:00401936 XOR EAX,EAX
0167:00401938 CALL 00427814
0167:0040193D TEST AL,AL
0167:0040193F JZ 0040194D
0167:00401941 CALL `SD3000PRO!@Dogtestpro@WriteNewInfo$qqrv` //DOG
0167:00401946 MOV BYTE [00B25934],00
0167:0040194D DEC DWORD [EBP-1C]
0167:00401950 LEA EAX,[EBP-08]
0167:00401953 MOV EDX,02
0167:00401958 CALL 00939EC8
0167:0040195D MOV WORD [EBP-28],00
0167:00401963 CMP BYTE [00B25934],00
0167:0040196A JZ 004019A1
0167:0040196C MOV WORD [EBP-28],38
0167:00401972 MOV EDX,00942C23
.
.
.
從上面我們很容易發現[00b25934]的多次出現,且鞭後都跟有
比較指令,實際上[00b25934]值是0時表示有狗。我們看看是哪
個地方改變了[00b25934]的值。我們下斷點監看到的寫操作。
等攔斷後來到:
0167:00401871 CMP BYTE [00B25934],00
0167:00401878 JNZ NEAR 004019A1 //此處如果讓它直接跳走,即成為正式版了
0167:0040187E MOV BYTE [00B25934],01 //如果上面沒有跳走,這裡把01改成00也能成為正式版
0167:00401885 CALL 00939944
0167:0040188A TEST AL,AL
0167:0040188C JZ 0040189A
0167:0040188E MOV BYTE [00B25934],00
0167:00401895 JMP 00401963
0167:0040189A MOV WORD [EBP-28],14
0167:004018A0 LEA EAX,[EBP-08]
0167:004018A3 CALL 00401C5C
0167:004018A8 INC DWORD [EBP-1C]
0167:004018AB CALL `SD3000PRO!@Dogtestpro@_ManCheckDlgDan$qqrv`
0167:004018B0 MOV WORD [EBP-28],08
0167:004018B6 MOV WORD [EBP-28],20
0167:004018BC MOV EDX,00942C1F
0167:004018C1 LEA EAX,[EBP-0C]
0167:004018C4 CALL 00939C34
0167:004018C9 INC DWORD [EBP-1C]
0167:004018CC LEA EDX,[EBP-0C]
0167:004018CF LEA EAX,[EBP-08]
0167:004018D2 CALL 00939FAC
0167:004018D7 PUSH EAX
0167:004018D8 DEC DWORD [EBP-1C]
0167:004018DB LEA EAX,[EBP-0C]
0167:004018DE MOV EDX,02
0167:004018E3 CALL 00939EC8
0167:004018E8 POP ECX
0167:004018E9 TEST CL,CL
0167:004018EB JZ 004018FF
0167:004018ED CALL `SD3000PRO!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
0167:004018F2 TEST AL,AL
0167:004018F4 JZ 0040194D
0167:004018F6 MOV BYTE [00B25934],00
0167:004018FD JMP SHORT 0040194D
0167:004018FF MOV WORD [EBP-28],2C
0167:00401905 MOV EDX,00942C21
可見,改這個軟體只需一個字元,而且測試三次的結算限制也沒了。下一篇我想寫寫SD-ERP網路版丟狗方法
和某著名工程預算軟體的丟狗方法。在下水準有限,想和各位打狗高手及
PJ界的前輩學習一下,不知有人願意否,如有請留言,我會及時和你聯繫!
-------青石
acrobatcn申請第二篇:速達3000pro-無狗解狗
軟體名稱:速達3000 pro
軟體語言: 中文
軟體類別: 共享版/財務軟體
套用平台: Win9x/NT/2000/XP
限制類型:軟體狗
難易程度:易
下載地質:http://www.superdata.com.cn/download1/index.asp
1.peid檢查,無殼
2. w32dasm反彙編,結果不行,w32dasm死掉
3. 只能用trw了。
w32dasm在起始時就死了,不能正確的定位程序的起始,所以乾脆不用了,直接bpio 378
結果轉到了讀狗的tdsd.vxd裡,轉暈了也看不明白,而且也不太容易出來,pret在0級模式用不了。所以乾脆從程序的開始跟起,delphi的程序起始都一樣,以如下開頭:
0167:00401022 CALL `KERNEL32!GetModuleHandleA`
0167:00401027 MOV EDX,EAX
0167:00401029 CALL 009A534C
0167:0040102E POP EDX
0167:0040102F CALL `CC3250MT!___CRTL_MEM_UseBorMM`
0167:00401034 CALL 009A5390
0167:00401039 PUSH BYTE +00
0167:0040103B CALL 009A54C4
0167:00401040 POP ECX
0167:00401041 PUSH DWORD 009AED08
0167:00401046 PUSH BYTE +00
0167:00401048 CALL `KERNEL32!GetModuleHandleA`
0167:0040104D MOV [009AED67],EAX
0167:00401052 PUSH BYTE +00
0167:00401054 JMP CC3250MT!_Startup<----從這裡跳到CC3250MT裡,進入CC3250MT裡後,經過一系列的初始,小心按F7,很快來到:
0167:3257DBE0 PUSH EAX
0167:3257DBE1 PUSH EBX
0167:3257DBE2 PUSH BYTE +00
0167:3257DBE4 PUSH BYTE +00
0167:3257DBE6 CALL `KERNEL32!GetModuleHandleA`
0167:3257DBEB PUSH EAX
0167:3257DBEC CALL NEAR [ESI+18]<---還不進入主程序的領空嗎?快進吧!大家不要說我笨,按F11不就ok了嗎?你試試吧!
0167:3257DBEF ADD ESP,BYTE +10
0167:3257DBF2 PUSH EAX
0167:3257DBF3 CALL `CC3250MT!_exit`<-----看見了嗎?要exit了,所以前面的call是返回到主程序的。
..................................................................
進入了sd3000xp,如下很簡單:
.....
0167:00401887 0F854D010000 JNZ NEAR 004019DA (NO JUMP)1.<-----這裡改為跳轉就無nag,而且也無試用版字樣,有點奇怪吧!我為什麼要改它,因為它可以跳過nag視窗,而且如果你再去看看速達3000pro就知道了。
0167:0040188D C6051C3ABD0001 MOV BYTE [00BD3A1C],01
0167:00401894 E8D7305A00 CALL 009A4970<----讀狗,tdsd.vxd
0167:00401899 84C0 TEST AL,AL
0167:0040189B 740C JZ 004018A9
0167:0040189D C6051C3ABD0000 MOV BYTE [00BD3A1C],00<-------注意,00BD3A1C標誌位,在這裡改,連狗都不用讀了,就不會有試用版的字樣,成了正式版,太簡單了。
0167:004018A4 E9EA000000 JMP 00401993
0167:004018A9 66C78510FDFFFF14+MOV WORD [EBP+FFFFFD10],14
0167:004018B2 8D45F8 LEA EAX,[EBP-08]
0167:004018B5 E882350000 CALL 00404E3C<---又讀狗,煩
0167:004018BA FF851CFDFFFF INC DWORD [EBP+FFFFFD1C]
0167:004018C0 E8D3DA3300 CALL `SD3000XP!@Dogtestpro@_ManCheckDlgDan$qqrv`<-----多簡單,提示也太明顯了吧!是否有狗
0167:004018C5 66C78510FDFFFF08+MOV WORD [EBP+FFFFFD10],08
0167:004018CE 66C78510FDFFFF20+MOV WORD [EBP+FFFFFD10],20
0167:004018D7 BAAFED9A00 MOV EDX,009AEDAF
0167:004018DC 8D45F4 LEA EAX,[EBP-0C]
0167:004018DF E808405A00 CALL 009A58EC
0167:004018E4 FF851CFDFFFF INC DWORD [EBP+FFFFFD1C]
0167:004018EA 8D55F4 LEA EDX,[EBP-0C]
0167:004018ED 8D45F8 LEA EAX,[EBP-08]
0167:004018F0 E86F435A00 CALL 009A5C64
0167:004018F5 50 PUSH EAX
0167:004018F6 FF8D1CFDFFFF DEC DWORD [EBP+FFFFFD1C]
0167:004018FC 8D45F4 LEA EAX,[EBP-0C]
0167:004018FF BA02000000 MOV EDX,02
0167:00401904 E877425A00 CALL 009A5B80
0167:00401909 59 POP ECX
0167:0040190A 84C9 TEST CL,CL
0167:0040190C 7412 JZ 00401920<---改為不跳,跳了就over了
0167:0040190E E875DC3300 CALL `SD3000XP!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`<--進行狗的判斷
0167:00401913 84C0 TEST AL,AL<---返回al為判斷值
0167:00401915 7460 JZ 00401977<---0就跳,改為不跳,讓下面的一句自己對標誌位賦值
0167:00401917 C6051C3ABD0000 MOV BYTE [00BD3A1C],00<-----呵呵,對標誌位賦值0,正式版啊!
0167:0040191E EB57 JMP SHORT 00401977<---跳
0167:00401920 66C78510FDFFFF2C+MOV WORD [EBP+FFFFFD10],2C
0167:00401929 BAB1ED9A00 MOV EDX,009AEDB1
0167:0040192E 8D45F0 LEA EAX,[EBP-10]
0167:00401931 E8B63F5A00 CALL 009A58EC
0167:00401936 FF851CFDFFFF INC DWORD [EBP+FFFFFD1C]
0167:0040193C 8D55F0 LEA EDX,[EBP-10]
0167:0040193F 8D45F8 LEA EAX,[EBP-08]
0167:00401942 E81D435A00 CALL 009A5C64
0167:00401947 50 PUSH EAX
0167:00401948 FF8D1CFDFFFF DEC DWORD [EBP+FFFFFD1C]
0167:0040194E 8D45F0 LEA EAX,[EBP-10]
0167:00401951 BA02000000 MOV EDX,02
0167:00401956 E825425A00 CALL 009A5B80
0167:0040195B 59 POP ECX
0167:0040195C 84C9 TEST CL,CL
0167:0040195E 7417 JZ 00401977
0167:00401960 33C0 XOR EAX,EAX
0167:00401962 E8158E0200 CALL 0042A77C
0167:00401967 84C0 TEST AL,AL
0167:00401969 740C JZ 00401977
0167:0040196B E88CE03300 CALL `SD3000XP!@Dogtestpro@WriteNewInfo$qqrv`
0167:00401970 C6051C3ABD0000 MOV BYTE [00BD3A1C],00
0167:00401977 FF8D1CFDFFFF DEC DWORD [EBP+FFFFFD1C]
0167:0040197D 8D45F8 LEA EAX,[EBP-08]
0167:00401980 BA02000000 MOV EDX,02
0167:00401985 E8F6415A00 CALL 009A5B80
0167:0040198A 66C78510FDFFFF00+MOV WORD [EBP+FFFFFD10],00
0167:00401993 803D1C3ABD0000 CMP BYTE [00BD3A1C],00<----標誌比較啊
0167:0040199A 743E JZ 004019DA<-----根據上面的結果,呵呵,會跳的,跳過nag,好了,我們啟動程序後,從說明 功能表力看看about,結果,呵呵,使用版三個字沒有了吧!
0167:0040199C 66C78510FDFFFF38+MOV WORD [EBP+FFFFFD10],38
0167:004019A5 BAB3ED9A00 MOV EDX,009AEDB3
0167:004019AA 8D45EC LEA EAX,[EBP-14]
0167:004019AD E83A3F5A00 CALL 009A58EC
0167:004019B2 FF851CFDFFFF INC DWORD [EBP+FFFFFD1C]
0167:004019B8 8B00 MOV EAX,[EAX]
0167:004019BA 33C9 XOR ECX,ECX
0167:004019BC 8B1554329C00 MOV EDX,[009C3254]
0167:004019C2 E869B90200 CALL 0042D330<-------nag,視窗啊,kill it!
0167:004019C7 FF8D1CFDFFFF DEC DWORD [EBP+FFFFFD1C]
0167:004019CD 8D45EC LEA EAX,[EBP-14]
0167:004019D0 BA02000000 MOV EDX,02
0167:004019D5 E8A6415A00 CALL 009A5B80
0167:004019DA 66C78510FDFFFF44+MOV WORD [EBP+FFFFFD10],44
0167:004019E3 8B0DB4C2BD00 MOV ECX,[00BDC2B4]
0167:004019E9 8B09 MOV ECX,[ECX]
0167:004019EB B201 MOV DL,01
0167:004019ED A1CC05B200 MOV EAX,[00B205CC]
0167:004019F2 E8411A3800 CALL 00783438
0167:004019F7 8B15A838BD00 MOV EDX,[00BD38A8]
0167:004019FD 8902 MOV [EDX],EAX
0167:004019FF A1A838BD00 MOV EAX,[00BD38A8]
0167:00401A04 8B00 MOV EAX,[EAX]
0167:00401A06 E857805A00 CALL `VCL50!@Forms@TCustomForm@Show$qqrv`
0167:00401A0B 8B15A838BD00 MOV EDX,[00BD38A8]
0167:00401A11 8B02 MOV EAX,[EDX]
0167:00401A13 8B10 MOV EDX,[EAX]
0167:00401A15 FF9280000000 CALL NEAR [EDX+80]
0167:00401A1B 8B0DB4C2BD00 MOV ECX,[00BDC2B4]
0167:00401A21 8B01 MOV EAX,[ECX]
0167:00401A23 E8627F5A00 CALL `VCL50!@Forms@TApplication@Initialize$qqrv`
0167:00401A28 B201 MOV DL,01
0167:00401A2A A1F8B6BD00 MOV EAX,[00BDB6F8]
USB軟體狗的設計及反破解技術
資料源自: 香港IT網
地址: http://www.hkitn.com/article.php/4677
如有侵犯智慧財產權,請告知。
USB軟體狗的設計及反破解技術
摘要:介紹了軟體狗技術的發展,提出了一種改進的低成本USB軟體狗的設計方案,分析了常見的加解密技術,並據此提出了一系列反破解措施。
關鍵字: USB 軟體狗 加解密技術 反破解
1 軟體狗技術
近年來,軟體狗技術在保護軟體發展者利益、防止軟體盜版方面起了很大作用。軟體狗技術屬於硬加密技術,它具有加密強度大、可靠性高等特點,已廣泛應用於電腦軟體保護。軟體狗技術的發展經歷了多次更新換代。第一代軟體狗通過短接並行口的某兩根線,或者再加上一些電阻、電容、二極體等實現;第二代軟體狗採用邏輯門電路跨接在並行口上,並採取適當的措施儘量避免軟體狗和印表機之間的相互干擾;第三代軟體狗的核心晶片是EEPROM,主機通過並行口直接讀寫EEPROM以實現對加密資訊的存取;第四代軟體狗以微控制器和EEPROM為核心器件,又稱微狗,它具有一定的智慧,應用靈活性和抗破解能力都得到了很大提高。
傳統的軟體狗通過在並行口上附加一定的電路實現,而並行口本身的特點限制了傳統軟體狗技術的進一步發展。由於並行口本身沒有電源線,所以傳統的並行口軟體狗都是通過各種"偷電"技術從資料線或控制線獲得軟體狗電路所需的電源,其電路必須選用規模不大的低功耗元器件。在負載能力很低的並行口上,並行口軟體狗難以保證正常工作。由於並行口是為連接單個設備設計的,在連接多個設備時很難避免衝突,傳統的並行口軟體狗必須仔細考慮與印表機之間的相容性問題。特別是對於一些非標準介面的並行口設備,就更難解決衝突問題。這些都使並行口軟體狗技術的發展受到了很大限制。
USB是在1994年底由Compaq、IBM、Microsoft等多家公司聯合提出的一種連接外部設備的新型的通用串列介面技術,它具有真正的即插即用和熱插拔功能,理論上可支援多達127個不同外設的同時連接。USB是一種先進的很有前途的介面標準,隨著USB介面器件的發展,使用USB介面的設備會越來越多。USB介面本身具有電源線,可為外設提供穩定可靠的工作電源,從而對USB軟體狗所用元器件的工作電壓、功耗等的要求大大降低,軟體狗的工作條件得到很大改善,更容易實現複雜、靈活的設計和電路的微型化。由於USB是為連接多個設備而設計的,有著嚴格的規範,從介面本身避免了設備間的衝突,只要遵循USB介面規範,USB軟體狗不但不會對別的USB設備產生影響,也不會受到別的USB設備的影響。與並行口相比,USB介面更適合於軟體狗技術。
2 USB軟體狗的硬體
在本設計中,所使用的微控制器是CY7C63100A/CY7C63101A。它是CYPRESS公司生產的8位元精簡指令集(RISC)的OTP型微控制器。它集成有1.5Mbps的USB串列介面引擎(SIE)(即USB收發器),具有128位元組的片內RAM、2/4K位元組的程式存儲空間,片內還具有一個自由執行的8位計時器、一個看門狗計時器和內部上電重定電路,它的指令集專門為開發USB應用進行了優化。該控制器擁有兩個輸入輸出埠、16根通用I/O線,且每根線均可作為中斷源。埠1的所有引腳都帶有可編程驅動器,可以直接驅動LED發光。該控制器的操作電壓為4.0~5.25V,它需要6MHz的外部陶瓷共振器,片內操作時鐘為12MHz。
CY7C63100A/CY7C63101A是低速USB外設的低成本解決方案,符合USB1.1規範,支援1個設備位址和2個端點(一個控制端點和一個資料端點)。
本設計中所使用的記憶體是24C02,它是帶有硬體防寫功能的串列EEPROM,其介面相容I2C匯流排規範,通過一對串列時鐘、資料線對片內存儲單元進行讀寫。24C02的片內記憶體容量為2K位元(或256位元組)。
本文設計的USB軟體狗的硬體電路圖如圖1所示。其核心器件是微控制器(可根據需要選用CY7C63100A或CY7C63101A,其區別為程式記憶體的空間不同,分別為2K位元組和4K位元組)和串列EEPROM(24C02),各元件的具體參數如圖1所示。
微控制器的第15(D-)、16(D+)腳分別連接USB連接器的第2(D-)、3(D+)腳,提供微控制器和主機之間資訊交換的電信號通道,其中第15引腳(D-)所接的7.5kΩ的上拉電阻是為了滿足USB規範的要求。微控制器通過USB介面與主機進行資訊交換。
微控制器的第20腳(P1.1)經過10KΩ的上拉電阻連接24C02的第7腳(WP,防寫),控制24C02的寫操作使能。當WP為高電平(Vcc)時,只能讀取24c02的內容而不能對其進行寫入;當WP為低電平(Vss)時,則可以進行讀、寫操作。設定防寫功能,可以防止記憶體內容被意外改寫。微控制器的第19腳(P1.3)連接24c02的第6腳(SCL,串列時鐘),為控制24C02的讀寫操作提供時鐘;微控制器的第18腳(P1.5)經過10KΩ的上拉電阻接24C02的第5腳(SDA,串列資料、位址),作為讀寫24C02的資料、位址信號線。微控制器通過這三根信號線完成對24C02的讀寫操作,對24C02的讀寫控制滿足I2C匯流排規範。
3 USB軟體狗的軟體
USB軟體狗的軟體包括主機軟體和微控制器中的軟體(固件)。主機軟體和固件相配合,協同完成主機與USB軟體狗間的資訊交換。其中,微控制器中的固件主要完成與USB主機的通信(包括參與USB匯流排設備枚舉、USB軟體狗的自身標識等)、對24C02的讀寫操作、與主機程式相配合實現和主機程式間的資料交換等任務。微控制器程式的簡化軟體框圖如圖2所示。
3.1 USB設備枚舉
USB軟體狗插入主機後,主機發現USB軟體狗,在執行USB重定操作後,主機使用預設位址(位址0)向USB軟體狗發出設備描述符請求,USB軟體狗向主機返回自己的設備描述符作為回應;接收到要求的設備描述符後,主機為新發現的USB軟體狗指定一個新的USB位址;然後,主機使用新的USB位址重新向USB軟體狗發送一個設備描述符請求,USB軟體狗向主機返回自己的設備描述符作為回應。主機向USB軟體狗發送配置描述符請求,USB軟體狗從程式存儲空間中取出相應的描述符並返回給主機。當主機接收到所有的描述符後,USB設備枚舉過程即告結束。至此,主機已完全瞭解USB軟體狗的資源要求、端點類型和性能等特性。
3.2 USB軟體狗和主機間的資料交換
由於CY7C63100A/CY7C63101A只提供兩個USB端點:端點0和端點1。端點1只能發送資料而不能接收資料,所以不適合USB軟體狗的互動式資料交換的要求,故只有使用端點0與主機進行資料交換。
USB共支援四種類型的傳輸:等時傳輸、中斷傳輸、控制傳輸和批量傳輸。要求恒定的連續傳輸速率的即時應用程式一般都採用等時傳輸方式。等時傳輸要求及時地提供資料,且對資料的正確性要求不高而對時間極為敏感,所以在等時傳輸中,資料的有效性不能保證。在傳送資料發生錯誤時,USB並不處理這些錯誤,而是繼續傳送新的資料。中斷傳輸方式總是用於對設備的查詢,以確定設備是否有資料需要傳輸。因此中斷傳輸的方向總是從USB設備到主機,傳送的資料量很小。但這些資料需要及時處理,以達到即時效果。控制傳輸提供了一種方法來配置USB設備,並對它操作的某些方面進行控制。每個設備都必須實現一個缺省的控制端點(端點0),控制端點用來配置設備、控制設備狀態以及設備操作的其他方面,包括設備控制指令、設備狀態查詢及確認命令。批量傳輸適用於對資料的正確性要求很高、而對資料傳輸速率沒有特殊要求的設備。
除缺省的針對端點0的控制傳輸外,對於其他三種傳輸方式,端點的傳輸方式一旦確定,則該端點在此配置下只能進行某一特定方向上的資料傳輸,而不可以在通信過程中改變傳輸方向,除非重新選擇配置。對於USB軟體狗應用,由於USB軟體狗與主機間要不斷地相互進行資料交換,且每次所需要交換的資料量不大,故選用控制傳輸方式。
控制傳輸至少由兩個階段組成,也有可能是三個階段。建立階段--控制傳輸總是從建立階段開始,在本階段主機向目標設備傳送資訊,定義對USB設備的請求類型(例如讀設備描述符)。資料階段--這個階段僅僅是因要求資料傳輸的請求定義的。例如,在資料階段,讀描述符的請求把描述符的內容發送給主機。狀態階段--這個階段用來報告所請求的操作的結果。控制傳輸從建立階段開始,它包含8位元組的資訊包。這個8位元組的資訊包定義了在控制傳輸的資料階段所傳輸的資料數量。在資料階段,資訊包的最大資料載荷限制為64位元組。對於本設計,由於CY7C63100A/CY7C63101A的端點0只提供了8位元組的FIFO緩衝區,故最大資訊包只能取8位元組。如果有更多的資料需要傳輸,可以分多次完成。控制傳輸參與錯誤檢測和恢復機制,努力提供一種最大限度的恢復,以保證資料的完整性。
USB設備枚舉過程結束後,並沒有立即開始工作,必須由主機根據在枚舉階段所獲得的資訊對USB設備進行配置。配置完成後,USB設備才進入工作狀態。此後,主機就可以與USB設備進行資料交換了。
主機與USB軟體狗間的資料交換過程均由主機方發起,每一次資料交換都由完整的控制傳輸完成。在控制傳輸的建立階段,主機向USB軟體狗發送8位元組的資訊包,通過用戶自定義的請求類型欄位規定USB軟體狗對後續資料應進行的處理,或要求USB軟體狗向主機返回特定的資訊。在資料階段,USB軟體狗接收指定資料或按要求向主機發送相應資料。控制傳輸的狀態階段指示本次資料傳輸的結果狀態,以確定本次交互是否正確完成。
3.3 讀寫24C02
為防止24C02的內容意外改變(例如,由於強干擾或不規範操作等),在不進行寫操作時,應使WP引腳保持為高電平,即P1.1保持為高電平。在進行寫操作時使WP變低,並一直保持到寫操作完成。寫操作完成後立即恢復WP為高電平。對24C02具體的讀寫操作符合I2C匯流排規範,很多相關書籍都有具體的實例程式,本文不再贅述。
為安全起見,記憶體24C02中的資料應採用加密後的形式存放。
4 軟體狗反破解技術
針對軟體狗的破解方法主要有兩種:硬體方法和軟體方法。
軟體狗的硬體破解方法,主要是仿製軟體狗的硬體電路。這個方法對付早期的軟體狗比較有效。當微狗出現後,由於很多微控制器本身都提供了程式碼保護功能,這使得仿製軟體狗特別是獲取固件變得越來越困難,這種方法現在已經很少使用。還有一種硬體破解方法是使用邏輯分析儀或軟體攔截I/O,記錄下軟體狗與主機軟體間所傳送的資料並進行分析以找出規律。這對於一些簡單的軟體狗比較有效,而對於演算法眾多、交互資料量很大的軟體狗,這種方法所帶來的繁雜性可想而知。USB通信規程本身相當複雜,這也大大提高了對USB軟體狗進行資料攔截的破解方法的難度。
現在,更加常用的軟體狗破解方法主要集中在軟體方面,並有軟體類比、跟蹤分析等方法。
軟體類比,就是先啟動I/O攔截軟體,然後在有軟體狗的情況下啟動受保護軟體,並對受保護軟體的每一個功能都進行試執行;同時,後臺的I/O攔截軟體記錄下受保護軟體與軟體狗之間交互的資料供以後使用。記錄完成後,只需在啟動受保護軟體前先啟動類比軟體,就可以使受保護軟體在沒有軟體狗的情況下也可以正常執行。在受保護軟體執行過程中,當它企圖與軟體狗進行通信時,後臺的類比軟體攔截到該通信請求,根據先前記錄下的資料對真實軟體狗進行仿真,使受保護軟體誤認為軟體狗確實存在。對於軟體狗和受保護軟體間通信資料不變的情形,軟體類比方法十分有效;但如果通信資料中含有隨機性的參數(例如,系統的當前時間),那麼軟體狗和受保護軟體間所交互的資料就各不相同,在這種情況下,軟體類比方法就顯得無能為力了。例如,主機軟體可以取系統當前時間送給軟體狗,軟體狗使用一定的規則對其進行變換,並把結果送回主機軟體,主機軟體用同樣的規則對上述時間值進行同樣的變換,檢查變換後的結果是否一致。這裏需要有好的變換演算法,使變換結果對參數的各個部分的改變很敏感且程度相似。或者,軟體狗和受保護軟體間遵循一定的通信協定(當然是不公開的),所傳輸的資料中含有大量隨機的無用資訊,而根據該通信協定,軟體狗和受保護軟體都可以從中提取出有效的資訊。
在各種軟體狗的軟體破解方法中,以跟蹤分析方法的威力最為強大,具體的有靜態分析和動態跟蹤等方法。
靜態分析方法是用一些靜態反彙編、反編譯工具對受保護軟體進行逆向分析,以求找出訪問軟體狗的代碼並進行相應的修改。如果預先對受保護軟體的程式碼採用一定的變換(可以取軟體狗中的資料作為變換參數),在執行時再進行反變換動態生成將要執行的代碼,就可以有效地對抗靜態分析方法。還可以使用可執行檔壓縮工具對受保護軟體進行壓縮處理,或採用軟體加殼工具對其進行處理等,這些都可以有效地對付靜態分析法。另外,如果把主機軟體的內部函數調用與外殼加密相結合,則可進一步提高加密強度,即使軟體的外殼被破除,也仍然不能正常執行。
動態跟蹤破解法不僅可以用於軟體狗破解,還可以用來獲取一些軟體的註冊序列號,取消軟體的試用期限制、試用次數限制和解鎖試用版軟體等。這種方法是使用一些調試分析工具軟體(如DEBUG,SOFTICE等),控制受保護軟體的整個執行過程,找出它與軟體狗間交互部分的代碼並進行修改,以使其跳過對軟體狗的檢測或使檢測結果無效。該破解方法的使用者往往都具有相當豐富的破解經驗,對各種加解密方法瞭若指掌,這種方法也需要破解者付出很大的精力。對付這種暴力破解方法,主要就是設定跟蹤陷阱、使用大量各不相同的加密演算法並大量分散地設定對軟體狗的訪問、分離對軟體狗的檢測命令和對結果的判斷等,目的就是加大跟蹤分析的工作量、擾亂破解者的思路,大量消耗其體力和腦力,最終達到使其知難而退。動態跟蹤法的一種很有效的對策是限定主機軟體與軟體狗間交互操作執行的時間。如果軟體狗發現某個操作的執行時間超出設定的值(時間閘),則不作回應或送回錯誤的回應以迷惑破解者。這是由於對於同樣的操作,動態跟蹤所需要的執行時間常常要遠大于正常連續執行所需要的時間。在主機軟體中也可以設定時間閘,但與在軟體設中放置時間閘相比它更容易受到攻擊而失效,效果不太好。主機軟體也可以接管作業系統的調試函數或檢測某些調試軟體的存在,一旦發現自身在調試狀態下執行,就立即退出執行或使程式不正常執行以迷惑破解者;也可以通過縮短軟體升級的週期來使解密者疲于應付。靜態分析和動態跟蹤方法常常是相互配合使用的。與此對應,相應的反破解方法也是密切結合的。
軟體狗除用來進行軟體合法性檢驗外,還可以實現很多其他有用的功能。例如,可以在軟體安裝時把硬碟的產品序列號、CPU的產品序列號或者網卡的物理位址等硬體資訊寫入軟體狗,以後軟體在每次執行時都進行一致性檢測以判斷本次執行機器和安裝時所用機器是否為同一台機器,這樣就可以實現軟體對執行機器的限制。也可以利用軟體狗中的計時器和記憶體實現更加安全的軟體試用期和使用次數等功能。
從微狗開始,軟體狗就引入了微控制器技術,這大大提高了軟體狗技術實現的靈活性;USB介面為軟體狗提供了一個理想的工作環境,使軟體狗硬體所受的限制大大降低;現代密碼技術的發展也為軟體狗技術提供了更加廣闊的發展空間。作為USB技術和軟體狗技術相結合的產物,USB軟體狗技術無疑會具有十分強大的生命力。
2010年5月6日 星期四
Fibonacci數列
在第一個月時,只有一對小兔子,過了一個月,那對兔子成熟了,在第三個月時便生下一對小兔子,這時有兩對兔子。再過多一個月,成熟的兔子再生一對小兔子,而另一對小兔子長大,有三對小兔子。如此推算下去,我們便發現一個規律:
時間(月) 初生兔子(對) 成熟兔子(對) 兔子總數(對)
1 1 0 1
2 0 1 1
3 1 1 2
4 1 2 3
5 2 3 5
6 3 5 8
7 5 8 13
8 8 13 21
9 13 21 34
10 21 34 55
由此可知,從第一個月開始以後每個月的兔子總數是:
1,1,2,3,5,8,13,21,34,55,89,144,233…
若把上述數列繼續寫下去,得到的數列便稱為斐波那契數列。
數列中每個數便是前兩個數之和,而數列的最初兩個數都是1。
若設 F0=1, F1=1, F2=2, F3=3, F4=5, F5=8, F6=13...
則:當n>1時,Fn+2 = Fn+1 + Fn,而 F0=F1=1。
下面是一個古怪的式子:

利用斐波那契數列來做出一個新的數列:方法是把數列中相鄰的數字相除,以組成新的數列如下:

