1. 程式人生 > >【reversing.kr逆向之旅】Easy Keygen的writeup

【reversing.kr逆向之旅】Easy Keygen的writeup

先看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