1. 程式人生 > >160個crackme 持續更新(1\2\3\4\6)

160個crackme 持續更新(1\2\3\4\6)

最近感覺自己啥都不會吧,就算會也就是點皮毛,還是練的太少了,從160個crackme開始

慢慢來吧,從簡單的開始

1.Acid burn

OD動態除錯一下,靠字串定位打斷點,如下

跟進這個函式可以看到明文密碼

next

2.Afkayas.1

直接對著字串打斷點,爆破

試試看寫一下注冊機

因為這程式是用vb寫的,就沒法用IDA了,只能看一下彙編

先再次執行,搜尋字串下斷點,然後網上翻,慢慢找註冊碼生成的函式部分

註冊碼在這部分往下

可以看見先取出了我們的第一個字母

然後在這裡生成了一個數字,應該是對應我們的輸入會生成數字

我們繼續單步執行,在過程中8NC多次出現,目前還不知道是什麼意思

這裡密碼和我們之前對應生成的數字都出現了,然後底下會有一個strcat函式,會在數字前面加上AKA,那這裡應該是最後生成密碼的部分,那生成密碼的函式體就是在這一段區間裡了

那我們從402412push name開始分析,分析在註釋裡

這裡就已經是780368,那之後無非就是加上了一個AKA

keygen

s=input('your name:')
length=len(s)
a=ord(s[0])
length*=0x17CFB
a+=length
#print(a)
serial=''
serial+='AKA-'
serial+=str(a)
print(serial)

3.AfKayAs.2

這題一開始會有個nag視窗來耗費我們的時間,我們首先考慮怎麼去掉它

在OD裡可以看見,這個程式依然是一個vb程式,vb裡面有個消除nag視窗的方法叫做4C法,很神奇……本來想用resource_hacker的,但貌似vb不行

剛開始push的是4067D4,在資料視窗中往後移動4c

資料視窗處的值是406868,再次跟蹤過去

是不是覺得有重複段,這些段對應的就是載入視窗,每段的第24個位元組對應的是載入的順序,我們nag視窗的載入順序換到後面去,就可以直接忽略掉它了,我們把01和00互換就OK了

怎麼下斷點就不說了,我是靠字串的,暫停的效果我覺得差不多

爆破的話,找到這個關鍵語句就夠了

看一下怎麼實現註冊機

程式碼量真的挺大的,只能慢慢分析了,一層接一層,慢慢除錯到如下所示,開始分析

然後接下來一段和2的分析差不多

然後接下來繼續說慢慢除錯,看看有沒有別的計算

4082E6的時候我們之前的‘711224’又出現了

可以看到在40832D之後,711224變成了71126,我認為是有關係的,不然之前的一頓操作不是一點用都沒有麼

這裡首先要學習一些彙編語句了,我自己會變語句儲存量比較小的

FLD是Intel的指令集協處理器的彙編指令,FLD 指令用於把浮點數字傳送入和傳送出FPU暫存器

我們分析完後註釋如下

其實就是+2

繼續分析,在4083F2又出現了711226

這段操作其實就是*3-2,繼續分析

第三段應該是實在4084D4,2133676又出現了

這一段就是-(-15),圖上註釋原先做了,懶得改了,嗚嗚嗚嗚

keygen

s=input('your name:')
a=ord(s[0])
length=len(s)
length*=0x15B38
length+=a
print(length)
length+=2
print(length)
length*=3
print(length)
length-=2
print(length)
length+=15
print('your serial:%d'%length)

4.ajj

這題是2000年的,介紹如下

沒有確定鍵,一頭霧水

無殼,Delphi

在OD裡靠字串定位

然後慢慢往上找跳轉和判斷語句,爆破還是比較輕鬆的

結果如下

emmmm,朱茵可還行

接下來分析一下注冊機咋弄

之前已經定位過了爆破口,那註冊吧的判斷也在那塊函式體中,翻到最近的push ebp/mov ebp,esp開始分析,如下

這個程式剛開始有個分析可以直接試出來,程式的使用者名稱只能輸入12個字元,但註冊碼長度無限,繼續分析

00457FB8  /.  55            push ebp
00457FB9  |.  8BEC          mov ebp,esp
00457FBB  |.  B9 04000000   mov ecx,0x4                              ;  迴圈4次,不知道要幹嘛……
00457FC0  |>  6A 00         /push 0x0
00457FC2  |.  6A 00         |push 0x0
00457FC4  |.  49            |dec ecx
00457FC5  |.^ 75 F9         \jnz short CKme.00457FC0
00457FC7  |.  51            push ecx
00457FC8  |.  53            push ebx
00457FC9  |.  56            push esi
00457FCA  |.  8BF0          mov esi,eax                              ;  CKme.0045802B
00457FCC  |.  33C0          xor eax,eax                              ;  CKme.0045802B
00457FCE  |.  55            push ebp
00457FCF  |.  68 FD804500   push CKme.004580FD
00457FD4  |.  64:FF30       push dword ptr fs:[eax]
00457FD7  |.  64:8920       mov dword ptr fs:[eax],esp
00457FDA  |.  33DB          xor ebx,ebx
00457FDC  |>  8D55 F4       /lea edx,[local.3]
00457FDF  |.  8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
00457FE5  |.  E8 5EB3FCFF   |call CKme.00423348
00457FEA  |.  8B45 F4       |mov eax,[local.3]                       ;  使用者名稱壓入eax
00457FED  |.  E8 8ABBFAFF   |call CKme.00403B7C
00457FF2  |.  83C0 1E       |add eax,0x1E
00457FF5  |.  8D55 F8       |lea edx,[local.2]
00457FF8  |.  E8 07FBFAFF   |call CKme.00407B04
00457FFD  |.  FF75 F8       |push [local.2]                          ;  42
00458000  |.  8D55 F0       |lea edx,[local.4]
00458003  |.  8B86 D4020000 |mov eax,dword ptr ds:[esi+0x2D4]
00458009  |.  E8 3AB3FCFF   |call CKme.00423348
0045800E  |.  FF75 F0       |push [local.4]                          ;  壓入使用者名稱
00458011  |.  8D55 EC       |lea edx,[local.5]
00458014  |.  8BC3          |mov eax,ebx
00458016  |.  E8 E9FAFAFF   |call CKme.00407B04
0045801B  |.  FF75 EC       |push [local.5]                          ;  0
0045801E  |.  8D45 FC       |lea eax,[local.1]
00458021  |.  BA 03000000   |mov edx,0x3
00458026  |.  E8 11BCFAFF   |call CKme.00403C3C
0045802B  |.  43            |inc ebx                                 ;  ebx+=19
0045802C  |.  83FB 13       |cmp ebx,0x13
0045802F  |.^ 75 AB         \jnz short CKme.00457FDC
00458031  |.  81BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x85
0045803B  |.  75 76         jnz short CKme.004580B3

