首页
社区
课程
招聘
习题八 echap518.exe 算法分析[原创]
发表于: 2006-3-17 14:51 5992

习题八 echap518.exe 算法分析[原创]

2006-3-17 14:51
5992

习题八 echap518.exe 算法分析

    至学习CRACKER以来唯一找出其算法的一个Crackme,兴奋之余,发上来请个位看看有什么错误之处,有错误之处请各位大侠指正...
Crackme下载地址:http://dcse.sina8.net/echap518.exe
用OD载入,查找字符参考,找到One of the Details you entered was wrong向上,来到

004014F5   |.  E8 AA030000 call <jmp.&MFC42.#3876>
004014FA   |.  8945 EC     mov dword ptr ss:[ebp-14],eax
004014FD   |.  837D EC 05  cmp dword ptr ss:[ebp-14],5
00401501   |.  7F 05       jg short echap518.00401508            ;  看name是否大于5位
00401503   |.  E9 BB000000 jmp echap518.004015C3                 ;  小于则直接出错
00401508   |>  8B4D E0     mov ecx,dword ptr ss:[ebp-20]
0040150B   |.  83C1 60     add ecx,60
0040150E   |.  E8 91030000 call <jmp.&MFC42.#3876>
00401513   |.  8945 E8     mov dword ptr ss:[ebp-18],eax
00401516   |.  837D E8 05  cmp dword ptr ss:[ebp-18],5           ;  看Serial是否大于5位
0040151A   |.  7F 05       jg short echap518.00401521            ;  小于则直接出错
0040151C   |.  E9 A2000000 jmp echap518.004015C3
00401521   |>  8B45 E0     mov eax,dword ptr ss:[ebp-20]
00401524   |.  05 E0000000 add eax,0E0
00401529   |.  50          push eax
0040152A   |.  8B4D E0     mov ecx,dword ptr ss:[ebp-20]
0040152D   |.  81C1 A00000>add ecx,0A0
00401533   |.  E8 66030000 call <jmp.&MFC42.#3874>               ;  ?这几个还不知道什么用
00401538   |.  8B4D E0     mov ecx,dword ptr ss:[ebp-20]
0040153B   |.  81C1 E40000>add ecx,0E4
00401541   |.  51          push ecx
00401542   |.  8B4D E0     mov ecx,dword ptr ss:[ebp-20]
00401545   |.  83C1 60     add ecx,60
00401548   |.  E8 51030000 call <jmp.&MFC42.#3874>               ;  ?这几个还不知道什么用
0040154D   |.  8B55 E0     mov edx,dword ptr ss:[ebp-20]
00401550   |.  81C2 E00000>add edx,0E0
00401556   |.  52          push edx
00401557   |.  8D4D E4     lea ecx,dword ptr ss:[ebp-1C]
0040155A   |.  E8 39030000 call <jmp.&MFC42.#858>                ;  ?这几个还不知道什么用
0040155F   |.  8B45 E0     mov eax,dword ptr ss:[ebp-20]
00401562   |.  05 E4000000 add eax,0E4
00401567   |.  50          push eax
00401568   |.  8D4D F0     lea ecx,dword ptr ss:[ebp-10]
0040156B   |.  E8 28030000 call <jmp.&MFC42.#858>
00401570   |.  33C0        xor eax,eax                           ;  计算开始
00401572   |.  33DB        xor ebx,ebx
00401574   |.  33C9        xor ecx,ecx
00401576   |.  B9 01000000 mov ecx,1                             ;  cl的值
0040157B   |.  33D2        xor edx,edx
0040157D   |.  8B45 E4     mov eax,dword ptr ss:[ebp-1C]         ;  name放入EAX
00401580   |>  8A18        /mov bl,byte ptr ds:[eax]             ;  取一位name
00401582   |.  32D9        |xor bl,cl                            ;  跟cl xor 运算
00401584   |.  8818        |mov byte ptr ds:[eax],bl             ;  算出的name放回EAX
00401586   |.  41          |inc ecx                              ;  ecx指针加1
00401587   |.  40          |inc eax                              ;  eax指针加1
00401588   |.  8038 00     |cmp byte ptr ds:[eax],0              ;  比较是否到name的最后一位
0040158B   |.^ 75 F3       \jnz short echap518.00401580          ;  没到最后一位,跳回继续XOR运算
0040158D   |.  33C0        xor eax,eax
0040158F   |.  33DB        xor ebx,ebx
00401591   |.  33C9        xor ecx,ecx
00401593   |.  B9 0A000000 mov ecx,0A                            ;  cl的值
00401598   |.  33D2        xor edx,edx
0040159A   |.  8B45 F0     mov eax,dword ptr ss:[ebp-10]         ;  取Serial放入EAX
0040159D   |>  8A18        /mov bl,byte ptr ds:[eax]             ;  取一位Serial
0040159F   |.  32D9        |xor bl,cl                            ;  跟cl xor 运算
004015A1   |.  8818        |mov byte ptr ds:[eax],bl             ;  算出的Serial放回EAX
004015A3   |.  41          |inc ecx                              ;  ecx指针加1
004015A4   |.  40          |inc eax                              ;  eax指针加1
004015A5   |.  8038 00     |cmp byte ptr ds:[eax],0              ;  比较是否到Serial的最后一位
004015A8   |.^ 75 F3       \jnz short echap518.0040159D          ;  没到最后一位,跳回继续XOR运算
004015AA   |.  8B45 E4     mov eax,dword ptr ss:[ebp-1C]         ;  计算后的name
004015AD   |.  8B55 F0     mov edx,dword ptr ss:[ebp-10]         ;  计算后的Serial
004015B0   |>  33C9        /xor ecx,ecx
004015B2   |.  8A18        |mov bl,byte ptr ds:[eax]             ;  取计算后的name的一位
004015B4   |.  8A0A        |mov cl,byte ptr ds:[edx]             ;  取计算后的Serial的一位
004015B6   |.  3AD9        |cmp bl,cl                            ;  比较
004015B8   |.  75 09       |jnz short echap518.004015C3          ;  不等则出错
004015BA   |.  40          |inc eax                              ;  eax指针加1
004015BB   |.  42          |inc edx                              ;  edx指针加1
004015BC   |.  8038 00     |cmp byte ptr ds:[eax],0              ;  比较是否到最后一位
004015BF   |.^ 75 EF       \jnz short echap518.004015B0          ;  继续比较
004015C1   |.  EB 16       jmp short echap518.004015D9           ;  跳到注册成功
004015C3   |>  6A 00       push 0
004015C5   |.  68 6C304000 push echap518.0040306C                ;  ASCII "ERROR"
004015CA   |.  68 40304000 push echap518.00403040                ;  ASCII "One of the Details you entered was wrong"
004015CF   |.  8B4D E0     mov ecx,dword ptr ss:[ebp-20]
004015D2   |.  E8 BB020000 call <jmp.&MFC42.#4224>
004015D7   |.  EB 14       jmp short echap518.004015ED
004015D9   |>  6A 00       push 0
004015DB   |.  68 34304000 push echap518.00403034                ;  ASCII "YOU DID IT"
004015E0   |.  68 20304000 push echap518.00403020                ;  ASCII "Well done,Cracker"
004015E5   |.  8B4D E0     mov ecx,dword ptr ss:[ebp-20]

