史萊姆論壇

返回   史萊姆論壇 > 教學文件資料庫 > Hacker/Cracker 及加解密技術文件
忘記密碼?
論壇說明 標記討論區已讀

歡迎您來到『史萊姆論壇』 ^___^

您目前正以訪客的身份瀏覽本論壇,訪客所擁有的權限將受到限制,您可以瀏覽本論壇大部份的版區與文章,但您將無法參與任何討論或是使用私人訊息與其他會員交流。若您希望擁有完整的使用權限,請註冊成為我們的一份子,註冊的程序十分簡單、快速,而且最重要的是--註冊是完全免費的!

請點擊這裡:『註冊成為我們的一份子!』

Google 提供的廣告


 
 
主題工具 顯示模式
舊 2003-12-18, 06:27 PM   #1
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設 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?」

大豬氣得四腳朝天…………@*#¥%
psac 目前離線  
送花文章: 3, 收花文章: 1631 篇, 收花: 3205 次
 


主題工具
顯示模式

發表規則
不可以發文
不可以回覆主題
不可以上傳附加檔案
不可以編輯您的文章

論壇啟用 BB 語法
論壇啟用 表情符號
論壇啟用 [IMG] 語法
論壇禁用 HTML 語法
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用

相似的主題
主題 主題作者 討論區 回覆 最後發表
系統 - 該記憶體不能為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


所有時間均為台北時間。現在的時間是 07:28 AM


Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.


SEO by vBSEO 3.6.1