|
論壇說明 |
歡迎您來到『史萊姆論壇』 ^___^ 您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的! 請點擊這裡:『註冊成為我們的一份子!』 |
|
主題工具 | 顯示模式 |
2003-12-18, 06:27 PM | #1 |
榮譽會員
|
crackme v1.0 written by cruehead/mid算法分析
破解人:sxssl[BCG][DFCG]
破解目標:crackme v1.0 written by cruehead/mid 簡要介紹:此crackme是非明碼比較的crackme,記憶體中嗅不到註冊碼,暴力破解非常容易,但如果想找到註冊碼則必須分析他的算法。這篇文章是為了應和「我要」的「算法註冊機編寫盲點」而作,總不能讓老大太孤獨了,當然又快一年了,就當作一年的學習總結和DFCG的作業吧,只是希望DFCG的老大們作業不要太多了,現在都提倡減負嘛,更何況我也是工作很忙且有孩子的的人了,2003.12.12是兒子滿週歲的日子,這篇文章也作為給兒子的特殊禮物吧,祝福他健康聰明。 工具:W32Dasm、Ollydbg109b、Windows 內已含有計算器 :00401213 6815214000 push 00402115---------------API函數 DialogBoxParamA參數入棧,傳遞參數 :00401218 FF35CA204000 push dword ptr [004020CA]---API函數 DialogBoxParamA參數入棧,傳遞參數 * Reference To: USER32.DialogBoxParamA, Ord:0000h | :0040121E E87D020000 Call 004014A0-------使用API函數 DialogBoxParamA獲取name和serial :00401223 83F800 cmp eax, 00000000---name沒有輸入則eax為0否則為1 :00401226 74BE je 004011E6---------eax為0跳則玩完 :00401228 688E214000 push 0040218E-------name入棧 :0040122D E84C010000 call 0040137E-------對name進行運算處理,運算程序見0040137E :00401232 50 push eax-----------eax中儲存對name進行運算的結果,入棧儲存 :00401233 687E214000 push 0040217E-------serial入棧 :00401238 E89B010000 call 004013D8-------對serial進行運算處理,運算程序見004013D8 :0040123D 83C404 add esp, 00000004 :00401240 58 pop eax-----------對name進行運算的結果出棧 :00401241 3BC3 cmp eax, ebx------比較name運算的結果和serial的結果是否相等 :00401243 7407 je 0040124C------相等則註冊成功,爆破只要將此處je改為jne即可 :00401245 E818010000 call 00401362 :0040124A EB9A jmp 004011E6 :0040137E 8B742404 mov esi, dword ptr [esp+04]-------name入esi :00401382 56 push esi--------------------------esi入棧即name入棧 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:00401392(U), :0040139A(U) | :00401383 8A06 mov al, byte ptr [esi]-------esi中name按順序入al :00401385 84C0 test al, al-------------------測試al是否為0,為0則表示name取完 :00401387 7413 je 0040139C---------name取完則跳到0040139C :00401389 3C41 cmp al, 41----------name中每一個字母的hex與hex 41比較 :0040138B 721F jb 004013AC---------大於則跳到004013AC :0040138D 3C5A cmp al, 5A----------name中每一個字母的hex與hex 5a比較 :0040138F 7303 jnb 00401394--------不大於則跳到00401394 :00401391 46 inc esi-------------esi加1,為取下一位作準備 :00401392 EBEF jmp 00401383---------沒有取完跳到00401383循環 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:0040138F(C) | :00401394 E839000000 call 004013D2-------call 004013D2將輸入的name小寫轉大寫 :00401399 46 inc esi-------------esi加1,為取下一位作準備 :0040139A EBE7 jmp 00401383--------沒有取完跳到00401383循環 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:00401387(C) | :0040139C 5E pop esi-----------esi儲存小寫轉大寫後的name,name出棧 :0040139D E820000000 call 004013C2-----call 004013C2求各個字母的hex之和 :004013A2 81F778560000 xor edi, 00005678--edi中儲存的累加結果與hex 5678作xor運算,edi 中儲存運算結果 :004013A8 8BC7 mov eax, edi-----edi中儲存的運算結果移入eax :004013AA EB15 jmp 004013C1-----運算結束後跳到004013C1 * Referenced by a CALL at Address: |:0040139D | :004013C2 33FF xor edi, edi--------edi清0 :004013C4 33DB xor ebx, ebx--------ebx清0 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004013CF(U) | :004013C6 8A1E mov bl, byte ptr [esi]-------esi中小寫轉大寫後name按順序入bl :004013C8 84DB test bl, bl-----------------測試ab是否為0,為0則表示name取完 :004013CA 7405 je 004013D1----------------name取完跳到004013D1 :004013CC 03FB add edi, ebx---------------ebx和edi相加後入edi,edi儲存累加結果 :004013CE 46 inc esi---------------esi加1,為取下一位作準備 :004013CF EBF5 jmp 004013C6----------沒有取完跳到004013C6循環 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004013CA(C) | :004013D1 C3 ret---------------累加計算完成後返回到00401399 * Referenced by a CALL at Address: |:00401394 | :004013D2 2C20 sub al, 20---------------name中每一個字母的hex 如果大於5a則減 hex 20 ,即小寫轉大寫 :004013D4 8806 mov byte ptr [esi], al---小寫轉大寫送入esi :004013D6 C3 ret-----------------------計算完成後返回到 ================================================================================================ :004013D8 33C0 xor eax, eax--------eax清0 :004013DA 33FF xor edi, edi--------edi清0 :004013DC 33DB xor ebx, ebx--------ebx清0 :004013DE 8B742404 mov esi, dword ptr [esp+04]-------serial入esi * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004013F3(U) | :004013E2 B00A mov al, 0A================ :004013E4 8A1E mov bl, byte ptr [esi] = :004013E6 84DB test bl, bl = :004013E8 740B je 004013F5 = :004013EA 80EB30 sub bl, 30 ======這一段是典型的dec轉hex,即將 :004013ED 0FAFF8 imul edi, eax = serial十進制數轉化成十六進位數 :004013F0 03FB add edi, ebx = :004013F2 46 inc esi = :004013F3 EBED jmp 004013E2============== * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004013E8(C) | :004013F5 81F734120000 xor edi, 00001234----edi中儲存的hex serial與hex 1234作xor運算 :004013FB 8BDF mov ebx, edi--------edi儲存的運算結果送入ebx :004013FD C3 ret---------------完成後返回到00401240 算法總結: crackme的算法是將輸入的姓名小寫轉大寫,大寫當然不用轉了,求各個字母的hex之和,把這個值xor 5678h得到一個結果。把輸入的序列號十進制轉化為十六進位,把十六進位值xor 1234h得到一個結果。兩個結果相等就註冊成功 crackme的keymaker註冊機源碼,keymaker1.73編譯通過: data: szHomePage db "http://www.jxlb.com",0 szEmail db "mailto:sxssl@163.com",0 szErrMess db "輸入的序列號不正確!",0 a1 db 20 dup (0) a2 db "%1u",0 code: XOR EDI,EDI XOR EBX,EBX mov esi,eax n1: MOV BL,BYTE PTR [ESI] test BL,BL JE n2 cmp bl,41h jb err1 cmp bl,5ah jnb n3 ADD EDI,EBX INC ESI JMP n1 n3: sub bl,20h MOV BYTE PTR DS:[ESI],BL jmp n1 n2: xor edi,5678h xor edi,1234h invoke wsprintf,addr a1,addr a2,edi lea eax,a1 err1: VB的源碼: Private Sub Command1_Click() a = UCase$(xm.Text) For i = 1 To Len(a) b = b + Asc(Mid$(a, i)) Next i d = b Xor &H5678 e = d Xor &H1234 sn.Text = e End Sub 補充:不知你的crackme是否有path過或作者的過錯,你太大意了,作者的想法你大概猜對了,但你很可能沒有認真偵錯,忽略了一些錯誤! 註冊碼和用戶名只對前10位有效(操作)--10位後會被忽略。 :0040138B 721F jb 004013AC---------大於則跳到004013AC <====更正:小於跳死。也就是排在大寫字母A之前的字串是非法字串 :0040138D 3C5A cmp al, 5A----------name中每一個字母的hex與hex 5a比較 :0040138F 7303 jnb 00401394--------不大於則跳到00401394 <====更正:大於或等於就跳處理。(大寫字母'Z'會被誤干) 引用:「crackme的算法是將輸入的姓名小寫轉大寫,大寫當然不用轉了,求各個字母的hex之和」,由於作者可能用MASM32 / TASM32做時沒有準確限制用戶名輸入一定在字母範圍,應改為「求各符合要求的字串的hex之和」 這是我更正你註冊機的錯誤,由於在你的基礎上改的,版權就放回給你!(我彙編不好,有機會還要像你請教#@#) VB我不懂,你自己檢自己囉! .data szHomePage db "http://www.jxlb.com",0 szEmail db "mailto:sxssl@163.com",0 szErrMess db "輸入的用戶名不合要求!",0 a1 db 20 dup (0) a2 db "%1u",0 .code XOR ECX,ECX XOR EDI,EDI XOR EBX,EBX mov esi,eax n1: MOV BL,BYTE PTR [ESI] test BL,BL JE n2 cmp CL,0ah JE n2 cmp bl,41h jb error cmp bl,5ah jnb n3 n4: ADD EDI,EBX INC ESI INC ECX JMP n1 n3: sub bl,20h MOV BYTE PTR DS:[ESI],BL jmp n4 error: lea eax,szErrMess test eax,eax jne undo n2: xor edi,5678h xor edi,1234h invoke wsprintf,addr a1,addr a2,edi lea eax,a1 undo: 廢話:現在的小孩子不能哄騙的,要是一天你的把柄在他手裡,那就折騰死你**** 附大小豬搞笑對白: 小豬:「爸爸,為什麼上個月那個人跟你來討錢?」 大豬:「你快告訴他沒有錢還他」 小豬:「這個月他又來跟你討錢,你又說沒有錢還他啊……」 大豬:「阿呀,爸爸要講信用嘛#@!¥%·(沒錢)」 小豬:「爸爸,為什麼人家的屋子這麼大,我們的屋子卻這麼小?」 大豬:「爸爸沒有錢嘛……」 小豬:「那要怎麼樣才能拿到大大的房子呢?」 大豬:「你要好好用功讀書,長大了之後賺多多的錢就可以住大大間的房子了!!!」 小豬:「那你為什麼小時候不好好地讀書~suuu?」 大豬氣得四腳朝天…………@*#¥% |
送花文章: 3,
|
|
|
相似的主題 | ||||
主題 | 主題作者 | 討論區 | 回覆 | 最後發表 |
系統 - 該記憶體不能為read或written的解決方案 | psac | 作業系統操作技術文件 | 5 | 2007-05-14 09:19 PM |
軟體 - 一個keyfile型的crackme的拆解 | psac | Hacker/Cracker 及加解密技術文件 | 0 | 2006-08-11 02:39 PM |
Hack Proofing Your Network-8 | mic64 | 網路軟硬體架設技術文件 | 0 | 2004-07-16 04:43 PM |
Hack Proofing Your Network | mic64 | 網路軟硬體架設技術文件 | 12 | 2004-06-21 03:28 PM |
菜鳥對Splish-crackme的算法分析 | psac | Hacker/Cracker 及加解密技術文件 | 0 | 2004-01-10 10:36 PM |