新160個CrackMe分析-第4組:31-40(上)

?作者:selph
目錄:
??031-Cruehead.11
??032-Bengaly-Crackme22
??033-dccrackme13
??034-fireworx54
??035-Dope211225
??036-Andrnalin.26
??037-fireworx27
??038-Eternal Bliss.38
??039-eKH19
??040-DaNiEI-RJ110
1.??????031-Cruehead.1
算法難度:???
爆破難度:?
?信息收集
?運行情況:

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

? ? ? ??? ? ? ? ??
調試分析
字符串提示信息:

??????????
直接從字符串提示信息找到驗證點
這是一個自寫的彈窗函數(shù)還....,繼續(xù)向上交叉引用

??????????
到了上一層:看到的是個窗口過程函數(shù),這里在比對消息碼,這里彈窗往上有個DialogBoxParamA的調用,應該就是創(chuàng)建Register對話框的函數(shù),所以跟進這里的窗口過程

? ? ?
跟進之后,可以看到這有兩個明顯的函數(shù)調用獲取用戶輸入,分別保存在了兩個全局變量里,然后就關閉窗口了,接下來還得從剛剛創(chuàng)建窗口的地方往下看

??????????
往下看就是使用獲取的Name和Serial進行一個函數(shù)調用,然后用調用結果比對,選擇是否彈窗成功

??????????
接下來看Name的校驗計算:
首先是判斷字符的合法性,必須是字母,如果是小寫字母則轉變成大寫字母
然后累加每個字母的值,和5678h進行異或,得到用戶名的校驗值

??????????
接下來是序列號的校驗:
循環(huán)遍歷每一個字符,序列號如果說是純數(shù)字,那么減去0x30就相當于是把字符數(shù)字變成整數(shù)類型的數(shù)字,然后每次操作一個數(shù)字累加到edi之前就先乘以一次10,那么這個邏輯就相當于是字符串轉整型的操作
然后進行一個異或1234h,返回校驗值

??????????
最后比較這兩個校驗值,相同則彈窗成功:

??????????
注冊機
注冊碼生成算法:
?????#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
??? char name[100] = { 0 };
??? char serial[100] = { 0 };
??? int name_check = 0;
??? std::cin >> name;
??? for (int i = 0; name[i]; i++) {
??????? if (name[i] > 'Z')name[i] -= 0x20;
??????? name_check += name[i];
??? }
??? name_check ^= 0x5678;
??? name_check ^= 0x1234;
??? sprintf(serial, "%d", name_check);
??? std::cout << serial << std::endl;
}
結果:

??????????
2.??????032-Bengaly-Crackme2
算法難度:??
爆破難度:?
信息收集
運行情況:
沒有任何label,就2個框框輸入和check

??????????
查殼與脫殼:
UPX殼,ESP定律即可

??????????
調試分析
是個手寫窗口過程的程序,從頭到尾跟進,這里就是調用自寫函數(shù)

??????????
跟進以后,很明顯的看到了窗口過程函數(shù):

??????????
直接跟進到窗口過程里:發(fā)現(xiàn),驗證彈窗的過程正好就寫在這里:
剛開始是先獲取用戶輸入:

??????????
獲取完成輸入之后,對用戶名進行一個處理,然后對序列號進行一個處理,就進行對比,如果相同,則跳轉
用戶名處理過程:
a.?取一個字節(jié)
b.?求平方,結果加到esi
c.?右移這個字節(jié)1位,結果加到esi
d.?esi減去這個字節(jié)
e.?然后循環(huán)處理每一個字節(jié),最終結果在esi

?????????
對于序列號的處理,這個call實際上就是_atoi函數(shù)(已經不止一次逆這個函數(shù)了......)

??????????
直接就是反著操作一波,就可以還原序列號了
?注冊機
注冊碼生成算法:
?????#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
??? char name[100] = { 0 };
??? char serial[100] = { 0 };
??? int len = 0;
??? int check = 0;
??? std::cin >> name;
??? len = strlen(name);
??? for (int i = 0; name[i]; i++)
??? {
??????? char tmp = name[i];
??????? check += tmp * tmp;
??????? check += tmp >> 1;
??????? check -= tmp;
??? }
??? _itoa(check, serial, 10);
??? std::cout << serial << std::endl;
??? return 0;
}
結果:

3.??????033-dccrackme1
算法難度:??
爆破難度:?
信息收集
運行情況:
打開是一個彈窗:

??????????
然后才顯示窗口?
?????????
查殼與脫殼:
?無殼:
??????????
調試分析
Delphi程序,Check按鈕邏輯:
獲取Name,計算一個值,轉字符串,和Serial比對
??????????
注冊機
注冊碼生成算法:
?????#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
??? char name[100] = { 0 };
??? char serial[100] = { 0 };
??? int len = 0;
??? int check = 0;
??? std::cin >> name;
??? len = strlen(name);
??? for (int i = 0; name[i]; i++)
??? {
??????? char tmp = name[i];
??????? check += (tmp - 0x17) * (tmp - 0x11);
??? }
??? _itoa(check,serial,10);
??? std::cout << serial;
}
效果:
??????????
4.??????034-fireworx5
算法難度:?
爆破難度:?
信息收集
運行情況:
只有一個輸入框,沒有check按鈕
??????????
查殼與脫殼:
無殼,那個年代Borland Delphi程序很主流啊
??????????
調試分析
硬編碼比對驗證,硬編碼的值是Label的值
??????????
效果:
??????????
5.??????035-Dope21122
算法難度:??
爆破難度:????(入口點難找)
信息收集
運行情況:
??????????
查殼與脫殼:
無殼
??????????
調試分析
這是個delphi程序,但是用DD和IDR都不能分析出來內容,然后看視頻得知使用PE.Explorer程序可以輔助分析,吾愛愛盤可以下載到
首先查看RC資源:發(fā)現(xiàn)這個按鈕標題和事件
??????????
接下來點擊反匯編查看VCL方法,找到這個事件:
??????????
分析這個地址:0x421DC8,由于這是個Delphi程序,里面會存在各種亂七八糟的函數(shù)調用,固本次分析采用動態(tài)靜態(tài)結合的方式進行,這里關于出現(xiàn)的call的功能是通過x86dbg運行得知的,為了方便展示,這里依然是使用IDA的截圖:
剛開始是獲取輸入的Name和Serial,Name長度需要大于等于4?
?????????
接下來是對Name的處理:
遍歷字符串每次取一個字節(jié),左移9位,然后累加到ebx里??
????????
驗證環(huán)節(jié)依然是對比:
將剛剛計算的累加值變成字符串,然后對比輸入的序列號,對比不相同則彈窗失敗

? ? ? ? ??
注冊機
注冊碼生成算法:
?????#define _CRT_SECURE_NO_WARNINGS
#include
int main()
{
??? char name[100] = { 0 };
??? char serial[100] = { 0 };
??? int len = 0;
??? int check = 0x37;
??? std::cin >> name;
??? len = strlen(name);
??? for (int i = 0; name[i]; i++)
??????? check += (name[i] << 9);
??? _itoa(check, serial, 10);
??? std::cout << serial << std::endl;
}
效果:

??????????
參考資料
–?[1]?新160個CrackMe算法分析-035-Dope2112.2_嗶哩嗶哩_bilibili