吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 5836|回复: 1
收起左侧

[分享] mar2's crackme算法分析

[复制链接]
missviola 发表于 2009-11-29 11:20
【文章标题】: mar2's crackme算法分析
【文章作者】: missviola[LCG]
【下载地址】: http://bbs.pediy.com/showthread.php?t=102125
【使用工具】: PEID IDA
【操作平台】: window xp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  在看雪上看到了这个cm,发出来的大侠不希望把序列号发到看雪上,那我就直接发到52的坛子里吧。(正好昨天主公也下旨说要那啥了。。。)
  首先PEID查壳,显示为Nothing found *,直接IDA载入,分析如下:
  
  .text:00401197 push    ebp
  .text:00401198 mov     ebp, esp
  .text:0040119A push    edi
  .text:0040119B push    esi
  .text:0040119C push    ebx
  .text:0040119D push    64h
  .text:0040119F push    offset byte_403040
  .text:004011A4 push    195h
  .text:004011A9 push    dword ptr [ebp+8]
  .text:004011AC call    GetDlgItemTextA
  .text:004011B1 cmp     eax, 6                          ; 长度要为6位
  .text:004011B4 jnz     loc_4012FB
  .text:004011BA xor     edi, edi
  .text:004011BC
  .text:004011BC loc_4011BC:                             ; CODE XREF: .text:004011D8j
  .text:004011BC cmp     byte ptr [edi+403040h], 32h     ; 每一位不能小于2
  .text:004011C3 jl      loc_4012FB
  .text:004011C9 cmp     byte ptr [edi+403040h], 39h     ; 每一位不能大于9
  .text:004011D0 jg      loc_4012FB
  .text:004011D6 inc     edi
  .text:004011D7 dec     eax
  .text:004011D8 jnz     short loc_4011BC
  .text:004011DA nop
  .text:004011DB nop
  .text:004011DC nop
  .text:004011DD nop
  .text:004011DE nop
  .text:004011DF xor     ecx, ecx
  .text:004011E1
  .text:004011E1 loc_4011E1:                             ; CODE XREF: .text:004011FCj
  .text:004011E1 mov     al, [ecx+403040h]
  .text:004011E7 sub     al, 30h                         ; 每一位ASCII值减去0x30h
  .text:004011E9 db      3Eh
  .text:004011E9 mov     byte ptr word_403050[ecx*2], al
  .text:004011F1 db      3Eh
  .text:004011F1 fild    word_403050[ecx*2]
  .text:004011F9 inc     ecx
  .text:004011FA cmp     ecx, edi
  .text:004011FC jnz     short loc_4011E1
  .text:004011FE nop
  .text:004011FF nop
  .text:00401200 nop
  .text:00401201 nop
  .text:00401202 nop
  .text:00401203 xor     esi, esi
  .text:00401205 xor     ecx, ecx
  .text:00401207
  .text:00401207 loc_401207:                             ; CODE XREF: .text:00401221j
  .text:00401207 db      3Eh
  .text:00401207 mov     al, byte ptr word_403050[ecx*2]
  .text:0040120F mul     eax
  .text:00401211 mul     byte ptr word_403050[ecx*2]     ; A三次方
  .text:00401218 mul     eax                             ; 再平方,相当于6次方
  .text:0040121A add     esi, eax                        ; 进行累加
  .text:0040121C inc     ecx
  .text:0040121D xor     eax, eax
  .text:0040121F cmp     ecx, edi
  .text:00401221 jnz     short loc_401207
  .text:00401223 mov     dword_4030A0, esi
  .text:00401229 nop
  .text:0040122A nop
  .text:0040122B nop
  .text:0040122C nop
  .text:0040122D nop
  .text:0040122E nop
  .text:0040122F nop
  .text:00401230 nop
  .text:00401231 nop
  .text:00401232 nop
  .text:00401233 nop
  .text:00401234 nop
  .text:00401235 mov     dword_403070, 0Ah               ; 0x0A送[403070]
  .text:0040123F fild    dword_403070
  .text:00401245 mov     dword_403080, 186A0h            ; 0x186A0送[403080] 0x186A0=100000
  .text:0040124F fild    dword_403080
  .text:00401255 fmul    st(7), st                       ; A[1]*100000
  .text:00401257 fdiv    st, st(1)                       ; 0x186A0 div 0xA
  .text:00401259 fmul    st(6), st                       ; A[2]*10000
  .text:0040125B fdiv    st, st(1)                       ; 10000 div 0xA
  .text:0040125D fmul    st(5), st                       ; A[3]*1000
  .text:0040125F fdiv    st, st(1)                       ; 1000 div 0xA
  .text:00401261 fmul    st(4), st                       ; A[4]*100
  .text:00401263 fdiv    st, st(1)                       ; 100 div 0xA
  .text:00401265 fmul    st(3), st                       ; A[5]*10
  .text:00401267 fmul    flt_403090                      ; 10*0
  .text:0040126D fadd    st, st(2)                       ; A[6]+0
  .text:0040126F fadd    st, st(3)
  .text:00401271 fadd    st, st(4)
  .text:00401273 fadd    st, st(5)
  .text:00401275 fadd    st, st(6)
  .text:00401277 fadd    st, st(7)                       ; 这里和的结果为你输入的serial
  .text:00401279 ffree   st(7)
  .text:0040127B fild    dword_4030A0                    ; 这里是各位的乘方的累加值
  .text:00401281 fcomp   st(1)
  
  到这里我们可以总结下cm的算法,serial为一个6位数,各位的6次方相加要等于这个数本身。拿出python随手写了个算号的
  小东西,代码如下:
  
  for k in range(222222,999999):
      a = k / 100000
      b = (k % 100000) / 10000
      c = (k % 10000) / 1000
      d = (k % 1000) / 100
      e = (k % 100) / 10
      f = k % 10
      if a**6 + b**6 + c**6 + d**6 + e**6 + f**6 == k:
          print k
  
  最后得出serial为548834,输入以后跳出了成功提示
  
--------------------------------------------------------------------------------
【经验总结】
  总的来说这个cm还是比较简单的,适合新手跟跟学习学习,顺便可以锻炼下编程能力 - -||||||
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于52pojie技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
                                                       2009年11月29日 11:14:07

免费评分

参与人数 1威望 +1 收起 理由
CHHSun + 1 感谢发布原创作品,[吾爱破解]因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

heihu 发表于 2009-11-30 21:46
膜拜一下
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-22 17:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表