加密算法運用不當的後果
lnn1123[BCG][DCM][DFCG][D.4s]
看題目就知道這次的目標軟件裏用到了加密算法,哈哈,現在的軟件用加密算法的真的是不少,軟件作者已經不象以前那樣的不重視加密軟件了,但是用加密算法失敗的例子也有不少的哦,這期我爲大家帶來的就是運用不好的加密算法,現在的軟件很多是加的猛殼或者什麼變態的加密算法,使得小菜門看了就跑,爲了給大家學習破解的信心,我帶了一個擊敗加密算法的例子.
軟件介紹:
房地產開發項目經濟評價可行性研究及概預決算管理系統 專業版 6.36,可實現項目成本(造價)、銷售收入、投資計劃、資金籌措計劃、土地拍賣多方案經濟分析、敏感性分析(風險性分析)電算化,可以以最快速度準確地計算出項目的造價(成本)、銷售收入計算、投資計劃、資金籌措計劃、土地拍賣多方案經濟分析、敏感性分析(風險性分析)等有關數據,並可撰寫可行性報告,爲房地產開發或固定資產投資企業(單位)的項目投資決策,項目實施過程中成本覈算、成本控制和項目竣工後的財務決算提供依據,是土地拍賣招投標報價的好助手。
呵呵,軟件功能好像滿強大的,但是註冊算法的保護是不是很強大呢,
呵呵,軟件功能好像滿強大的,但是註冊算法的保護是不是很強大呢,
呵呵,軟件功能好像滿強大的,但是註冊算法的保護是不是很強大呢,初步觀察:
破解工具:
PEID 0.93
Ollydbg 1.10(下面簡稱OD)
這2個工具是每個喜歡破解的人必備的軟件啊
先用PEID看看有沒有加殼,現在的軟件加殼的真的是不少啊,查看情況如圖1所示
(圖1)
看到沒有殼,是delphi編寫的,情況還比較好哦 ^_^
運行軟件看看如圖2所示
(圖2)
發現窗口上方有”尚未註冊”的提示,看起來真的不爽啊,決定把它給幹了
跟蹤過程:
試着註冊一下
機器碼: ACA9B-B9EEC-324A3-02A00
註冊碼:78787878
點註冊後就是註冊失敗(如果不是建議買彩票 ^_^ )如圖3所示
(圖3)
剛纔看到有錯誤提示,那麼我的第一個想法就是找字符參考,用老羅大牛的插件(支持中文的哦)
Ultra String Reference,項目 2986
Address=0061C6A7
Disassembly=MOV EDX,EEV.0061C7D4
Text String=註冊失敗,請再次註冊!
現在好了,下斷在
0061C508 . 55 PUSH EBP //下斷處
0061C509 . 8BEC MOV EBP,ESP
0061C50B . 83C4 D4 ADD ESP,-2C
算法分析:
0061C592 . E8 3D56E6FF CALL EEV.00481BD4 ; 得到機器碼
0061C597 . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C] ; 機器碼
省略代碼。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
0061C5E4 . E8 EB55E6FF CALL EEV.00481BD4 ; 得到假碼
0061C5E9 . 8B55 F0 MOV EDX,DWORD PTR SS:[EBP-10] ; 假碼
0061C5EC . A1 D4D36C00 MOV EAX,DWORD PTR DS:[6CD3D4]
省略代碼。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
0061C618 . B8 A8C76100 MOV EAX,EEV.0061C7A8 ; ASCII "75EA2-2D12A-AA55A-FBCC7"
0061C61D . E8 9E88DEFF CALL EEV.00404EC0 ; 要進去,因爲涉及到註冊
0061C622 . 85C0 TEST EAX,EAX ;位測試
0061C624 . 74 0A JE SHORT EEV.0061C630 ;必須跳
0061C626 . E8 257DDEFF CALL EEV.00404350
0061C62B . E9 B3000000 JMP EEV.0061C6E3
0061C630 > 8D55 DC LEA EDX,DWORD PTR SS:[EBP-24] ; 機器碼
0061C633 . A1 10D76C00 MOV EAX,DWORD PTR DS:[6CD710]
0061C638 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0061C63A . E8 49B3F8FF CALL EEV.005A7988 ; 要跟進,對機器碼進行MD5運算
0061C63F . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
0061C642 . 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
0061C645 . E8 1A090000 CALL EEV.0061CF64 ; 產生的註冊碼,好像可以做內存註冊機哦
0061C64A . 8B45 EC MOV EAX,DWORD PTR SS:[EBP-14] ; MD5後的前8個字符連接,****-****這個樣子
0061C64D . 8B15 D4D36C00 MOV EDX,DWORD PTR DS:[6CD3D4] ; EEV.006CF42C
0061C653 . 8B12 MOV EDX,DWORD PTR DS:[EDX] ; 假碼
0061C655 . E8 6688DEFF CALL EEV.00404EC0 ; 重要CALL,要進去
0061C65A . 85C0 TEST EAX,EAX ;不能夠讓它返回EAX=0
0061C65C . 7E 2E JLE SHORT EEV.0061C68C ; 關鍵跳轉,跳就註冊失敗
0061C65E . 6A 40 PUSH 40 ;註冊成功的提示
0061C660 . 8D55 D8 LEA EDX,DWORD PTR SS:[EBP-28]
0061C663 . A1 24D86C00 MOV EAX,DWORD PTR DS:[6CD824]
0061C68C > 6A 10 PUSH 10 ; 註冊失敗的提示
0061C68E . 8D55 D4 LEA EDX,DWORD PTR SS:[EBP-2C]
0061C691 . A1 24D86C00 MOV EAX,DWORD PTR DS:[6CD824]
0061C696 . 8B00 MOV EAX,DWORD PTR DS:[EAX]
0061C698 . E8 AB73E8FF CALL EEV.004A3A48
省略代碼。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
比較的方式:
=============================== 進CALL EEV.00404EC0================================
00404EC0 /$ 85C0 TEST EAX,EAX ; 是否爲空
00404EC2 |. 74 40 JE SHORT EEV.00404F04
00404EC4 |. 85D2 TEST EDX,EDX ; 是否爲空
00404EC6 |. 74 31 JE SHORT EEV.00404EF9
00404EC8 |. 53 PUSH EBX
00404EC9 |. 56 PUSH ESI
00404ECA |. 57 PUSH EDI
00404ECB |. 89C6 MOV ESI,EAX
00404ECD |. 89D7 MOV EDI,EDX
00404ECF |. 8B4F FC MOV ECX,DWORD PTR DS:[EDI-4]
00404ED2 |. 57 PUSH EDI
00404ED3 |. 8B56 FC MOV EDX,DWORD PTR DS:[ESI-4]
00404ED6 |. 4A DEC EDX
00404ED7 |. 78 1B JS SHORT EEV.00404EF4
00404ED9 |. 8A06 MOV AL,BYTE PTR DS:[ESI] ; 取一個字節
00404EDB |. 46 INC ESI
00404EDC |. 29D1 SUB ECX,EDX ; 假碼的長度減運算得到的字符的長度
00404EDE |. 7E 14 JLE SHORT EEV.00404EF4 ; 假碼長度不能小於8位
00404EE0 |> F2:AE /REPNE SCAS BYTE PTR ES:[EDI] ; 串掃描
00404EE2 |. 75 10 |JNZ SHORT EEV.00404EF4
00404EE4 |. 89CB |MOV EBX,ECX
00404EE6 |. 56 |PUSH ESI ; 比較的參數
00404EE7 |. 57 |PUSH EDI ; 比較的參數
00404EE8 |. 89D1 |MOV ECX,EDX ; 比較的位數
00404EEA |. F3:A6 |REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:[ESI] ; 串比較
00404EEC |. 5F |POP EDI
00404EED |. 5E |POP ESI
00404EEE |. 74 0C |JE SHORT EEV.00404EFC ; 串比較是否相等
這裏比較的方式是串比較,這裏就是看看註冊碼是不是75EA2-2D12A-AA55A-FBCC7爲這個,註冊失敗,後面最後一次比較註冊碼也用到這個CALL
MD5計算過程:
======================進CALL EEV.005A7988==========================================
005A79AD |. E8 AEFEFFFF CALL EEV.005A7860 ; MD5常數初始化
005A79B2 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 機器碼
005A79B5 |. E8 C2D1E5FF CALL EEV.00404B7C ; 是否爲空
005A79BA |. 50 PUSH EAX
005A79BB |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
005A79BE |. E8 B9D3E5FF CALL EEV.00404D7C
005A79C3 |. 8BD0 MOV EDX,EAX
005A79C5 |. 8D45 A4 LEA EAX,DWORD PTR SS:[EBP-5C]
005A79C8 |. 59 POP ECX
005A79C9 |. E8 C6FEFFFF CALL EEV.005A7894 ; 標準的MD5運算
005A79CE |. 8BD3 MOV EDX,EBX
005A79D0 |. 8D45 A4 LEA EAX,DWORD PTR SS:[EBP-5C]
005A79D3 |. E8 3CFFFFFF CALL EEV.005A7914
005A79D8 |. 33C0 XOR EAX,EAX
005A79DA |. 5A POP EDX
005A79DB |. 59 POP ECX
005A79DC |. 59 POP ECX
005A79DD |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
005A79E0 |. 68 F5795A00 PUSH EEV.005A79F5
005A79E5 |> 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
005A79E8 |. E8 BFCEE5FF CALL EEV.004048AC
005A79ED /. C3 RETN
標準MD5的特徵:
==========================進CALL EEV.005A7860=====================================
005A7860 /$ C700 01234567 MOV DWORD PTR DS:[EAX],67452301 ; 標準MD5的四個常數
005A7866 |. C740 04 89ABCD>MOV DWORD PTR DS:[EAX+4],EFCDAB89
005A786D |. C740 08 FEDCBA>MOV DWORD PTR DS:[EAX+8],98BADCFE
005A7874 |. C740 0C 765432>MOV DWORD PTR DS:[EAX+C],10325476
005A787B |. 33D2 XOR EDX,EDX
005A787D |. 8950 10 MOV DWORD PTR DS:[EAX+10],EDX
005A7880 |. 33D2 XOR EDX,EDX
005A7882 |. 8950 14 MOV DWORD PTR DS:[EAX+14],EDX
005A7885 |. 83C0 18 ADD EAX,18
005A7888 |. BA 40000000 MOV EDX,40
005A788D |. E8 DA06E6FF CALL EEV.00407F6C
005A7892 /. C3 RETN
這段的功能就是把機器碼用MD5加密算法加密得到一個MD5值,結果爲16字節,機器碼: ACA9B-B9EEC-324A3-02A00
我這裏的機器碼MD5值是: d6d11c05c3b225b10d95ec54a4cd7f9c
轉化MD5:
=======================進CALL EEV.0061CF64=======================================
省略代碼。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
0061CF6D |. 33C9 XOR ECX,ECX
0061CF6F |. 894D D8 MOV DWORD PTR SS:[EBP-28],ECX ; 爲0
0061CF72 |. 894D E8 MOV DWORD PTR SS:[EBP-18],ECX
0061CF75 |. 894D DC MOV DWORD PTR SS:[EBP-24],ECX
0061CF78 |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX
0061CF7B |. 8BF0 MOV ESI,EAX
0061CF7D |. 8D7D EC LEA EDI,DWORD PTR SS:[EBP-14]
0061CF80 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; MD5產生的16個字節
0061CF81 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; MD5產生的16個字節
0061CF82 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; MD5產生的16個字節
0061CF83 |. A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] ; MD5產生的16個字節
省略代碼。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
0061CF9E |. E8 59AAF8FF CALL EEV.005A79FC ; MD5產生的16個字節
0061CFA3 |. 8B45 DC MOV EAX,DWORD PTR SS:[EBP-24] ; |MD5值
0061CFA6 |. 8945 E0 MOV DWORD PTR SS:[EBP-20],EAX ; |
0061CFA9 |. C645 E4 0B MOV BYTE PTR SS:[EBP-1C],0B ; |
0061CFAD |. 8D55 E0 LEA EDX,DWORD PTR SS:[EBP-20] ; |
0061CFB0 |. 33C9 XOR ECX,ECX ; |
0061CFB2 |. B8 5CD06100 MOV EAX,EEV.0061D05C ; |ASCII "%s"
0061CFB7 |. E8 6CDBDEFF CALL EEV.0040AB28 ; /轉化爲字符形式
0061CFBC |. 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18] ; 轉化爲字符
0061CFBF |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
0061CFC2 |. E8 39C3DEFF CALL EEV.00409300 ; MD5轉化後的字符小寫轉化爲大寫,跟進
0061CFC7 |. 8BC6 MOV EAX,ESI
0061CFC9 |. E8 DE78DEFF CALL EEV.004048AC
0061CFCE |. 33DB XOR EBX,EBX
0061CFD0 |> 85DB /TEST EBX,EBX
0061CFD2 |. 75 15 |JNZ SHORT EEV.0061CFE9
0061CFD4 |. 56 |PUSH ESI
0061CFD5 |. 8BD3 |MOV EDX,EBX
0061CFD7 |. C1E2 02 |SHL EDX,2
0061CFDA |. B9 04000000 |MOV ECX,4 ; 從首位開始,取4個
0061CFDF |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4] ; 轉化爲大寫的MD5字符
0061CFE2 |. E8 F57DDEFF |CALL EEV.00404DDC
0061CFE7 |. EB 2C |JMP SHORT EEV.0061D015
0061CFE9 |> FF36 |PUSH DWORD PTR DS:[ESI] ; 轉化爲大寫後的前4個字符
0061CFEB |. 68 68D06100 |PUSH EEV.0061D068
0061CFF0 |. 8D45 D8 |LEA EAX,DWORD PTR SS:[EBP-28]
0061CFF3 |. 50 |PUSH EAX
0061CFF4 |. 8BD3 |MOV EDX,EBX ; EDX=1
0061CFF6 |. C1E2 02 |SHL EDX,2 ; 左移2位得到4
0061CFF9 |. B9 04000000 |MOV ECX,4 ; 再取四個,從第四位開始
0061CFFE |. 8B45 FC |MOV EAX,DWORD PTR SS:[EBP-4] ; 轉化爲大寫的MD5字符
0061D001 |. E8 D67DDEFF |CALL EEV.00404DDC
0061D006 |. FF75 D8 |PUSH DWORD PTR SS:[EBP-28] ; 取的5-8位MD5字符
0061D009 |. 8BC6 |MOV EAX,ESI
0061D00B |. BA 03000000 |MOV EDX,3
0061D010 |. E8 277CDEFF |CALL EEV.00404C3C
0061D015 |> 43 |INC EBX ; 用"-"連接字符
0061D016 |. 83FB 02 |CMP EBX,2
0061D019 |.^75 B5 /JNZ SHORT EEV.0061CFD0
0061D01B |. 33C0 XOR EAX,EAX
0061D01D |. 5A POP EDX
0061D01E |. 59 POP ECX
0061D01F |. 59 POP ECX
0061D020 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0061D023 |. 68 4DD06100 PUSH EEV.0061D04D
0061D028 |> 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
0061D02B |. BA 02000000 MOV EDX,2
0061D030 |. E8 9B78DEFF CALL EEV.004048D0
0061D035 |. 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
0061D038 |. E8 6F78DEFF CALL EEV.004048AC
0061D03D |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0061D040 |. E8 6778DEFF CALL EEV.004048AC
字母轉化:
======================進CALL EEV.00409300===================================
00409329 |> 8B0424 /MOV EAX,DWORD PTR SS:[ESP] ;eax指向md5值
0040932C |. 8A00 |MOV AL,BYTE PTR DS:[EAX] ; 依次取MD5值的一個字節
0040932E |. 3C 61 |CMP AL,61 ; 大於97?
00409330 |. 72 06 |JB SHORT EEV.00409338 ; 不小於就是小寫字母了
00409332 |. 3C 7A |CMP AL,7A ; 是否大於122?
00409334 |. 77 02 |JA SHORT EEV.00409338 ; 大於就不是字母了
00409336 |. 2C 20 |SUB AL,20 ; AL=AL-0X20,小寫轉化爲大寫
00409338 |> 8B5424 04 |MOV EDX,DWORD PTR SS:[ESP+4]
0040933C |. 8802 |MOV BYTE PTR DS:[EDX],AL ; 保存
0040933E |. FF0424 |INC DWORD PTR SS:[ESP] ; 指針下移
00409341 |. FF4424 04 |INC DWORD PTR SS:[ESP+4]
00409345 |. 4B |DEC EBX ; 計數器減1
00409346 |. 85DB |TEST EBX,EBX ; 位測試
00409348 |.^75 DF /JNZ SHORT EEV.00409329 ; 循環轉化
這段的C語言表示:
int a,b;
for(a=0;a<strlen(md5_ID);a++)
{
b=md5_ID([a];
if(b>97 && b<122)
b=b-32;
md5_ID[a]=b
}
到這裏軟件的註冊算法已經很清楚了,什麼不清楚再看一次,
算法總結:
1;取得軟件的機器碼,用標準MD5加密一下得到一個值即爲MD5_SN,把MD5值轉化爲字符型,然後把小寫轉化爲大寫,結果爲SN
2;取SN(1-4),SN(5-8),就是取SN的前4位和SN的(5-8)位,用”-”連接,得到KEY,即註冊碼
算法就這樣,算法很失敗吧,MD5強大的作用好像沒發揮哦,^_^我的註冊信息:
機器碼: ACA9B-B9EEC-324A3-02A00
註冊碼: D6D1-11C0
這個軟件的加密方式是這樣的
If(md5(機器碼)=註冊碼)
註冊成功
Else
註冊失敗
這是使用MD5最失敗的方式;
註冊成功的截面如圖4所示:
圖(4)
註冊機也很簡單,代碼我就不弄上來,就一個MD5模塊,不然有騙稿費之嫌
我做的註冊機界面如圖(5):
圖(5)
聲明:筆者水平有限,如有錯誤請指出,請有能力的朋友支持國產軟件,本篇文章只交流技術,如果利用本文的相關技術去做違法的事本人概不負責.