新160個CrackMe分析-第1組:1-10(下)

目錄:
?001-前言1
?002-abexcm52
?003-CrueheadCM33
?004-AcidBytes.24
?005-Andrénalin.15
?006-ArturDents-CrackMe26
?007-reg7
?008-Afkayas.18
?009-Boonz-KeygenMe1
?010-ceycey10
1-5(關(guān)注上期文章)
6. 006-ArturDents-CrackMe2
算法難度:??
爆破難度:?
信息收集
運(yùn)行情況:
經(jīng)典的用戶名序列號授權(quán)驗(yàn)證:
? ?

查殼與脫殼:
無殼:

? ?
查字符串:
有兩個提示信息,可以作為分析的入口點(diǎn):

? ?
查導(dǎo)入表:
很直觀,獲取用戶輸入,進(jìn)行驗(yàn)證,然后彈出對話框提示信息

? ?
調(diào)試分析
首先獲取Name,然后判斷Name長度是否符合要求:

? ?
然后獲取輸入的Serial,與使用Name生成的Serial進(jìn)行比對驗(yàn)證,彈框提示

? ?
暴力破解
略
算法分析
注冊碼生成算法,沒啥好說的
? #include
int main()
{
? ? char Buffer[100] = { 0 };
? ? std::cin >> Buffer;
? ? for (int i = strlen(Buffer),j=0; i >0; i--,j++)
? ? {
? ? ? ? Buffer[j] = Buffer[j] - i;
? ? }
? ? std::cout << Buffer << std::endl;
}
總結(jié)
平平無奇的最簡單CM
7. 007-reg
算法難度:?
爆破難度:?
信息收集
運(yùn)行情況:
經(jīng)典的用戶名+序列號授權(quán)驗(yàn)證:

? ?
查殼與脫殼:
Delphi編寫的32位GUI程序,無殼

? ?
查字符串:
大概看了一下,字符串里有個reg.dll,但CM文件只是單一的exe,可能存在釋放文件
?

調(diào)試分析
對于Delphi程序,除了直接強(qiáng)行分析之外,還可以借助Delphi輔助分析工具:IDR(吾愛論壇上有)
因?yàn)槭谴翱诔绦颍圆榇翱诘南嚓P(guān)內(nèi)容:

? ?
直接查看點(diǎn)擊Ok按鈕的內(nèi)容:大概就是把用戶輸入的用戶名和序列號寫入到了reg.dll文件中,也就是說這是個dll后綴的文本文件

? ?
提示語是重啟軟件后驗(yàn)證注冊碼,說明這是一種重啟驗(yàn)證,在啟動的時候進(jìn)行校驗(yàn)
那么接下來查看創(chuàng)建窗口時的代碼:

? ?
這個調(diào)用的函數(shù):sub_0045D0F4,這應(yīng)該就是一個校驗(yàn)函數(shù),根據(jù)返回al的值是否為0,來進(jìn)行判斷跳轉(zhuǎn),這個跳轉(zhuǎn)應(yīng)該是關(guān)鍵跳了

? ?
暴力破解
修改關(guān)鍵跳:

? ?
然后跑起來:

? ?
算法分析
接下來看看具體校驗(yàn)call做了哪些事情:sub_45D0F4
首先獲取參數(shù)之后,計算SN長度,SN長度需要是16個字符:

? ?
然后接下來是個循環(huán),遍歷SN每個字符,檢查合法字符,這里允許的字符是0-9數(shù)字和A-F字母

? ?
然后緊接著進(jìn)行一頓處理,處理用戶名得到一個加密編碼后的值

? ?
值通過x86dbg動態(tài)調(diào)試觀察:計算的結(jié)果是8B45677A3AEBE84C
? ?
然后接下來,程序連續(xù)走了兩趟相同的操作,分別是對剛剛通過用戶名計算出來的結(jié)果和我們輸入的SN,然后將結(jié)果進(jìn)行對比,返回

? ?
這里具體生成用戶名對應(yīng)SN的代碼過于復(fù)雜,暫時還寫不出來注冊機(jī),但這里程序在分析過程中會出現(xiàn)SN真碼明文,這里也就到此結(jié)束了,使用該SN打開程序:

