新160個(gè)CrackMe分析-第2組:11-20(上)

作者:selph
目錄:
??011-wocy.11
??012-ACG-crcme12
??013--Acid_burn3
??014-Splish4
??015-BradSoblesky.15
??016-fly_crkme36
??017-Cabeca7
??018-crackme_00068
??019-Acid_Byte.39
??020-cosh.310
016-020請看下期
1.??????011-wocy.1
???????????算法難度:?
???????????爆破難度:?
信息收集
運(yùn)行情況:

??????????
查殼與脫殼:
MFC程序,無殼

??????????
查字符串:
提示字符串:Registed

??????????
調(diào)試分析
老樣子,從關(guān)鍵提示字符串入手,交叉引用查校驗(yàn)函數(shù)
這里函數(shù)里不知道這個(gè)[esi+60h]和[esi+64h],通過動(dòng)態(tài)調(diào)試執(zhí)行可知,這里是分別獲取的用戶名和ID號(hào),然后驗(yàn)證邏輯就很簡單了,用戶名和ID號(hào)需要是倒序的即可

??????????
結(jié)果:
??????????

2.??????012-ACG-crcme1
???????????算法難度:??
???????????爆破難度:?
信息收集
運(yùn)行情況:
?????

?????
查殼與脫殼:
無殼
?

?????????
查字符串:
有很多看不懂的提示語,還有個(gè)文件名
??????????

調(diào)試分析
抄起IDA直接干,用戶函數(shù)就3個(gè),這么簡潔這應(yīng)該是純匯編寫的程序吧(猜的),從start開始分析

??????????
首先打開一個(gè)文件,讀取其中的內(nèi)容,該內(nèi)容應(yīng)該長度是12字節(jié):

??????????
然后就像下面這樣,對12個(gè)字節(jié)的每個(gè)字節(jié)進(jìn)行一個(gè)運(yùn)算,逐一校驗(yàn)結(jié)果

??????????
然后接下來就是,如果驗(yàn)證全部通過,就彈窗提示ok,否則就直接啟動(dòng)窗口
????????????暴力破解
把所有判斷跳轉(zhuǎn)都nop掉即可
????????????算法分析
序列號(hào)運(yùn)算的核心是異或,異或是可逆的,所以可以反著把序列號(hào)生成出來:
?????#include
int main()
{
??? int arr[12] = { 0x168,0x160,0x170,0xec,0x13c,0x1cc,0x1f8,0xec,0x164,0x1f8,0x1a0,0x1bc };
??? int serial[12] = { 0 };
??? for (int i = 0; i < 12; i++)
??? {
??????? serial[i] ^= arr[i];
??????? serial[i] >>= 2;
??????? serial[i] = serial[i]&0x000000FF ^ 0x1b;
??? }
??? for(char var : serial)
??? {
??????? printf("%c",var);
??? }
}
計(jì)算結(jié)果是:ACG The Best
執(zhí)行結(jié)果:

??????????
總結(jié)
很簡單無腦的一次算法分析
3.??????013--Acid_burn
???????????算法難度:??
???????????爆破難度:?
信息收集
原160個(gè)CM的第一個(gè),以前做過一遍,老費(fèi)勁了,現(xiàn)在再來一遍看看
?暴力破解已經(jīng)懶得介紹了,看得懂完整分析也肯定知道該改哪里了
運(yùn)行情況:
啟動(dòng)的時(shí)候有Nag:

??????????
?提供了兩種注冊方法:用戶名+序列號(hào),序列號(hào)
??????????

?查殼與脫殼:
?無殼:Delphi程序

??????????
調(diào)試分析
分析Delph GUI程序借助IDR輔助方便查看窗口事件(純IDA分析的話,查字符串交叉引用定位也能找到這些函數(shù))
?首先是啟動(dòng)窗口:窗口啟動(dòng)的時(shí)候調(diào)用FromCreate函數(shù)里,執(zhí)行流MessageBox,這就是所謂的NAG,煩人彈窗
??????????
然后是序列號(hào)驗(yàn)證:

??????????
接下來是用戶名+序列號(hào)驗(yàn)證:
首先對用戶名4個(gè)字節(jié)進(jìn)行一頓處理,然后把值保存起來,用戶名必須大于等于4個(gè)字符
這里開頭往[431750]賦了個(gè)初始值:0x29

接下來計(jì)算序列號(hào),然后跟用戶輸入比對

??????????
?去除NAG
去除Nag只需要修改該函數(shù)直接返回即可:

