七巧板游戏Tangram-7 V1.1 算法分析及算法注册机
【破文标题】七巧板游戏Tangram-7 V1.1 算法分析及算法注册机【破文作者】zaas
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件名称】Tangram-7 V1.1
【更新时间】2010-2-11
【软件类别】国外软件/游戏
【软件语言】英文
【应用平台】WinXP/2000/2003/Vista
【软件性质】共享(收费)软件
【软件大小】7.8M
【原版下载】http://download.cnet.com/Tangram-7/3000-18536_4-10973833.html
【保护方式】注册码
【软件简介】七巧板是一种智力游戏,顾名思义,是由七块板组成的。而这七这块板可拼成许多图形(1600种以上),例如:三角形、平行四边形、不规则多边形、玩家也可以把它拼成各种人物、形象、动物、桥、房、塔等等,亦可是一些中、英文字母。七巧板的好处与用处简直是多不胜数
,以下是七巧板部分的好处与用处:形状概念、视觉分辨、认智技巧、视觉记忆、手眼协调、鼓励开放、扩散思考、创作机会。
无论在现代或古代,七巧板都是用以启发幼儿智力的良好伙伴。能够把幼儿对实物与形态之间的桥梁连接起来,培养幼儿的观察力、想像力、形状分析及创意逻辑上都有巨大的发展空间。
现在被家长们广泛采用来帮助小孩学习基本逻辑关系和数学概念。可以帮助孩子认识各种几何图形、数字、认识周长和面积的意义,了解毕氏定理。
七巧板还可以教导小朋友辨认颜色,引导小朋友领悟图形的分割与合成,进而增强小朋友的手部智能、耐性和观察力。亦可用以说故事,将数十幅七巧板图片连成一幅幅的连惯图画,即可当漫画般说故给小朋友听。先拼出数款猫、几款狗、一间屋,即可说出一美妙动人的故事。
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------
【破解内容】
--------------------------------------------------------------
**************************************************************
用PEiD查壳,Microsoft Visual Studio .NET 2005 -- 2008 -> Microsoft Corporation *
**************************************************************
输入错误的注册码,有提示”、“Wrong key”,但搜索字符串无结果。
下断的过程不再说了,有细心和耐心就够了,直接来到注册验证部分。
Part1:注册码整理:
00409080 $81EC 24030000 sub esp, 324
00409086 .A1 04804100 mov eax, dword ptr
0040908B .33C4 xor eax, esp
0040908D .898424 200300>mov dword ptr , eax
00409094 .53 push ebx
00409095 .56 push esi
00409096 .33DB xor ebx, ebx
00409098 .33C9 xor ecx, ecx
0040909A .33F6 xor esi, esi
0040909C .8D6424 00 lea esp, dword ptr
004090A0 >8A86 90465000 mov al, byte ptr ;假码字符入al
004090A6 .3AC3 cmp al, bl ;结束了吗?
004090A8 .0F84 9D000000 je 0040914B
004090AE .3C 30 cmp al, 30 ;跟0比较
004090B0 .72 04 jb short 004090B6
004090B2 .3C 39 cmp al, 39 ;和9比较
004090B4 .76 0A jbe short 004090C0
004090B6 >8AD0 mov dl, al ;入dl
004090B8 .80EA 61 sub dl, 61 ;-61
004090BB .80FA 05 cmp dl, 5 ;和5比较
004090BE .77 0A ja short 004090CA ;大于则跳也就是比较是否大于f,大于则直接取下一个
004090C0 >88840C 280100>mov byte ptr , al
004090C7 .83C1 01 add ecx, 1 ;计数器+1
004090CA >8A86 91465000 mov al, byte ptr ;下一字符
004090D0 .3AC3 cmp al, bl
004090D2 .74 77 je short 0040914B
004090D4 .3C 30 cmp al, 30
004090D6 .72 04 jb short 004090DC
004090D8 .3C 39 cmp al, 39
004090DA .76 0A jbe short 004090E6
004090DC >8AD0 mov dl, al
004090DE .80EA 61 sub dl, 61
004090E1 .80FA 05 cmp dl, 5
004090E4 .77 0A ja short 004090F0
004090E6 >88840C 280100>mov byte ptr , al
004090ED .83C1 01 add ecx, 1
004090F0 >8A86 92465000 mov al, byte ptr ;第三字符/////为什么不用循环呢。。。。
004090F6 .3AC3 cmp al, bl
004090F8 .74 51 je short 0040914B
004090FA .3C 30 cmp al, 30
004090FC .72 04 jb short 00409102
004090FE .3C 39 cmp al, 39
00409100 .76 0A jbe short 0040910C
00409102 >8AD0 mov dl, al
00409104 .80EA 61 sub dl, 61
00409107 .80FA 05 cmp dl, 5
0040910A .77 0A ja short 00409116
0040910C >88840C 280100>mov byte ptr , al
00409113 .83C1 01 add ecx, 1
00409116 >8A86 93465000 mov al, byte ptr
0040911C .3AC3 cmp al, bl
0040911E .74 2B je short 0040914B
00409120 .3C 30 cmp al, 30
00409122 .72 04 jb short 00409128
00409124 .3C 39 cmp al, 39
00409126 .76 0A jbe short 00409132
00409128 >8AD0 mov dl, al
0040912A .80EA 61 sub dl, 61
0040912D .80FA 05 cmp dl, 5
00409130 .77 0A ja short 0040913C
00409132 >88840C 280100>mov byte ptr , al
00409139 .83C1 01 add ecx, 1
0040913C >83C6 04 add esi, 4 ;一个dword为一组循环
0040913F .81FE 00010000 cmp esi, 100
00409145 .^ 0F8C 55FFFFFF jl 004090A0
0040914B >83F9 1C cmp ecx, 1C ;一共1C位注册码,注册码格式为0-f(小写)
0040914E .74 19 je short 00409169
注册码共34位,经以上处理去掉假码中分段的“-”
注册码的字符范围在“0-9”或者“a-f”之间
Part2:假码整理:
00409150 .5E pop esi
00409151 .33C0 xor eax, eax
00409153 .5B pop ebx
00409154 .8B8C24 200300>mov ecx, dword ptr
0040915B .33CC xor ecx, esp
0040915D .E8 51220000 call 0040B3B3
00409162 .81C4 24030000 add esp, 324
00409168 .C3 retn
00409169 >8D8424 280200>lea eax, dword ptr
00409170 .50 push eax
00409171 .889C24 480100>mov byte ptr , bl
00409178 .33F6 xor esi, esi
0040917A .E8 21020000 call 004093A0 ;算法-》机器码字符串A
0040917F .83C4 04 add esp, 4
00409182 .33C9 xor ecx, ecx
00409184 .EB 0A jmp short 00409190
00409186 .8DA424 000000>lea esp, dword ptr
0040918D .8D49 00 lea ecx, dword ptr
00409190 >8A840C 280200>mov al, byte ptr ;字符串A处理方式同假码
00409197 .3AC3 cmp al, bl
00409199 .0F84 8C000000 je 0040922B
0040919F .3C 30 cmp al, 30
004091A1 .7C 04 jl short 004091A7
004091A3 .3C 39 cmp al, 39
004091A5 .7E 08 jle short 004091AF
004091A7 >3C 61 cmp al, 61
004091A9 .7C 0B jl short 004091B6
004091AB .3C 66 cmp al, 66
004091AD .7F 07 jg short 004091B6
004091AF >884434 28 mov byte ptr , al
004091B3 .83C6 01 add esi, 1
004091B6 >8A840C 290200>mov al, byte ptr
004091BD .3AC3 cmp al, bl
004091BF .74 6A je short 0040922B
004091C1 .3C 30 cmp al, 30
004091C3 .7C 04 jl short 004091C9
004091C5 .3C 39 cmp al, 39
004091C7 .7E 08 jle short 004091D1
004091C9 >3C 61 cmp al, 61
004091CB .7C 0B jl short 004091D8
004091CD .3C 66 cmp al, 66
004091CF .7F 07 jg short 004091D8
004091D1 >884434 28 mov byte ptr , al
004091D5 .83C6 01 add esi, 1
004091D8 >8A840C 2A0200>mov al, byte ptr
004091DF .3AC3 cmp al, bl
004091E1 .74 48 je short 0040922B
004091E3 .3C 30 cmp al, 30
004091E5 .7C 04 jl short 004091EB
004091E7 .3C 39 cmp al, 39
004091E9 .7E 08 jle short 004091F3
004091EB >3C 61 cmp al, 61
004091ED .7C 0B jl short 004091FA
004091EF .3C 66 cmp al, 66
004091F1 .7F 07 jg short 004091FA
004091F3 >884434 28 mov byte ptr , al
004091F7 .83C6 01 add esi, 1
004091FA >8A840C 2B0200>mov al, byte ptr
00409201 .3AC3 cmp al, bl
00409203 .74 26 je short 0040922B
00409205 .3C 30 cmp al, 30
00409207 .7C 04 jl short 0040920D
00409209 .3C 39 cmp al, 39
0040920B .7E 08 jle short 00409215
0040920D >3C 61 cmp al, 61
0040920F .7C 0B jl short 0040921C
00409211 .3C 66 cmp al, 66
00409213 .7F 07 jg short 0040921C
00409215 >884434 28 mov byte ptr , al
00409219 .83C6 01 add esi, 1
0040921C >83C1 04 add ecx, 4
0040921F .81F9 00010000 cmp ecx, 100
00409225 .^ 0F8C 65FFFFFF jl 00409190
0040922B >33C0 xor eax, eax
0040922D .83FE 1C cmp esi, 1C
00409230 .0F85 47010000 jnz 0040937D
00409236 .885C24 44 mov byte ptr , bl ;结尾设0
0040923A .885C24 16 mov byte ptr , bl ;转换后得到--》字符串B
此段获取序列号,并将序列号如假码般处理,也即34位去掉每四位的“-”,得到28位注册码
Part3:序列号处理:
0040923E .8BFF mov edi, edi
00409240 >8A4C44 28 mov cl, byte ptr ;字符串B取字符入cl
00409244 .8AD1 mov dl, cl
00409246 .80EA 30 sub dl, 30 ;-30
00409249 .80FA 09 cmp dl, 9 ;和9比较
0040924C .77 04 ja short 00409252 ;分别字符与数字
0040924E .8ACA mov cl, dl
00409250 .EB 03 jmp short 00409255
00409252 >80E9 57 sub cl, 57 ;字母-57,数字-30
00409255 >8A5444 29 mov dl, byte ptr ;下一位
00409259 .8ADA mov bl, dl
0040925B .80EB 30 sub bl, 30
0040925E .80FB 09 cmp bl, 9
00409261 .77 04 ja short 00409267
00409263 .8AD3 mov dl, bl
00409265 .EB 03 jmp short 0040926A
00409267 >80EA 57 sub dl, 57
0040926A >C0E1 04 shl cl, 4 ;上一字符处理后左移一位
0040926D .02CA add cl, dl ;和这一字符组合
0040926F .8A5444 2A mov dl, byte ptr ;第三字符
00409273 .884C04 08 mov byte ptr , cl
00409277 .8ACA mov cl, dl
00409279 .80E9 30 sub cl, 30
0040927C .80F9 09 cmp cl, 9
0040927F .76 05 jbe short 00409286
00409281 .80EA 57 sub dl, 57
00409284 .8ACA mov cl, dl
00409286 >8A5444 2B mov dl, byte ptr ;第四字符
0040928A .8ADA mov bl, dl
0040928C .80EB 30 sub bl, 30
0040928F .80FB 09 cmp bl, 9
00409292 .77 04 ja short 00409298
00409294 .8AD3 mov dl, bl
00409296 .EB 03 jmp short 0040929B
00409298 >80EA 57 sub dl, 57
0040929B >C0E1 04 shl cl, 4
0040929E .02CA add cl, dl
004092A0 .884C04 09 mov byte ptr , cl
004092A4 .83C0 02 add eax, 2 ;计数器+2
004092A7 .83F8 0E cmp eax, 0E ;28/2=14
004092AA .^ 7C 94 jl short 00409240 ;转换后得到--》字符串C
此段将机器码(序列号)每两位处理合成为一个字符,处理方法为:数字-&h30,字母-&h57
得到字符串C,28位机器码变为14位数值
Part4:假码处理:
004092AC .33C0 xor eax, eax
004092AE .884424 26 mov byte ptr , al
004092B2 >8A8C44 280100>mov cl, byte ptr ;假码同上处理得到--》假码B
004092B9 .8AD1 mov dl, cl
004092BB .80EA 30 sub dl, 30
004092BE .80FA 09 cmp dl, 9
004092C1 .77 04 ja short 004092C7
004092C3 .8ACA mov cl, dl
004092C5 .EB 03 jmp short 004092CA
004092C7 >80E9 57 sub cl, 57
004092CA >8A9444 290100>mov dl, byte ptr
004092D1 .8ADA mov bl, dl
004092D3 .80EB 30 sub bl, 30
004092D6 .80FB 09 cmp bl, 9
004092D9 .77 04 ja short 004092DF
004092DB .8AD3 mov dl, bl
004092DD .EB 03 jmp short 004092E2
004092DF >80EA 57 sub dl, 57
004092E2 >C0E1 04 shl cl, 4
004092E5 .02CA add cl, dl
004092E7 .8A9444 2A0100>mov dl, byte ptr
004092EE .884C04 18 mov byte ptr , cl
004092F2 .8ACA mov cl, dl
004092F4 .80E9 30 sub cl, 30
004092F7 .80F9 09 cmp cl, 9
004092FA .76 05 jbe short 00409301
004092FC .80EA 57 sub dl, 57
004092FF .8ACA mov cl, dl
00409301 >8A9444 2B0100>mov dl, byte ptr
00409308 .8ADA mov bl, dl
0040930A .80EB 30 sub bl, 30
0040930D .80FB 09 cmp bl, 9
00409310 .77 04 ja short 00409316
00409312 .8AD3 mov dl, bl
00409314 .EB 03 jmp short 00409319
00409316 >80EA 57 sub dl, 57
00409319 >C0E1 04 shl cl, 4
0040931C .02CA add cl, dl
0040931E .884C04 19 mov byte ptr , cl
00409322 .83C0 02 add eax, 2
00409325 .83F8 0E cmp eax, 0E
00409328 .^ 7C 88 jl short 004092B2
此段对假码的处理方法同序列号。我的疑问是,为什么作者 不用模块化的方法写代码,徒增代码量尔。。。
Part5:真假码比较的过程:
0040932A .B3 01 mov bl, 1
0040932C .33F6 xor esi, esi
0040932E .8BFF mov edi, edi
00409330 >32C0 xor al, al
00409332 .83FE 0E cmp esi, 0E
00409335 .8BCE mov ecx, esi
00409337 .7D 13 jge short 0040934C ;各位机器码(序列号的ascii相加),每次取的时候去掉第一位
00409339 .8DA424 000000>lea esp, dword ptr
00409340 >02440C 08 add al, byte ptr ;取字符串C字符相加入al
00409344 .83C1 01 add ecx, 1 ;计数器+1
00409347 .83F9 0E cmp ecx, 0E
0040934A .^ 7C F4 jl short 00409340
0040934C >0FB65434 08 movzx edx, byte ptr ;取字符串C字符入edx
00409351 .0FB6C8 movzx ecx, al ;al 入ecx
00409354 .C0E9 04 shr cl, 4 ;右移一位
00409357 .02C8 add cl, al ;和al相加
00409359 .52 push edx ;push edx 保存的是字符串C首字母
0040935A .83E1 0F and ecx, 0F ;去掉第二位
0040935D .8B048D 008D41>mov eax, dword ptr ;根据余数的不同,套用不同的算法
00409364 .FFD0 call eax ;此call是算法的关键
00409366 .83C4 04 add esp, 4
00409369 .3A4434 18 cmp al, byte ptr ;假码B字符和al比较
0040936D .0F94C1 sete cl ;爆破点
00409370 .83C6 01 add esi, 1 ;计数器+1
00409373 .22D9 and bl, cl ;and 结果为1 成功
00409375 .83FE 0E cmp esi, 0E
00409378 .^ 7C B6 jl short 00409330
0040937A .0FBEC3 movsx eax, bl
0040937D >8B8C24 280300>mov ecx, dword ptr
00409384 .5E pop esi
00409385 .5B pop ebx
00409386 .33CC xor ecx, esp
00409388 .E8 26200000 call 0040B3B3
0040938D .81C4 24030000 add esp, 324
00409393 .C3 retn
序列号的代码和假码的代码处理完毕,进行比较了。sete cl +and bl, cl的处理结果:注册码一次为0则结果永远为0,也即注册失败。。。
Part6:机器码怎么来的:
跟进:
0040917A .E8 21020000 call 004093A0 ;算法-》机器码字符串A
004093A0/$81EC 58020000 sub esp, 258
004093A6|.A1 04804100 mov eax, dword ptr
004093AB|.33C4 xor eax, esp
004093AD|.898424 540200>mov dword ptr , eax
004093B4|.8B8424 5C0200>mov eax, dword ptr
004093BB|.53 push ebx
004093BC|.55 push ebp
004093BD|.56 push esi
004093BE|.57 push edi
004093BF|.8D4C24 18 lea ecx, dword ptr
004093C3|.51 push ecx ; /pBufferSize
004093C4|.8D5424 60 lea edx, dword ptr ; |
004093C8|.52 push edx ; |Buffer
004093C9|.894424 1C mov dword ptr , eax ; |
004093CD|.C74424 20 040>mov dword ptr , 104 ; |
004093D5|.FF15 98514100 call dword ptr [<&KERNEL32.GetCompute>; \GetComputerNameW
004093DB|.8D4424 5C lea eax, dword ptr ;取得计算机名unicode
004093DF|.50 push eax ; /String
004093E0|.66:C74424 5C >mov word ptr , 0 ; |
004093E7|.FF15 94514100 call dword ptr [<&KERNEL32.lstrlenW>] ; \计算机名长度2
004093ED|.83F8 0E cmp eax, 0E ;计算机名长度小于14位
004093F0|.7C 14 jl short 00409406
004093F2|.6A 0E push 0E ; /n = E (14.)
004093F4|.8D4C24 60 lea ecx, dword ptr ; |
004093F8|.51 push ecx ; |String2
004093F9|.8D5424 44 lea edx, dword ptr ; |
004093FD|.52 push edx ; |String1
004093FE|.FF15 90514100 call dword ptr [<&KERNEL32.lstrcpynW>>; \lstrcpynW
00409404|.EB 3B jmp short 00409441
00409406|>33D2 xor edx, edx
00409408|.8D1C00 lea ebx, dword ptr ;ebx=len(name)*2
0040940B|.8D7C24 3C lea edi, dword ptr
0040940F|.90 nop
00409410|>33C9 /xor ecx, ecx
00409412|.85C0 |test eax, eax
00409414|.7E 22 |jle short 00409438
00409416|.8BF7 |mov esi, edi
00409418|>8D2C11 |/lea ebp, dword ptr
0040941B|.83FD 0E ||cmp ebp, 0E
0040941E|.7D 0E ||jge short 0040942E
00409420|.66:8B6C4C 5C||mov bp, word ptr ;取得name字符1
00409425|.66:03EA ||add bp, dx
00409428|.66:03E9 ||add bp, cx ;+计数器
0040942B|.66:892E ||mov word ptr , bp
0040942E|>83C1 01 ||add ecx, 1 ;计数器+1
00409431|.83C6 02 ||add esi, 2
00409434|.3BC8 ||cmp ecx, eax
00409436|.^ 7C E0 |\jl short 00409418
00409438|>03D0 |add edx, eax ;eax=len(name)
0040943A|.03FB |add edi, ebx
0040943C|.83FA 0E |cmp edx, 0E ;变为14位字符串M
0040943F|.^ 7C CF \jl short 00409410
00409441|>C64424 38 00mov byte ptr , 0
00409446|.33D2 xor edx, edx
00409448|.EB 06 jmp short 00409450
0040944A| 8D9B 00000000 lea ebx, dword ptr
00409450|>8A4414 3D /mov al, byte ptr ;取字符串M字符
00409454|.024414 3C |add al, byte ptr
00409458|.8AC8 |mov cl, al
0040945A|.C0E8 04 |shr al, 4 ;右移4位
0040945D|.0FBEC0 |movsx eax, al
00409460|.83C0 FF |add eax, -1 ;-1
00409463|.80E1 0F |and cl, 0F ;字符串M字符保留个位
00409466|.83F8 0E |cmp eax, 0E ;Switch (cases 0..E)
00409469|.77 43 |ja short 004094AE ;大于E则=0
0040946B|.FF2485 B89540>|jmp dword ptr
00409472|>B0 66 |mov al, 66 ;Case E of switch 00409466
00409474|.EB 3A |jmp short 004094B0
00409476|>B0 65 |mov al, 65 ;Case D of switch 00409466
00409478|.EB 36 |jmp short 004094B0
0040947A|>B0 64 |mov al, 64 ;Case C of switch 00409466
0040947C|.EB 32 |jmp short 004094B0
0040947E|>B0 63 |mov al, 63 ;Case B of switch 00409466
00409480|.EB 2E |jmp short 004094B0
00409482|>B0 62 |mov al, 62 ;Case A of switch 00409466
00409484|.EB 2A |jmp short 004094B0
00409486|>B0 61 |mov al, 61 ;Case 9 of switch 00409466
00409488|.EB 26 |jmp short 004094B0
0040948A|>B0 39 |mov al, 39 ;Case 8 of switch 00409466
0040948C|.EB 22 |jmp short 004094B0
0040948E|>B0 38 |mov al, 38 ;Case 7 of switch 00409466
00409490|.EB 1E |jmp short 004094B0
00409492|>B0 37 |mov al, 37 ;Case 6 of switch 00409466
00409494|.EB 1A |jmp short 004094B0
00409496|>B0 36 |mov al, 36 ;Case 5 of switch 00409466
00409498|.EB 16 |jmp short 004094B0
0040949A|>B0 35 |mov al, 35 ;Case 4 of switch 00409466
0040949C|.EB 12 |jmp short 004094B0
0040949E|>B0 34 |mov al, 34 ;Case 3 of switch 00409466
004094A0|.EB 0E |jmp short 004094B0
004094A2|>B0 33 |mov al, 33 ;Case 2 of switch 00409466
004094A4|.EB 0A |jmp short 004094B0
004094A6|>B0 32 |mov al, 32 ;Case 1 of switch 00409466
004094A8|.EB 06 |jmp short 004094B0
004094AA|>B0 31 |mov al, 31 ;Case 0 of switch 00409466
004094AC|.EB 02 |jmp short 004094B0
004094AE|>B0 30 |mov al, 30 ;Default case of switch 00409466
004094B0|>884414 1C |mov byte ptr , al
004094B4|.0FBEC1 |movsx eax, cl
004094B7|.83C0 FF |add eax, -1 ;Switch (cases 1..F)
004094BA|.83F8 0E |cmp eax, 0E
004094BD|.77 43 |ja short 00409502
004094BF|.FF2485 F49540>|jmp dword ptr
004094C6|>B0 66 |mov al, 66 ;Case F of switch 004094B7
004094C8|.EB 3A |jmp short 00409504
004094CA|>B0 65 |mov al, 65 ;Case E of switch 004094B7
004094CC|.EB 36 |jmp short 00409504
004094CE|>B0 64 |mov al, 64 ;Case D of switch 004094B7
004094D0|.EB 32 |jmp short 00409504
004094D2|>B0 63 |mov al, 63 ;Case C of switch 004094B7
004094D4|.EB 2E |jmp short 00409504
004094D6|>B0 62 |mov al, 62 ;Case B of switch 004094B7
004094D8|.EB 2A |jmp short 00409504
004094DA|>B0 61 |mov al, 61 ;Case A of switch 004094B7
004094DC|.EB 26 |jmp short 00409504
004094DE|>B0 39 |mov al, 39 ;Case 9 of switch 004094B7
004094E0|.EB 22 |jmp short 00409504
004094E2|>B0 38 |mov al, 38 ;Case 8 of switch 004094B7
004094E4|.EB 1E |jmp short 00409504
004094E6|>B0 37 |mov al, 37 ;Case 7 of switch 004094B7
004094E8|.EB 1A |jmp short 00409504
004094EA|>B0 36 |mov al, 36 ;Case 6 of switch 004094B7
004094EC|.EB 16 |jmp short 00409504
004094EE|>B0 35 |mov al, 35 ;Case 5 of switch 004094B7
004094F0|.EB 12 |jmp short 00409504
004094F2|>B0 34 |mov al, 34 ;Case 4 of switch 004094B7
004094F4|.EB 0E |jmp short 00409504
004094F6|>B0 33 |mov al, 33 ;Case 3 of switch 004094B7
004094F8|.EB 0A |jmp short 00409504
004094FA|>B0 32 |mov al, 32 ;Case 2 of switch 004094B7
004094FC|.EB 06 |jmp short 00409504
004094FE|>B0 31 |mov al, 31 ;Case 1 of switch 004094B7
00409500|.EB 02 |jmp short 00409504
00409502|>B0 30 |mov al, 30 ;Default case of switch 004094B7
00409504|>884414 1D |mov byte ptr , al
00409508|.83C2 02 |add edx, 2
0040950B|.83FA 1C |cmp edx, 1C ;28位
0040950E|.^ 0F8C 3CFFFFFF \jl 00409450
00409514|.8B4424 14 mov eax, dword ptr
00409518|.8D4C24 1C lea ecx, dword ptr
0040951C|.51 push ecx ; /String
0040951D|.C600 00 mov byte ptr , 0 ; |
00409520|.33F6 xor esi, esi ; |
00409522|.FF15 C0514100 call dword ptr [<&KERNEL32.lstrlenA>] ; \lstrlenA
00409528|.85C0 test eax, eax ;取得长度1c
0040952A|.7E 73 jle short 0040959F
0040952C|.8B2D DC514100 mov ebp, dword ptr [<&KERNEL32.lstrc>;kernel32.lstrcatA
00409532|.8D5C24 1C lea ebx, dword ptr
00409536|.83EB 01 sub ebx, 1
00409539|.8DA424 000000>lea esp, dword ptr
00409540|>8B4C24 14 /mov ecx, dword ptr
00409544|.8A5433 01 |mov dl, byte ptr
00409548|.8D4424 10 |lea eax, dword ptr
0040954C|.8D7E 01 |lea edi, dword ptr
0040954F|.50 |push eax
00409550|.51 |push ecx
00409551|.885424 18 |mov byte ptr , dl
00409555|.C64424 19 00|mov byte ptr , 0
0040955A|.FFD5 |call ebp
0040955C|.85F6 |test esi, esi
0040955E|.74 2E |je short 0040958E
00409560|.8D5424 1C |lea edx, dword ptr
00409564|.52 |push edx ; /String
00409565|.FF15 C0514100 |call dword ptr [<&KERNEL32.lstrlenA>>; \lstrlenA
0040956B|.83E8 01 |sub eax, 1
0040956E|.3BF0 |cmp esi, eax
00409570|.74 1C |je short 0040958E
00409572|.8BC7 |mov eax, edi
00409574|.25 03000080 |and eax, 80000003
00409579|.79 05 |jns short 00409580
0040957B|.48 |dec eax
0040957C|.83C8 FC |or eax, FFFFFFFC
0040957F|.40 |inc eax
00409580|>75 0C |jnz short 0040958E
00409582|.8B4C24 14 |mov ecx, dword ptr
00409586|.68 7C694100 |push 0041697C
0040958B|.51 |push ecx
0040958C|.FFD5 |call ebp
0040958E|>8D5424 1C |lea edx, dword ptr
00409592|.52 |push edx ; /String
00409593|.8BF7 |mov esi, edi ; |
00409595|.FF15 C0514100 |call dword ptr [<&KERNEL32.lstrlenA>>; \lstrlenA
0040959B|.3BF0 |cmp esi, eax
0040959D|.^ 7C A1 \jl short 00409540
0040959F|>8B8C24 640200>mov ecx, dword ptr
004095A6|.5F pop edi
004095A7|.5E pop esi
004095A8|.5D pop ebp
004095A9|.5B pop ebx
004095AA|.33CC xor ecx, esp
004095AC|.E8 021E0000 call 0040B3B3 ;四个一组加上“-”
004095B1|.81C4 58020000 add esp, 258
004095B7\.C3 retn
机器码根据计算机名而来,根据计算机名的长度,计算机名的ascii码每次+2循环取够28位,然后根据尾数的不同取不同的字符,每四个一组加上“-”即为序列号(机器码)
Part7:最终的算法:
跟进:
0040935D .8B048D 008D41>mov eax, dword ptr ;根据余数的不同,套用不同的算法
00409364 .FFD0 call eax
00409680 .0FB64424 04 movzx eax, byte ptr ;取字符串C字符?
00409685 .35 8F000000 xor eax, 8F ;xor 8F
0040968A .C3 retn
根据part5 mod 16所得的余数0-F,分别不同的Xor 1F,2F,....9F,AA,BB,CC,DD,EE,FF,得到一组数值,和假码经过相同处理得到的数值一一比对,如果全部一致则注册成功,否则注册失败。。。
【破解总结】
软件的爆破点在于:
0040936D .0F94C1 sete cl ;爆破点
cl的值。需要注意的是,当软件选择第>7的拼图后,软件会在不同位置做一次验证,验证不通过即使爆破显示注册成功了一样有限制。该位置在:
0040999D .0F94C1 sete cl
004099A0 .83C6 01 add esi, 1
004099A3 .22D9 and bl, cl
004099A5 .83FE 0E cmp esi, 0E
004099A8 .^ 7C B6 jl short 00409960
如果要爆破需修改以上两处。
【算法总结】软件并非明码比较。
第一步:软件去掉序列号和注册码中的“-”;
第二步:软件会把机器码和注册码每两位按照数字-&h30,字母-&h57的方式进行第一次处理:
处理后的数字A*16+处理后的数字B得到字符串C
第三步:
字符串C各位ascii相加,每次取的时候去掉第一位,根据mod 16的余数选择不同的数字 XOR
和同样处理后的注册码各位数值比较,全部相等则注册成功。否则失败。
综上所述,写出VB注册机。鉴于VB代码过长,不再附录。仅给出注册机。
http://52pojie.cn/thread-39606-1-1.html
【版权声明】破文是学习的手记,兴趣是成功的源泉;本破文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 谢谢
沙发学习
新年快乐
:handshake 谢谢分享!用着不错 zaas大侠又发破文了啊,支持支持~~ 学习到了 非常感谢 文章很详细,谢谢分享,新年快乐。 zaas 是哪個大牛的馬甲嗎? zaas 是哪個大牛的馬甲嗎?
ZeNiX 发表于 2010-2-23 11:24 http://52pojie.cn/images/common/back.gif
:rggrg俺不是马甲,真的是新人。刚刚对汇编有了一点点认识。。。
搞定winlicence的ZeNiX才是大牛。 学习下,呵呵 好好的学习下,呵呵
页:
[1]
2