? ?
總結(jié)
Delphi程序逆向練習(xí),借助工具IDR可以很方便的識別Delphi函數(shù),這個CM使用了經(jīng)典的重啟驗(yàn)證,讓驗(yàn)證函數(shù)在窗口創(chuàng)建前進(jìn)行驗(yàn)證,注冊機(jī)較為復(fù)雜,暫時還寫不出來
?參考資料
– [1] 新160個CrackMe算法分析-007-Reg_嗶哩嗶哩_bilibili
8. 008-Afkayas.1
算法難度:??
爆破難度:?
信息收集
運(yùn)行情況:
輸入用戶名,序列號,點(diǎn)OK進(jìn)行驗(yàn)證
? ?
查殼與脫殼:
無殼,程序由VB5.0編寫
? ?
調(diào)試分析
這個程序以前做CM的時候分析過,以x86dbg+IDA進(jìn)行逆向分析的,詳情見參考
這次就直接拖VBDec里用專門的VB反編譯軟件進(jìn)行分析
這個程序有用的代碼就一個OK按鈕的點(diǎn)擊事件,總共就這么幾行:
? ?
很神奇一點(diǎn)就是,這點(diǎn)之前沒發(fā)現(xiàn),這里藏了一個文本框,我就說代碼里咋三個文本框呢,這個是用來保存數(shù)據(jù)的
? ?
算法分析
有幾行看不懂啥意思,直接x86dbg動態(tài)跟蹤看看效果,整體注釋:
? Private Sub OK_Click() '402310
? loc_004023D3: call var_8004 = var_C4(Me, Me, 0, 0, 0)? ? ? ? ? ? ?// 獲取用戶名輸入
? loc_00402415: var_8008 = Len(var_C4(Me, Me, 0, 0, 0).MousePointer)? ? ? ? // 計算用戶名長度
? loc_0040242D: var_800C = Asc(CrackMe.Text1.Text)? ? ? ? ? ? ? // 取用戶名首字符的ASCII碼
? loc_0040243F: call var_8010 = global_004040E0(var_8008*97531+var_800C)? ? // 97531*用戶名長度+首字符的ASCII碼,結(jié)果轉(zhuǎn)換成字符串
? loc_00402458: CrackMe.RegSerial.Text = var_8010? ? ? ? ? ? ? ?// 設(shè)置這個文本框的值
? loc_004024DE: call var_8014 = var_C0(Me)
? loc_0040258B: If (CrackMe.Serial.Text = "AKA-" & var_C0(Me).MousePointer) + 1 Then? // 判斷輸入的序列號是否為AKA-拼接剛剛計算的值
? loc_004025C4:? ?var_8028 = MsgBox("You Get It" & vbCrLf & "KeyGen It Now", 0, var_4C, var_5C, var_6C)
? loc_004025E5: Else
? loc_0040261C:? ?var_8034 = MsgBox("You Get Wrong" & vbCrLf & "Try Again", 0, var_4C, var_5C, var_6C)
? loc_0040263B: End If
? loc_00402652: GoTo loc_0040269E
? loc_0040269D: Exit Sub
? loc_0040269E: ' Referenced from: 00402652
End Sub
總結(jié)
依然是很簡單的一次VB逆向
– [1] 160個Crackme系列-002-Afkayas.1 - 我可是會飛的啊 (kn0sky.com)
9. 009-Boonz-KeygenMe1
算法難度:???
爆破難度:?
信息收集
運(yùn)行情況:
神奇的審美,用戶名+序列號驗(yàn)證程序
? ?
查殼與脫殼:
無殼程序
? ?
查字符串:
有一些提示字符串,提示輸入正確失敗的,還有錯誤提示:Name需要是4-50個字符長
? ?
調(diào)試分析
本次的目標(biāo)是分析出算法寫注冊機(jī),所以就沒有爆破環(huán)節(jié)了
從提示字符串Hello,Mr. Goodboy入手開始分析,交叉引用找到校驗(yàn)函數(shù):
先后獲取了用戶輸入的Name和Serial,然后進(jìn)入校驗(yàn)函數(shù)
? ?
算法分析
校驗(yàn)函數(shù)就是算法的所在
首先判斷用戶名長度是否合法,長度4--50內(nèi)
? ?
接下來進(jìn)行第一組計算,結(jié)果保存起來
? ?
然后進(jìn)行第二組運(yùn)算:圈出來的三行純屬干擾,無用

? ?
然后進(jìn)行第三組運(yùn)算:

? ?
然后再往下就是拼接字符串進(jìn)行比對的環(huán)節(jié)了:

? ?
已經(jīng)知道Serial是怎么算的了,接下來寫注冊機(jī)
注冊機(jī)代碼
? #define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
? ? char name[50] = { 0 };
? ? char serial[50] = { 0 };
? ? int nameLength = 0;
? ? std::cin >> name;
? ? nameLength = strlen(name);
? ? if (nameLength < 4 || nameLength > 50) {
? ? ? ? std::cout << "Name Length Invalid" << std::endl;
? ? ? ? return 0;
? ? }
? ? // 第一輪計算
? ? unsigned int res_1 = 0;
? ? for (auto a = 0; name[a];a++) {
? ? ? ? char tmp = name[a];
? ? ? ? tmp -= 0x19;
? ? ? ? res_1 -= tmp;
? ? }
? ? // 第二輪計算
? ? unsigned int res_2 = res_1 * res_1 * res_1;
? ? // 第三輪計算
? ? unsigned int res_3 = 0x40e0f8 * 0x40e0f8 - 0x40e0f8;
? ? sprintf(serial, "Bon-%lX-%lX-%lX", res_1,res_2,res_3);
? ? std::cout << serial << std::endl;
? ? return 0;
}
? 計算結(jié)果:
? Name = 1234
Serial = Bon-FFFFFF9A-FFEFCEA8-41720F48
程序運(yùn)行結(jié)果:

? ?
總結(jié)
非常簡單的序列號校驗(yàn)算法分析,中間的干擾是無用計算,忽視即可
10. 010-ceycey
算法難度:?
爆破難度:?
信息收集
運(yùn)行情況:
輸入密碼登錄:

? ?
查殼與脫殼:
有UPX殼,使用ESP定律大法即可,這里不再啰嗦

? ?
脫殼后:可以看到是Delphi5寫的GUI程序

? ?
調(diào)試分析
抄起IDR就是干,明文硬編碼密碼:ULTRADMA............................................................,如果輸入錯誤,則點(diǎn)擊按鈕無事發(fā)生,輸入正確會彈窗

? ?
沒啥可爆破和算法分析的:

? ?
總結(jié)
可以當(dāng)成一次Upx脫殼練習(xí)