首页
社区
课程
招聘
[讨论]用户名和注册码分别计算,然后比较问题。此一例
发表于: 2005-2-28 18:54 3588

[讨论]用户名和注册码分别计算,然后比较问题。此一例

2005-2-28 18:54
3588
  今天看到“密界精华-CrackMe练习-Anti-Crackme1”这里时发现这种比较还不好反算出注册码,所以拿出来和大家讨论一下,大家给点意见吧。

分析:
 ( name每位 XOR table1每位 )之和要等于 ( sn每位 XOR table2每位)之和
 注:table1每位和table2每位这种说法是不对的,应该是和name或sn的位相同。

附件中有原程序和破解了其中程序反调试的程序。破解不成问题,但算法就有点问题了。
附件:CrackMe.rar

原破解文章:附件:Crackme1.rar

也不知道这样说大家有看懂没,还是看看下面的代码吧。

int main()
{
        char *name = "huangke";
        char *sn = "123456789";
        char *table1 = "dXqdkkjRg3jCnifESjelsJlkeNNGediWPRrt";
        char *table2 = "EdjlfFFklciILlIednelaHgebAMO0oO0ese3";
        int i = 0;
        int x = 0;
        for( ; i < strlen(name); i++) x += name[i] ^ table1[i];
        printf( "%x\n", x);
}

/*
00403000  64 58 71 64 6B 6B 6A 52 67 33 6A 43 6E 69 66 45  dXqdkkjRg3jCnifE
00403010  53 6A 65 6C 73 4A 6C 6B 65 4E 4E 47 65 64 69 57  SjelsJlkeNNGediW
00403020  50 52 72 74 00 45 64 6A 6C 66 46 46 6B 6C 63 69  PRrt.EdjlfFFklci
00403030  49 4C 6C 49 65 64 6E 65 6C 61 48 67 65 62 41 4D  ILlIednelaHgebAM
00403040  4F 30 6F 4F 30 65 73 65 33 00 00 00 00 00 00 00  O0oO0ese3.......

004011EF   > \A1 56304000   MOV EAX,DWORD PTR DS:[403056]            ;  eax = strlen(name)
004011F4   .  83F8 06       CMP EAX,6                                ;  if eax < 6
004011F7   .  0F8C 97000000 JL XiaoZi'C.00401294                     ;  go over
004011FD   .  50            PUSH EAX
004011FE   .  59            POP ECX                                  ;  ecx = eax
004011FF   .  8D35 00304000 LEA ESI,DWORD PTR DS:[403000]            ;  esi = &table1
00401205   .  8D3D 74304000 LEA EDI,DWORD PTR DS:[403074]            ;  edi = &name
0040120B   >  33C0          XOR EAX,EAX                              ;  eax = 0 ; LOOP start ===========用name计算
0040120D   .  33DB          XOR EBX,EBX                              ;  ebx = 0
0040120F   .  8B07          MOV EAX,DWORD PTR DS:[EDI]               ;  eax = name[0,1,2,3]
00401211   .  8B1E          MOV EBX,DWORD PTR DS:[ESI]               ;  ebx = table1[0,1,2,3]
00401213   .  25 FF000000   AND EAX,0FF                              ;  eax & 0FF ; eax = name[i]
00401218   .  81E3 FF000000 AND EBX,0FF                              ;  ebx & 0FF ; ebx = table1[i]
0040121E   .  33C3          XOR EAX,EBX                              ;  eax = eax ^ ebx
00401220   .  0305 4E304000 ADD EAX,DWORD PTR DS:[40304E]            ;  eax += [40304E]
00401226   .  A3 4E304000   MOV DWORD PTR DS:[40304E],EAX            ;  [40304E] = eax
0040122B   .  46            INC ESI                                  ;  esi++
0040122C   .  47            INC EDI                                  ;  edi++
0040122D   .^ E2 DC         LOOPD SHORT XiaoZi'C.0040120B            ;  go up ; LOOP end
0040122F   .  33C9          XOR ECX,ECX                              ;  ecx = 0
00401231   .  8B0D 5A304000 MOV ECX,DWORD PTR DS:[40305A]            ;  ecx = strlen(sn)
00401237   .  8D35 25304000 LEA ESI,DWORD PTR DS:[403025]            ;  esi = &table2
0040123D   .  8D3D F4304000 LEA EDI,DWORD PTR DS:[4030F4]            ;  edi = &sn
00401243   >  33C0          XOR EAX,EAX                              ;  eax = 0 ; LOOP start ===========用sn计算
00401245   .  33DB          XOR EBX,EBX                              ;  ebx = 0
00401247   .  8B07          MOV EAX,DWORD PTR DS:[EDI]               ;  eax = sn[i,i+1,i+2,i+3]
00401249   .  8B1E          MOV EBX,DWORD PTR DS:[ESI]               ;  ebx = table2[i,i+1,i+2,i+3]
0040124B   .  25 FF000000   AND EAX,0FF                              ;  eax & 0FF ; eax = sn[i]
00401250   .  81E3 FF000000 AND EBX,0FF                              ;  ebx & 0FF ; ebx = table2[i]
00401256   .  33C3          XOR EAX,EBX                              ;  eax = eax ^ ebx
00401258   .  0305 52304000 ADD EAX,DWORD PTR DS:[403052]            ;  eax += [403052]
0040125E   .  A3 52304000   MOV DWORD PTR DS:[403052],EAX            ;  [403052] = eax
00401263   .  46            INC ESI                                  ;  esi++
00401264   .  47            INC EDI                                  ;  edi++
00401265   .^ E2 DC         LOOPD SHORT XiaoZi'C.00401243            ;  go up ; LOOP end
00401267   .  A1 52304000   MOV EAX,DWORD PTR DS:[403052]            ;  eax = 用sn计算的值
0040126C   .  8B1D 4A304000 MOV EBX,DWORD PTR DS:[40304A]            ;  ?????这里不知道是什么用的。后面研究发现,程序是定时监察的,在设置了时间后就给了值=1。
00401272   .  85DB          TEST EBX,EBX                             ;  测试[40304A]
00401274   .  75 3A         JNZ SHORT XiaoZi'C.004012B0              ;  go over
00401276   .  8505 4E304000 TEST DWORD PTR DS:[40304E],EAX           ;  测试 sn 和 name 算出来的值。
0040127C   .  75 32         JNZ SHORT XiaoZi'C.004012B0              ;  if != go over
*/

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

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 142
活跃值: (278)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
2
  算法是简单,也知道是怎么回事了,但要写出注册机来还是有点问题。至少一个用户不止一个正确的注册码吧。
2005-2-28 18:56
0
游客
登录 | 注册 方可回帖
返回