好友
阅读权限 40
听众
最后登录 1970-1-1
【文章标题】: 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
免费评分
查看全部评分
发帖前要善用【论坛搜索 】 功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。