一簡單crackme的簡單分析
一簡單crackme的簡單分析
在一個論壇上看到的,閒來無事就順手玩了玩。
跟蹤知註冊碼需為8位,緊接著到關鍵部分:
00445112 > \BA 16FD2D01 mov edx, 12DFD16
00445117 . 8BC6 mov eax, esi
00445119 . 85C0 test eax, eax
0044511B . 7E 1B jle short 00445138
0044511D . BE 01000000 mov esi, 1
00445122 > 8B4D FC mov ecx, [ebp-4]
00445125 . 8A4C31 FF mov cl, [ecx+esi-1] //取用戶名的一位
00445129 . 80F1 CA xor cl, 0CA //與0ca異或
0044512C . 81E1 FF000000 and ecx, 0FF //ecx前三位情零
00445132 . 03D1 add edx, ecx //累加
00445134 . 46 inc esi
00445135 . 48 dec eax
00445136 .^ 75 EA jnz short 00445122
00445138 > 81F2 26117919 xor edx, 19840808 //累加結果與19840808異或
0044513E . 3B55 F4 cmp edx, [ebp-C] //與註冊碼比較
算法總結:去用戶名每位與0ca疑惑後與12df016累加,結果與19840808異或.
註冊機源碼:
#include "stdio.h"
#include "math.h"
#include "conio.h"
void main()
{
char na[80];
int na_len;
int i=0;
signed char di;
unsigned long cs1=0x12DFD16;
unsigned long cs2=0x19840808;
unsigned long cs3=0x0CA ;
char cs4=11;
printf("please input your name:");
gets(na);
na_len=strlen(na);
for(i=0;i<na_len;i++)
{
na=na^cs3;
cs1+=na&0x0ff;
}
cs2=cs1^cs2;
printf("\nYour serial is %lx",cs2);
printf("\n\n\nMade By eLance");
getch();
}
|