首页
社区
课程
招聘
[原创]Duelist's Crackme #3的算法分析+注册机
发表于: 2006-8-10 23:32 7876

[原创]Duelist's Crackme #3的算法分析+注册机

bxm 活跃值
29
2006-8-10 23:32
7876

【文章标题】: Duelist's Crackme #3的算法分析+注册机
【文章作者】: bxm
【作者邮箱】: bxm78@163.com
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 矩阵
【编写语言】: MASM32 / TASM32 [覆盖]
【使用工具】: od,peid,计算器
【操作平台】: winxp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  检查,用出错提示your registration info is invalid... please support shareware authors by buying software!向上查找,下断在[00401117]:
  00401117   > /33F6          xor     esi, esi                       ;  清0
  00401119   . |33D2          xor     edx, edx
  0040111B   . |8935 5E214000 mov     [40215E], esi
  00401121   . |8935 62214000 mov     [402162], esi
  00401127   > |0FBE8E FE2040>movsx   ecx, byte ptr [esi+4020FE]     ;  [ESI+4020FE]的字符入ECX
  0040112E   . |83F9 4D       cmp     ecx, 4D                        ;  ECX=4D ?
  00401131   . |74 2F         je      short 00401162                 ;  相等,读取完毕,跳
  00401133   . |890D 5E214000 mov     [40215E], ecx                  ;  ECX存入[40215E]
  00401139   . |51            push    ecx                            ; /ButtonID
  0040113A   . |FF75 08       push    dword ptr [ebp+8]              ; |hWnd
  0040113D   . |E8 D0010000   call    <jmp.&USER32.IsDlgButtonChecke>; \IsDlgButtonChecked
  00401142   . |46            inc     esi                            ;  ESI+1
  00401143   . |83F8 00       cmp     eax, 0                         ;  EAX为按钮的返回值,选中返回1,否则返回0
  00401146   .^|74 DF         je      short 00401127
  00401148   . |A1 5E214000   mov     eax, [40215E]                  ;  [40215E]入EAX
  0040114D   . |0FBE8E FE2040>movsx   ecx, byte ptr [esi+4020FE]     ;  [ESI+4020FE]的字符入ECX
  00401154   . |0FAFC1        imul    eax, ecx                       ;  EAX*ECX
  00401157   . |0FAFC6        imul    eax, esi                       ;  EAX*ESI
  0040115A   . |0105 62214000 add     [402162], eax                  ;  累加于[402162]
  00401160   .^|EB C5         jmp     short 00401127
  00401162   > |A1 62214000   mov     eax, [402162]                  ;  累加和入EAX
  00401167   . |6BC0 4D       imul    eax, eax, 4D                   ;  EAX*4D
  0040116A   . |3D 6654F300   cmp     eax, 0F35466                   ;  EAX=0F35466 ?
  0040116F   . |75 20         jnz     short 00401191                 ;  不等,则完蛋,否则,成功
  00401171   . |68 00200000   push    2000                           ; /Style = MB_OK|MB_TASKMODAL
  00401176   . |68 01204000   push    00402001                       ; |duelist's crackme #3
  0040117B   . |68 17204000   push    00402017                       ; |congratulations! please send a screenshot of your solution to duelist@beer.com!
  00401180   . |6A 00         push    0                              ; |hOwner = NULL
  00401182   . |E8 55010000   call    <jmp.&USER32.MessageBoxA>      ; \MessageBoxA
  00401187   . |B8 01000000   mov     eax, 1
  0040118C   .^|E9 69FFFFFF   jmp     004010FA
  00401191   > |68 00200000   push    2000                           ; /Style = MB_OK|MB_TASKMODAL
  00401196   . |68 01204000   push    00402001                       ; |duelist's crackme #3
  0040119B   . |68 68204000   push    00402068                       ; |your registration info is invalid... please support shareware authors by buying software!
  004011A0   . |6A 00         push    0                              ; |hOwner = NULL
  004011A2   . |E8 35010000   call    <jmp.&USER32.MessageBoxA>      ; \MessageBoxA
  算法比较简单,地址[4020FE]处为一个19个字节的表0x16, 0x49, 0x5E, 0x15, 0x27, 0x26, 0x21, 0x25, 0x1D, 0x59, 0x53, 0x37, 0x31, 0x48, 0x5D, 0x0C, 0x61, 0x52, 0x4D。
  进一步跟踪发现各按钮对应的代号,为了和注册机一致,我把每个代号都减了1,18个按钮的代号如下:
  16  1   2   0   7   5   6  9  10
  3  11  12  13  14  15  17  4  8  
  如我用注册机算出的一个号码为25726,转化为二进制110010001111110,把对应1位的选中就可以了,如
   
  注册机源码如下:
  #include<iostream.h>
  void main()
  {
          long unsigned loop=262143;
          long unsigned i,itemp,EAX,count,sum;
          char table[19]={0x16, 0x49, 0x5E, 0x15, 0x27, 0x26, 0x21, 0x25, 0x1D, 0x59, 0x53, 0x37, 0x31,
  
                  0x48, 0x5D, 0x0C, 0x61, 0x52, 0x4D};
          for(i=0;i<loop;i++)
          {
                  sum=0;
                  count=0;itemp=i;
                  do
                  {
                          if(itemp%2==1){EAX=table[count]*table[count+1]*(count+1);sum+=EAX;}
                          count++;
                          itemp/=2;
                  }
                  while(itemp);
                  if(sum*0x4d==0xf35466)
                  {
                          cout<<i<<endl;
                  }
          }
  }
  我只找到了一个正确答案,可能也只有一个正确答案。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2006年08月10日 下午 11:26:39


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (3)
雪    币: 207
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
ding ding
2006-11-18 21:26
0
雪    币: 263
活跃值: (10)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
3
这样看不下去,自己调试一下反而清楚,我大概是搞不出来的,顶一下大侠,
2006-11-18 22:07
0
雪    币: 45
活跃值: (55)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
其实真心不知道lz的注册机写的是什么意思
2013-2-9 23:34
0
游客
登录 | 注册 方可回帖
返回
//