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