假设name为:abcdef
Serial为:ghijkl


a xor 1 跟 g xor A 比较
b xor 2 跟 h xor B 比较
c xor 3 跟 i xor C 比较
d xor 4 跟 j xor D 比较
e xor 5 跟 k xor E 比较
f xor 6 跟 l xor F 比较

g=A xor 1 xor a
h=B xor 2 xor b
i=C xor 3 xor c
j=D xor 4 xor d
k=E xor 5 xor e
l=F xor 6 xor f

可以算出:
  name:cracker
Serial:h{nj`le

唉,俺不会写注册机,有错误之处请各位大侠指正...


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢你的分析,但按照算法:
注册码第1位=字母A xor 数字1 xor 注册名第1位
注册码第2位=字母B xor 数字2 xor 注册名第2位
注册码第3位=字母C xor 数字3 xor 注册名第3位
...
我却怎么算不出正确的注册码?

麻烦你再解释一下,谢谢了!
2006-3-20 08:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
呵呵,弄了好久,原来是看错了,以为1,A是字母A,老是按它们的ASCII码值去算,不算错才怪。
注册机的写法:(拿Regkiller兄写的C语言代码来改)
#include <iostream>
#include <iomanip>

using namespace std;

#define SIZE 100 //定义100位大小准备定义数组存放用户名

#define OPF hex<<setfill('0')<<setw(4)<<setiosflags(ios::uppercase) //定义输出格式 OPF=Output Format

void output(void); //定义输出头信息

int main()
{
  char Name[SIZE] ={0}; //初始化数组为0
  char regcode[SIZE];
  char Result;
  int j=0x1,k=0xa;
  output();
     cout<<"Please Input Your Name: " ;
  cin>>Name;
  for (int i=0;i<SIZE;i++)
  {
     Result=k^j^Name[i];
     regcode[i]=Result;
   j=j+1;
    k=k+1;
  }
  //格式化输出结果
      cout<<"Your Serial Number Is : "<<OPF<<regcode<<endl;
return 0;
}

void output(void)
{
    cout<<"                          " ;
    cout<<".::KEYGEN for CrackMe 6::."<<endl<<endl ;
    cout<<"                               " ;
    cout<<"Code BY RegKiller"<<endl<<endl ;
    cout<<"                           " ;
    cout<<"QQ Group Number: 21051610"<<endl<<endl ;
}

用Free C 编译器输入并编译通过。
Free C 是个好东西,呵呵。
2006-3-20 13:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
学习中,加油啊!
2006-3-20 14:06
0
雪    币: 218
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
最初由 geae 发布
呵呵,弄了好久,原来是看错了,以为1,A是字母A,老是按它们的ASCII码值去算,不算错才怪。
注册机的写法:(拿Regkiller兄写的C语言代码来改)
........


呵呵,第一次写文章,没写清楚...
2006-3-20 15:07
0
游客
登录 | 注册 方可回帖
返回
//