|
論壇說明 | 標記討論區已讀 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2006-01-15, 05:09 PM | #1 |
榮譽會員
|
輕鬆班主任的偵錯筆記[keyfile]
輕鬆班主任的偵錯筆記[keyfile]
【破文作者】 rdsnow[BCG][PYG][D.4s] 【作者主頁】 http://rdsnow.ys168.com 【 E-mail 】 rdsnow@163.com 【 作者QQ 】 83757177 【文章題目】 輕鬆班主任的偵錯筆記[keyfile] 【軟體名稱】 輕鬆班主任V4.4[個人版] 【下載位址】 http://www1.skycn.com/soft/15261.html ---------------------------------------------------------------------------------------------- 【加密方式】 keyfile 【破解工具】 ODbyDYK v1.10[05.09] 【軟體限制】 功能限制 【破解平台】 MicroSoft Windows XP SP2 ---------------------------------------------------------------------------------------------- 【軟體簡介】 對班主任的工作能系統地管理.包括學生的基本情況,考勤,成績,評語等,對班主任的計劃,總結,應有盡有,還收集了不少對班主任工作很有說明 的文章.盡可能地使班主任的工作變得輕鬆!操作方便,功能齊全,成績管理功能強大是本軟體的特點和優勢.如果你註冊成為了正式用戶,將一直可以免費昇級. ---------------------------------------------------------------------------------------------- 【文章簡介】 最近被外殼的ANTI搞的頭大,找個簡單的調整一下,這是一個典型的Keyfile保護的共享軟體,因為keyfile文件較短,難度不大,高手就忽略了,只是用來練手,通過這個程序瞭解一下破解kyefile的一般程序。 ---------------------------------------------------------------------------------------------- 【破解程序】 先脫掉程序的殼,Aspack 2.12的壓縮殼很容易搞定。 開啟程序的時候,同時開啟FileMon監視,顯示zuce.dat:File Not Found。從名字上猜想這就是註冊文件了, 於是在安裝目錄下偽造一個keyfile。取名為zuce.dat。跟蹤程序對該檔案的讀取動作。 00779961 |. 50 PUSH EAX 00779962 |. 8D45 F4 LEA EAX,[LOCAL.3] 00779965 |. B9 189A7700 MOV ECX,qsbzr.00779A18 ; ASCII "zuce.dat" 0077996A |. 8B15 64DC7800 MOV EDX,DWORD PTR DS:[78DC64] 00779970 |. E8 37B4C8FF CALL qsbzr.00404DAC ; 開啟keyfile 00779975 |. 8B45 F4 MOV EAX,[LOCAL.3] 00779978 |. B9 2C9A7700 MOV ECX,qsbzr.00779A2C ; ASCII "name" 0077997D |. BA 3C9A7700 MOV EDX,qsbzr.00779A3C 00779982 |. E8 59FDFFFF CALL qsbzr.007796E0 ; 讀取用戶名 00779987 |. 8B45 F8 MOV EAX,[LOCAL.2] 0077998A |. 8D55 FC LEA EDX,[LOCAL.1] 0077998D |. E8 46FCFFFF CALL qsbzr.007795D8 ; 算法Call,跟進 00779992 |. 8B45 FC MOV EAX,[LOCAL.1] 00779995 |. 50 PUSH EAX 00779996 |. 68 4C9A7700 PUSH qsbzr.00779A4C ; ASCII "123" 0077999B |. 8D45 F0 LEA EAX,[LOCAL.4] 0077999E |. 50 PUSH EAX 0077999F |. 8D45 EC LEA EAX,[LOCAL.5] 007799A2 |. B9 189A7700 MOV ECX,qsbzr.00779A18 ; ASCII "zuce.dat" 007799A7 |. 8B15 64DC7800 MOV EDX,DWORD PTR DS:[78DC64] 007799AD |. E8 FAB3C8FF CALL qsbzr.00404DAC ; 再次開啟keyfile 007799B2 |. 8B45 EC MOV EAX,[LOCAL.5] 007799B5 |. B9 589A7700 MOV ECX,qsbzr.00779A58 ; ASCII "code" 007799BA |. BA 689A7700 MOV EDX,qsbzr.00779A68 007799BF |. E8 1CFDFFFF CALL qsbzr.007796E0 ; 讀出keyfile中的假碼 007799C4 |. 8B55 F0 MOV EDX,[LOCAL.4] 007799C7 |. 58 POP EAX 007799C8 |. E8 DFB4C8FF CALL qsbzr.00404EAC ; 真假註冊比較 007799CD |. 75 04 JNZ SHORT qsbzr.007799D3 ; 爆破點 007799CF |. B3 01 MOV BL,1 ; 返回值=1 007799D1 |. EB 02 JMP SHORT qsbzr.007799D5 007799D3 |> 33DB XOR EBX,EBX ; 返回值=0 007799D5 |> 33C0 XOR EAX,EAX 原來的keyfile讀取資料不成功,這個keyfile不需要用WinHex產生,直接用記事本輸入一個txt文件,將副檔名改為dat,根據讀取資料的參數,結果一般的ini文件的格式,加上猜想,在記事本內輸入: [班主任] name=rdsnow[BCG][PYG][D.4s] [註冊] code=98765432-87654321-abcdefgh-hijklmno 這個格式我也是試了很多次才成功的。註冊碼的格式可以從0077998D處的CALL qsbzr.007795D8的返回結果可以看到。那裡返回的就是真碼。 ---------------------------------------------------------------------------------------------- 要知道註冊碼是怎樣得到的,跟進0077998D處的CALL qsbzr.007795D8: 007795D8 /$ 55 PUSH EBP 007795D9 |. 8BEC MOV EBP,ESP 007795DB |. B9 05000000 MOV ECX,5 007795E0 |> 6A 00 /PUSH 0 007795E2 |. 6A 00 |PUSH 0 007795E4 |. 49 |DEC ECX 007795E5 |.^ 75 F9 \JNZ SHORT qsbzr.007795E0 007795E7 |. 51 PUSH ECX 007795E8 |. 53 PUSH EBX 007795E9 |. 8BDA MOV EBX,EDX 007795EB |. 8945 FC MOV [LOCAL.1],EAX 007795EE |. 8B45 FC MOV EAX,[LOCAL.1] 007795F1 |. E8 5AB9C8FF CALL qsbzr.00404F50 007795F6 |. 33C0 XOR EAX,EAX 007795F8 |. 55 PUSH EBP 007795F9 |. 68 C7967700 PUSH qsbzr.007796C7 007795FE |. 64:FF30 PUSH DWORD PTR FS:[EAX] 00779601 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 00779604 |. 8D55 D4 LEA EDX,[LOCAL.11] 00779607 |. 8B45 FC MOV EAX,[LOCAL.1] 0077960A |. E8 2D04C9FF CALL qsbzr.00409A3C ; 對註冊碼進行格式校驗 0077960F |. 8B45 D4 MOV EAX,[LOCAL.11] 00779612 |. 8D55 D8 LEA EDX,[LOCAL.10] 00779615 |. E8 56BED3FF CALL qsbzr.004B5470 ; 算法,看輸超過範圍式,應該使用了MD5算法,跟進 0077961A |. 8D45 D8 LEA EAX,[LOCAL.10] 0077961D |. 8D55 F8 LEA EDX,[LOCAL.2] 00779620 |. E8 17BFD3FF CALL qsbzr.004B553C ; 將MD5輸出128位訊息轉為32個字元 00779625 |. 8D45 F4 LEA EAX,[LOCAL.3] 00779628 |. 50 PUSH EAX 00779629 |. B9 08000000 MOV ECX,8 0077962E |. BA 01000000 MOV EDX,1 00779633 |. 8B45 F8 MOV EAX,[LOCAL.2] 00779636 |. E8 85B9C8FF CALL qsbzr.00404FC0 ; 取前8個字元 0077963B |. 8D45 F0 LEA EAX,[LOCAL.4] 0077963E |. 50 PUSH EAX 0077963F |. B9 08000000 MOV ECX,8 00779644 |. BA 09000000 MOV EDX,9 00779649 |. 8B45 F8 MOV EAX,[LOCAL.2] 0077964C |. E8 6FB9C8FF CALL qsbzr.00404FC0 ; 取第9到16個字元 00779651 |. 8D45 EC LEA EAX,[LOCAL.5] 00779654 |. 50 PUSH EAX 00779655 |. B9 08000000 MOV ECX,8 0077965A |. BA 11000000 MOV EDX,11 0077965F |. 8B45 F8 MOV EAX,[LOCAL.2] 00779662 |. E8 59B9C8FF CALL qsbzr.00404FC0 ; 取第17到24個字元 00779667 |. 8D45 E8 LEA EAX,[LOCAL.6] 0077966A |. 50 PUSH EAX 0077966B |. B9 08000000 MOV ECX,8 00779670 |. BA 19000000 MOV EDX,19 00779675 |. 8B45 F8 MOV EAX,[LOCAL.2] 00779678 |. E8 43B9C8FF CALL qsbzr.00404FC0 ; 取第25到32個字元 0077967D |. FF75 F4 PUSH [LOCAL.3] 00779680 |. 68 DC967700 PUSH qsbzr.007796DC 00779685 |. FF75 F0 PUSH [LOCAL.4] 00779688 |. 68 DC967700 PUSH qsbzr.007796DC 0077968D |. FF75 EC PUSH [LOCAL.5] 00779690 |. 68 DC967700 PUSH qsbzr.007796DC 00779695 |. FF75 E8 PUSH [LOCAL.6] 00779698 |. 8BC3 MOV EAX,EBX 0077969A |. BA 07000000 MOV EDX,7 0077969F |. E8 7CB7C8FF CALL qsbzr.00404E20 ; 用"-"連接得到註冊碼 007796A4 |. 33C0 XOR EAX,EAX 007796A6 |. 5A POP EDX 007796A7 |. 59 POP ECX 007796A8 |. 59 POP ECX 007796A9 |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 007796AC |. 68 CE967700 PUSH qsbzr.007796CE 007796B1 |> 8D45 D4 LEA EAX,[LOCAL.11] 007796B4 |. E8 E7B3C8FF CALL qsbzr.00404AA0 007796B9 |. 8D45 E8 LEA EAX,[LOCAL.6] 007796BC |. BA 06000000 MOV EDX,6 007796C1 |. E8 FEB3C8FF CALL qsbzr.00404AC4 007796C6 \. C3 RETN ---------------------------------------------------------------------------------------------- 跟進00779615處的CALL qsbzr.004B5470 004B5470 /$ 55 PUSH EBP 004B5471 |. 8BEC MOV EBP,ESP 004B5473 |. 83C4 9C ADD ESP,-64 004B5476 |. 53 PUSH EBX 004B5477 |. 33C9 XOR ECX,ECX 004B5479 |. 894D 9C MOV [LOCAL.25],ECX 004B547C |. 894D A0 MOV [LOCAL.24],ECX 004B547F |. 8BDA MOV EBX,EDX 004B5481 |. 8945 FC MOV [LOCAL.1],EAX 004B5484 |. 8B45 FC MOV EAX,[LOCAL.1] 004B5487 |. E8 C4FAF4FF CALL qsbzr.00404F50 004B548C |. 33C0 XOR EAX,EAX 004B548E |. 55 PUSH EBP 004B548F |. 68 0B554B00 PUSH qsbzr.004B550B 004B5494 |. 64:FF30 PUSH DWORD PTR FS:[EAX] 004B5497 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP 004B549A |. 8D45 A4 LEA EAX,[LOCAL.23] 004B549D |. E8 A6FEFFFF CALL qsbzr.004B5348 ; MD5啟始化,進出可以看到MD5的四個常數 004B54A2 |. 8D45 A0 LEA EAX,[LOCAL.24] 004B54A5 |. B9 20554B00 MOV ECX,qsbzr.004B5520 ; ASCII "jltxgl" 004B54AA |. 8B55 FC MOV EDX,[LOCAL.1] 004B54AD |. E8 FAF8F4FF CALL qsbzr.00404DAC ; 用戶名後接字元串"jltxgl"得到S1 004B54B2 |. 8B45 A0 MOV EAX,[LOCAL.24] 004B54B5 |. E8 A6F8F4FF CALL qsbzr.00404D60 ; S1的長度 004B54BA |. 50 PUSH EAX 004B54BB |. 8D45 9C LEA EAX,[LOCAL.25] 004B54BE |. B9 30554B00 MOV ECX,qsbzr.004B5530 004B54C3 |. 8B55 FC MOV EDX,[LOCAL.1] 004B54C6 |. E8 E1F8F4FF CALL qsbzr.00404DAC ; 用戶名後接字元串"江龍工作室"得S2 004B54CB |. 8B45 9C MOV EAX,[LOCAL.25] 004B54CE |. E8 8DFAF4FF CALL qsbzr.00404F60 004B54D3 |. 8BD0 MOV EDX,EAX 004B54D5 |. 8D45 A4 LEA EAX,[LOCAL.23] ; MD5的四個常數 004B54D8 |. 59 POP ECX ; S1的長度 004B54D9 |. E8 9EFEFFFF CALL qsbzr.004B537C ; 對S2進行MD5運算,參數卻是S1的長度 004B54DE |. 8BD3 MOV EDX,EBX ; 上面可以簡單成實際只在用戶名後接了"江龍工" 004B54E0 |. 8D45 A4 LEA EAX,[LOCAL.23] 004B54E3 |. E8 14FFFFFF CALL qsbzr.004B53FC ; 標準MD5核心運算,沒有必要跟進了 004B54E8 |. 33C0 XOR EAX,EAX 004B54EA |. 5A POP EDX 004B54EB |. 59 POP ECX 004B54EC |. 59 POP ECX 004B54ED |. 64:8910 MOV DWORD PTR FS:[EAX],EDX 004B54F0 |. 68 12554B00 PUSH qsbzr.004B5512 004B54F5 |> 8D45 9C LEA EAX,[LOCAL.25] 004B54F8 |. BA 02000000 MOV EDX,2 004B54FD |. E8 C2F5F4FF CALL qsbzr.00404AC4 004B5502 |. 8D45 FC LEA EAX,[LOCAL.1] 004B5505 |. E8 96F5F4FF CALL qsbzr.00404AA0 004B550A \. C3 RETN ---------------------------------------------------------------------------------------------- 【破解心得】 從破解程序來看,對用keyfile保護的文件有下面一些建議。 1、keyfile的檔案名不要使用zhuce、reg、key等敏感的檔案名或副檔名,現在有一些作者將keyfile偽裝成DLL、exe、com等就是一個很好的做法。 2、keyfile的內容不要過於簡單,內容越多越好,並將關鍵訊息分開儲存在keyfile的各個不同地方。干擾偵錯者偽造。或者產生幾個不同的keyfile儲存在不同的地方。 3、keyfile內儲存的內容不要直接是明碼,文字,這樣會給偵錯者不少提示訊息。最好用戶名、機器碼、註冊碼等訊息要經過加密,讓偵錯者看到的是亂碼。 4、程序內分不同的地方不同的時刻對keyfile的不同的部分進行驗證,不要使用同一個驗證Call,比如開機時驗證keyfile的一部分,進入程序後再驗證其他部分。增加暴力修改點。 5、keyfile的位置也要隱蔽,不要總是放在程序安裝目錄內。 6、最後盡可能採取一些反跟蹤的手段組織程序被偵錯。 ---------------------------------------------------------------------------------------------- 【註冊機源碼】 Microsoft Visual C++ 6.0寫的MFC程序,使用網上下載MD5類,下載的類不同,用法也不大一樣。 void CMyDlg::OnOK() { // TODO: Add extra validation here //CDialog::OnOK(); unsigned char inbuff[512],outbuff[16]; int i,n; CString temp,MD5En; FILE *keyfile; //檢查輸入 UpdateData(true); n=m_Edit1.GetLength (); if(n==0){ MessageBox("★★★請輸入你的用戶名★★★","提示",MB_OK); return; } //MD5編碼,結果賦給MD5EN n+=6; memcpy(inbuff,m_Edit1+"江龍工",n); MD5_CTX context; context.MD5Update (inbuff,n); context.MD5Final (outbuff); for(i=0;i<16;i++){ temp.Format ("%02x",outbuff[ i]); MD5En += temp; } //插入'-'形成註冊碼 MD5En.Insert (8,'-'); MD5En.Insert (17,'-'); MD5En.Insert (26,'-'); //輸出註冊文件 keyfile=fopen("zuce.dat","w+t"); if(keyfile){ fwrite("[班主任]\nname=",1,14,keyfile); fwrite(m_Edit1,1,n-6,keyfile); fwrite("\n[註冊]\ncode=",1,13,keyfile); fwrite(MD5En,1,35,keyfile); fclose(keyfile); MessageBox(" ★註冊文件zuce.dat已經產生★\n\n★將該檔案拷貝到軟體安裝目錄完成註冊★","成功",MB_OK); } else MessageBox("註冊文件zuce.dat產生不成功,請重試一下","錯誤",MB_OK); } |
__________________ |
|
送花文章: 3,
|