一頭霧水,不知道要幹嘛……看了一下堆疊如下

很神奇,就把字串拼了一下,最後判斷了一下,失敗是必然的,這咋註冊的……

往上看看,順便按照別的字串搜一下,還有一大堆像黑頭之類的

這個很值得懷疑,莫名其妙有個字串叫chkcode,如果是耍我們的,那隻能說混淆做得太好了,跟蹤一下,地址不清楚的話

dede一下,如下

地址在457C40,跟過去,重新執行程式,斷在該處

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]
00457C6C  |.  83C6 05       add esi,0x5
00457C6F  |.  FFB3 10030000 push dword ptr ds:[ebx+0x310]            ;  黑頭Sun Bird
00457C75  |.  8D55 F8       lea edx,[local.2]
00457C78  |.  8BC6          mov eax,esi
00457C7A  |.  E8 85FEFAFF   call CKme.00407B04
00457C7F  |.  FF75 F8       push [local.2]                           ;  17
00457C82  |.  FFB3 14030000 push dword ptr ds:[ebx+0x314]            ;  desloffc-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]                           ;  呼叫使用者名稱
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]         ;  黑頭Sun Bird17dseloffc-012-OKwoaixiaoyuyu

emmmm,最後生成了這麼個字串

執行一下程式,這的確是正確的字串,除了數字17,彼得都是記憶體中有的字串和我們輸入的使用者名稱,那我們只要分析出17怎麼來的就好了

可以看到前面有一個取字串長度再加5的操作,17就是這麼來的(漢字佔兩個字元)

keygen

s=input("Input your name(length<=12):")
key1='黑頭Sun Bird'
key2=str(len(s)+5)
key3='desloffc-012-OK'
key4=s
print('your serial:%s' %(key1+key2+key3+key4))

6.aLoNg3x.1

開啟這個crackme之後,我們無法輸入密碼,看一下about help

可以說要求是很多了,兩個按鈕被隱藏就會讓logo顯現出來

查一下殼,無殼,用dede看一下事件

NomeChange和CodeChange應該就是使用者名稱和註冊碼輸入的事件,可以找到相應的地址,在裡面還可以看見視窗資訊

可以看見Name的最大長度只能為10

這裡可以看見OK按鈕是不可按的,控制元件的事件基本屬性都可以直接看到,還是很方便的

對所有控制元件地址下斷點然後在OD裡進行除錯

這裡有個要注意的是,我在程式裡剛輸入一個字元,就跳轉到NomeChange斷點處了,說明在輸入時就開始判斷了,所以自己想要的使用者名稱只能複製黏貼(我是xiaoyuyu,密碼:11111)

NomeChange這一段沒分析出什麼重要的,只知道壓入了使用者名稱,但是在442E26這個跳轉,會使得OK鍵的屬性無法載入(dede裡可以分析出來的),所以我們nop掉,然後繼續單步除錯,OK鍵的灰化被我們取消了

然後F9數目密碼繼續除錯,有一個發現就是dede裡是有註釋的,可以一邊除錯一邊看,所有的註釋都指向了這一段要乾的事什麼,只有一段是沒分析出來的,如下

事出反常必有妖,打個斷點留著以後分析,先繼續除錯,在442CB2處有個判斷語句,如果不nop,會導致OK鍵再次灰化

然後在dede的註釋中,可以清晰的看到有許多關於OK鍵的語句,如下

估計都是關於控制元件屬性的,試過之後果然如此啊,有三處,全部都要nop掉判斷語句

把這些全部nop之後就可以使得程式的OK鍵徹底可用了,真的是服了,分析的時候累死,怎麼這麼多關於控制元件的,吐槽一下

此時經過這幾個nop之後OK鍵沒有被灰化,繼續單步執行發現又跳回了判斷密碼是否正確的函式開始,儲存一下吧,一共四個nop

然後對OK鍵打斷點,點選OK鍵,繼續分析,想辦法讓按鈕消失

上來先是一段對與Cancella按鈕的判斷,我們先試著把和它相關的跳轉都nop掉,貌似是對Cancella控制元件屬性的改變,如下

單步向下發現是OnClick按鈕不見了,成功了一半,在Cancella控制元件處打斷點,並用同樣的方式爆破,然後就OK了,累死我了

keygen:

按照爆破的流程來分析好了……頭大,就跟著那個流程走一遍好了,偷個懶,就不分析了,反正最騷的就是,這個程式是根據你輸入的註冊碼來逆推的使用者名稱對不對,最後還要窮舉爆破……