【reversing.kr逆向之旅】Easy Keygen的writeup
阿新 • • 發佈:2018-12-18
先看ReadMe.txt
意思是讓我們找到當序列號是5B134977135E7D13時對應的名字
查殼 無殼 vc++程式
執行發現當我們Name與Serial不對應時 程式直接退出
檢視關鍵字串
雙擊字串 再雙擊引用 F5 然後進行分析
int __cdecl main(int argc, const char **argv, const char **envp) { signed int j; // ebp signed int i; // esi char v6; // [esp+Ch] [ebp-130h] char v7; // [esp+Dh] [ebp-12Fh] char v8; // [esp+Eh] [ebp-12Eh] char input; // [esp+10h] [ebp-12Ch] char v10; // [esp+11h] [ebp-12Bh] __int16 v11; // [esp+71h] [ebp-CBh] char v12; // [esp+73h] [ebp-C9h] char v13; // [esp+74h] [ebp-C8h] char v14; // [esp+75h] [ebp-C7h] __int16 v15; // [esp+139h] [ebp-3h] char v16; // [esp+13Bh] [ebp-1h] input = 0; v13 = 0; memset(&v10, 0, 0x60u); v11 = 0; v12 = 0; memset(&v14, 0, 0xC4u); v15 = 0; v16 = 0; v6 = 16; v7 = 32; v8 = 48; printf(aInputName); // 輸出Input Name: scanf(aS, &input); // 這個input用來儲存Name j = 0; //這個for迴圈 是對Name的操作 for ( i = 0; j < strlen(&input); ++i ) { if ( i >= 3 ) //每次取三位 給sprintf進行操作 生成Serial放在v13所在記憶體區域 這裡分析我用了IDA動態除錯 i = 0; sprintf(&v13, aS02x, &v13, *(&input + j++) ^ *(&v6 + i));// %s%02X %02x用來控制格式,以十六進位制輸出,2為指定的輸出欄位的寬度.如果位數小於2,則左端補0 } memset(&input, 0, 0x64u); printf(aInputSerial); // Input Serial: scanf(aS, &input); // 這個input用來儲存Serial if ( !strcmp(&input, &v13) ) //真碼與假碼的比較 printf(aCorrect); else printf(aWrong); return 0; }
這個程式的思路就是 將我們輸入的Name進行一系列操作 生成一個Serial
再與我們自己輸入的Serial進行對比
如果一致 就輸出 correct
剛開始這個函式引數好亂啊 大概可以猜到
sprintf(&v13, aS02x, &v13, *(&input + j++) ^ *(&v6 + i));
但還是決定IDA 動態除錯看一下彙編
這裡是我們的輸入
debug007:0019FE18 db 69h ; i debug007:0019FE19 db 71h ; q debug007:0019FE1A db 69h ; i debug007:0019FE1B db 71h ; q debug007:0019FE1C db 69h ; i debug007:0019FE1D db 79h ; y debug007:0019FE1E db 61h ; a
debug007:0019FE14 db 10h
debug007:0019FE15 db 20h
debug007:0019FE16 db 30h
每次取Name中三個字元一次與0x10,0x20,0x30進行異或 再賦值給v13 生成下面的序列
debug007:0019FE7C db 37h ; 7 debug007:0019FE7D db 39h ; 9 debug007:0019FE7E db 35h ; 5 debug007:0019FE7F db 31h ; 1 debug007:0019FE80 db 35h ; 5 debug007:0019FE81 db 39h ; 9 debug007:0019FE82 db 36h ; 6 debug007:0019FE83 db 31h ; 1 debug007:0019FE84 db 34h ; 4 debug007:0019FE85 db 39h ; 9
圖形檢視更清晰一點
好啦 我們一直知道了怎樣通過Name生成Serial
那我們只要逆一下就行啦
指令碼來自夜影師傅
Serial = "5B134977135E7D13"
Name = ''
a = [16, 32, 48]
for i in range(len(Serial)//2):
Name += chr(int(Serial[2*i:2*i+2], 16) ^ a[i%3])
print(Name)
#K3yg3nm3