??????????
算法分析
序列號(hào)驗(yàn)證:硬編碼驗(yàn)證,輸入Hello Dude!即可
??????????
用戶名+序列號(hào)驗(yàn)證,序列號(hào)可以寫出注冊機(jī):
?????#include
int main()
{
??? int res = 0x29;
??? char name[20] = {0};
??? std::cin >> name;
??? res = name[0] * res * 2;
??? std::cout <<"CW"<<"-" << res << "-" <<"CRACKED";
}
??????????
總結(jié)
以前做半天,現(xiàn)在分析起來很快啊,對于特定語言的逆向,如果能有對應(yīng)的工具幫助識(shí)別函數(shù)功能,那簡直是幫大忙了
?PS:用戶名+序列號(hào)驗(yàn)證這里先校驗(yàn)了用戶名長度,校驗(yàn)的時(shí)候計(jì)算了一堆中間值,真的一點(diǎn)用沒有?。。?/p>
4.??????014-Splish
???????????算法難度:??
???????????爆破難度:?
信息收集
?運(yùn)行情況:
開始有個(gè)啟動(dòng)屏幕,然后進(jìn)入程序主界面
?按照說明,目標(biāo)是禁用啟動(dòng)屏幕,完成硬編碼校驗(yàn),寫用戶名序列號(hào)注冊機(jī)
?
查殼與脫殼:
無殼:
??????????
調(diào)試分析
?用戶函數(shù)比較少,直接從起點(diǎn)硬剛:
?這個(gè)call應(yīng)該就是程序的入口了
這個(gè)call里面就進(jìn)入窗口消息循環(huán)了,在那之前調(diào)用了幾個(gè)用戶函數(shù):
有一個(gè)是對參數(shù)進(jìn)行處理的,有一個(gè)call的參數(shù)是實(shí)例句柄,很可疑,進(jìn)入查看
、
這里頭是創(chuàng)建了一個(gè)窗口,然后延時(shí)關(guān)閉,要去除NAG,直接把這個(gè)函數(shù)處理了就好:
然后找到一個(gè)函數(shù)貌似是消息處理函數(shù):這里根據(jù)參數(shù)的Msg號(hào)進(jìn)行跳轉(zhuǎn)執(zhí)行
??????????
?往下找,發(fā)現(xiàn)硬編碼check分支:將用戶輸入和硬編碼:HardCoded進(jìn)行比對,一致了跳轉(zhuǎn)
??????????
?一致了跳轉(zhuǎn)的最終位置是,說明這里硬編碼已經(jīng)找到了:
??????????
?接下來找找用戶名序列號(hào)驗(yàn)證:
?驗(yàn)證會(huì)進(jìn)行三次計(jì)算,首先是計(jì)算用戶名得到一個(gè)結(jié)果:
??????????
然后計(jì)算序列號(hào)得到一個(gè)結(jié)果:
??????????
最后將兩個(gè)運(yùn)算結(jié)果進(jìn)行比對:
???
???????
算法分析
拿用戶名計(jì)算一個(gè)結(jié)果,跟序列號(hào)計(jì)算一個(gè)結(jié)果進(jìn)行比對的驗(yàn)證邏輯,寫注冊機(jī)的話則是先用用戶名計(jì)算一個(gè)結(jié)果,然后用這個(gè)結(jié)果反推序列號(hào)
?????#include
int main()
{
??? const char* num = "2345678901";
??????? char serial[20] = { 0 };
??? char name[20] = { 0 };
??? char name_res[20] = { 0 };
??? int len = 0;
??? std::cin >> name;
??? len = strlen(name);
??? //std::cin >> serial;
??? for (int i = 0; i < len; i++)
??? {
??????? name_res[i] = name[i] % 0xA;
??????? name_res[i] ^= i;
??????? name_res[i] += 2;
??????? if (name_res[i] > 0xA)name_res[i] -= 0xA;
??? }
??? //for (int i = 0; i < len; i++)
??? //{
??? //? serial_res[i] = serial[i] % 0xA;
??? //}
??? for (int i = 0; i < len; i++)
??? {
??????? serial[i] = num[name_res[i]];
??? }
??? std::cout << serial << std::endl;
}
???????????結(jié)果:
???

???????
總結(jié)
算是個(gè)編寫注冊機(jī)的練習(xí),這個(gè)cm中練習(xí)了匯編轉(zhuǎn)C的操作
5.??????015-BradSoblesky.1
???????????算法難度:?
???????????爆破難度:?
信息收集
運(yùn)行情況:
?序列號(hào)驗(yàn)證:

??????????
查殼與脫殼:
MFC程序,無殼:
?????

?????
?查字符串:
存在提示信息:
????

??????
調(diào)試分析
硬編碼字符串和用戶輸入字符串比對,沒啥好說的

??????????
結(jié)果:
