160個crackme之004

還是下定決心好好做一波crackme

逆向的新手,寫個博客記錄一下自己的學習經歷和crack思路

---------------------------------------------------華麗麗的分割線-------------------------------------------------

0X00  首先查殼,觀察到沒有殼並且是delphi語言編寫的

還是打開軟件,可是發現並沒有確認按鈕。。

鼠標移動到文本框當中發現提示:註冊成功時會在下面出現一張照片。

先簡單猜測一下程序的執行流程,既然沒有確認按鈕,那麼可能對於某一個name

當輸入serial的時候會進行判斷是否符合正確的結果,符合的話輸出照片,不符合的話進入死循環。

好的那麼接下來就要開始搞了。

0X01  接着考慮爆破程序。

第一點考慮的就是既然沒有加殼那麼很有可能能搜索到字符串,於是OD中搜索

嗯,發現了關鍵的語句,跟進以後找到了關鍵代碼。

接着下斷點,根據剛纔的猜測,輸入name後在輸入serial、點擊下面圖片時觸發了斷點

接着改變標誌位繞過判斷,最終出現了照片

這樣爆破就完成了。

0X02  那麼我們怎麼樣知道正確的serial呢?

由於對Delphi不熟悉,因此網上查了一下大佬們在逆Delphi時的各種姿勢。

發現了一個很好用的工具Dede,於是下載下來然後拖入程序進行分析。

發現過程窗口裏面有chkcode事件,這就很有可能是我們要找的計算序列號的函數了,查看RVA是00457C40

那麼在OD當中  ctrl+G 找到這個位置

嗯,看了一下邏輯沒有什麼問題

00457C40  /.  55            push ebp
00457C41  |.  8BEC          mov ebp,esp
00457C43  |.  51            push ecx
00457C44  |.  B9 05000000   mov ecx,0x5
00457C49  |>  6A 00         /push 0x0
00457C4B  |.  6A 00         |push 0x0
00457C4D  |.  49            |dec ecx
00457C4E  |.^ 75 F9         \jnz short CKme.00457C49                 ;  循環了5次,並沒有看出來意義是什麼。。
00457C50  |.  51            push ecx
00457C51  |.  874D FC       xchg [local.1],ecx
00457C54  |.  53            push ebx
00457C55  |.  56            push esi
00457C56  |.  8BD8          mov ebx,eax
00457C58  |.  33C0          xor eax,eax
00457C5A  |.  55            push ebp
00457C5B  |.  68 3D7E4500   push CKme.00457E3D
00457C60  |.  64:FF30       push dword ptr fs:[eax]
00457C63  |.  64:8920       mov dword ptr fs:[eax],esp
00457C66  |.  8BB3 F8020000 mov esi,dword ptr ds:[ebx+0x2F8]         ;  經過分析,esi裏存了name的長度
00457C6C  |.  83C6 05       add esi,0x5                              ;  esi+5
00457C6F  |.  FFB3 10030000 push dword ptr ds:[ebx+0x310]
00457C75  |.  8D55 F8       lea edx,[local.2]
00457C78  |.  8BC6          mov eax,esi
00457C7A  |.  E8 85FEFAFF   call CKme.00407B04
00457C7F  |.  FF75 F8       push [local.2]
00457C82  |.  FFB3 14030000 push dword ptr ds:[ebx+0x314]            ;  ascii  dseloffc-012-OK
00457C88  |.  8D55 F4       lea edx,[local.3]
00457C8B  |.  8B83 D4020000 mov eax,dword ptr ds:[ebx+0x2D4]
00457C91  |.  E8 B2B6FCFF   call CKme.00423348
00457C96  |.  FF75 F4       push [local.3]                           ;  ascii   111
00457C99  |.  8D83 18030000 lea eax,dword ptr ds:[ebx+0x318]
00457C9F  |.  BA 04000000   mov edx,0x4
00457CA4  |.  E8 93BFFAFF   call CKme.00403C3C
00457CA9  |.  33D2          xor edx,edx
00457CAB  |.  8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CB1  |.  E8 AAB5FCFF   call CKme.00423260
00457CB6  |.  8B93 18030000 mov edx,dword ptr ds:[ebx+0x318]         ;  ascii  黑頭Sun Bird8dseloffc-012-OK111
00457CBC  |.  8B83 F4020000 mov eax,dword ptr ds:[ebx+0x2F4]
00457CC2  |.  E8 B1B6FCFF   call CKme.00423378


這裏就是分析之後的結果,先計算name的長度,然後加5,之後與指定字符串進行拼接,最後結尾接上name。

這樣keygen編寫就很簡單了

#coding:gb18030

def keygen(name):
	serial=len(name)+5
	serial='黑頭Sun Bird'+str(serial)+'dseloffc-012-OK'+name
	print serial
	
name=raw_input('please input the name: ')
keygen(name)


隨便生成一個正確的name/serial組合

name:111

serial:黑頭Sun Bird8dseloffc-012-OK111

最終破解完成










發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章