【破文标题】HTML to Image 2.0.2006.1001注册算法-MD5
【破文作者】XXNB
【作者邮箱】支持PYG
【作者主页】binbinbin7456.ys168.com
【破解工具】OD
【破解平台】XPsp2
【软件名称】HTML to Image 2.0.2006.1001
【软件大小】1762KB
【原版下载】http://www.onlinedown.net/soft/35519.htm
【保护方式】名+码
【软件简介】Html To Image可以容易、快捷地将任意的html页转换成图片或缩略图。最新的特征:可直接将给定网址的网页保存成bmp、jpeg
、tiff、gif、png格式的图片;由大图像生成缩略图;支持批量转换;嵌入IE浏览器的前后关联菜单中。
【破解声明】向前辈们学习!只为学习交流!
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------
这几天玩aspr壳,好晕啊。还是分析算法好!用peid的插件发现有几个加密算法,当时我就保佑它只用到MD5(这个我熟悉)。结果,万事
如意。作者没有加壳,我们直接进入主题:
1、OD载入,找了半天找不到断点。只好拿出DEDE。很快发现一个btnregist(偷笑),双击。还是那句话“找到关键断点,成功一半”。
输入注册信息:binbinbin。码:ACM-123456-123456-1234。注册码一定要类似这样的格式的,具体看我的分析。
得到:
0054A170 /. 55 push ebp
0054A171 |. 8BEC mov ebp, esp
0054A173 |. 33C9 xor ecx, ecx
0054A175 |. 51 push ecx
0054A176 |. 51 push ecx
0054A177 |. 51 push ecx
0054A178 |. 51 push ecx
0054A179 |. 53 push ebx
0054A17A |. 8BD8 mov ebx, eax
0054A17C |. 33C0 xor eax, eax
0054A17E |. 55 push ebp
0054A17F |. 68 9AA25400 push 0054A29A
0054A184 |. 64:FF30 push dword ptr fs:[eax]
0054A187 |. 64:8920 mov dword ptr fs:[eax], esp
0054A18A |. 8D55 F8 lea edx, dword ptr [ebp-8]
0054A18D |. 8B83 78030000 mov eax, dword ptr [ebx+378]
0054A193 |. E8 18E8F1FF call 004689B0
0054A198 |. 8B45 F8 mov eax, dword ptr [ebp-8] ; 用户名位数
0054A19B |. 8D55 FC lea edx, dword ptr [ebp-4]
0054A19E |. E8 85F3EBFF call 00409528
0054A1A3 |. 8B55 FC mov edx, dword ptr [ebp-4]
0054A1A6 |. 8D83 80040000 lea eax, dword ptr [ebx+480]
0054A1AC |. E8 6FA7EBFF call 00404920
0054A1B1 |. 8D55 F0 lea edx, dword ptr [ebp-10]
0054A1B4 |. 8B83 80030000 mov eax, dword ptr [ebx+380]
0054A1BA |. E8 F1E7F1FF call 004689B0
0054A1BF |. 8B45 F0 mov eax, dword ptr [ebp-10] ; 假码位数
0054A1C2 |. 8D55 F4 lea edx, dword ptr [ebp-C]
0054A1C5 |. E8 5EF3EBFF call 00409528
0054A1CA |. 8B55 F4 mov edx, dword ptr [ebp-C] ; 假码
0054A1CD |. 8D83 84040000 lea eax, dword ptr [ebx+484]
0054A1D3 |. E8 48A7EBFF call 00404920 ; 上面都是对称的
0054A1D8 |. 83BB 80040000>cmp dword ptr [ebx+480], 0 ; 用户名是否为空
0054A1DF |. 75 20 jnz short 0054A201
0054A1E1 |. BA ACA25400 mov edx, 0054A2AC ; p
0054A1E6 |. 8B83 B4030000 mov eax, dword ptr [ebx+3B4]
0054A1EC |. E8 D774FAFF call 004F16C8
0054A1F1 |. 8B83 78030000 mov eax, dword ptr [ebx+378]
0054A1F7 |. 8B10 mov edx, dword ptr [eax]
0054A1F9 |. FF92 C4000000 call dword ptr [edx+C4]
0054A1FF |. EB 6B jmp short 0054A26C
0054A201 |> 83BB 84040000>cmp dword ptr [ebx+484], 0 ; 输入注册码没有
0054A208 |. 75 20 jnz short 0054A22A
0054A20A |. BA E0A25400 mov edx, 0054A2E0 ; p
0054A20F |. 8B83 B4030000 mov eax, dword ptr [ebx+3B4]
0054A215 |. E8 AE74FAFF call 004F16C8
0054A21A |. 8B83 80030000 mov eax, dword ptr [ebx+380]
0054A220 |. 8B10 mov edx, dword ptr [eax]
0054A222 |. FF92 C4000000 call dword ptr [edx+C4]
0054A228 |. EB 42 jmp short 0054A26C
0054A22A |> 8BC3 mov eax, ebx
0054A22C |. E8 B7010000 call 0054A3E8 ;这个理所当然是算法call,《《《《《《《《《《《《《《
0054A231 |. 85C0 test eax, eax
0054A233 74 19 je short 0054A24E ;关键跳转。爆破点
0054A235 |. BA 30A35400 mov edx, 0054A330 ; t "Thank you for registration! All limitations are
removed now."
0054A23A |. 8B83 B4030000 mov eax, dword ptr [ebx+3B4] ;作者只用了第一个字母来表示成功和失败的信息,所以
0054A240 |. E8 8374FAFF call 004F16C8 ;字符串搜索的时候可以直接搜索“t”
0054A245 |. 8BC3 mov eax, ebx
0054A247 |. E8 FC040000 call 0054A748
0054A24C |. EB 1E jmp short 0054A26C
0054A24E |> BA B0A35400 mov edx, 0054A3B0 ; i "Invalid registration code!"
0054A253 |. 8B83 B4030000 mov eax, dword ptr [ebx+3B4]
0054A259 |. E8 6A74FAFF call 004F16C8
0054A25E |. 8B83 80030000 mov eax, dword ptr [ebx+380]
0054A264 |. 8B10 mov edx, dword ptr [eax]
0054A266 |. FF92 C4000000 call dword ptr [edx+C4]
0054A26C |> 33C0 xor eax, eax
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、跟进算法call:0054A22C |. E8 B7010000 call 0054A3E8,得到下面:具体的看注释
0054A3E8 /$ 55 push ebp
0054A3E9 |. 8BEC mov ebp, esp
0054A3EB |. B9 06000000 mov ecx, 6
0054A3F0 |> 6A 00 /push 0
0054A3F2 |. 6A 00 |push 0
0054A3F4 |. 49 |dec ecx
0054A3F5 |.^ 75 F9 \jnz short 0054A3F0
0054A3F7 |. 51 push ecx
0054A3F8 |. 53 push ebx
0054A3F9 |. 56 push esi
0054A3FA |. 57 push edi
0054A3FB |. 8BD8 mov ebx, eax
0054A3FD |. 33C0 xor eax, eax
0054A3FF |. 55 push ebp
0054A400 |. 68 2CA75400 push 0054A72C
0054A405 |. 64:FF30 push dword ptr fs:[eax]
0054A408 |. 64:8920 mov dword ptr fs:[eax], esp
0054A40B |. 8D45 FC lea eax, dword ptr [ebp-4]
0054A40E |. 8B93 80040000 mov edx, dword ptr [ebx+480] ; 用户名
0054A414 |. E8 4BA5EBFF call 00404964
0054A419 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0054A41C |. 8B93 84040000 mov edx, dword ptr [ebx+484] ; 假码
0054A422 |. E8 3DA5EBFF call 00404964
0054A427 |. 8D45 FC lea eax, dword ptr [ebp-4]
0054A42A |. 8B93 80040000 mov edx, dword ptr [ebx+480]
0054A430 |. E8 2FA5EBFF call 00404964
0054A435 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0054A438 |. 8B93 84040000 mov edx, dword ptr [ebx+484]
0054A43E |. E8 21A5EBFF call 00404964
0054A443 |. 8D45 FC lea eax, dword ptr [ebp-4]
0054A446 |. 8B93 80040000 mov edx, dword ptr [ebx+480]
0054A44C |. E8 13A5EBFF call 00404964
0054A451 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0054A454 |. 8B93 84040000 mov edx, dword ptr [ebx+484]
0054A45A |. E8 05A5EBFF call 00404964
0054A45F |. 33F6 xor esi, esi
0054A461 |. 8D45 FC lea eax, dword ptr [ebp-4]
0054A464 |. 8B93 80040000 mov edx, dword ptr [ebx+480]
0054A46A |. E8 F5A4EBFF call 00404964
0054A46F |. 8D45 F8 lea eax, dword ptr [ebp-8]
0054A472 |. 8B93 84040000 mov edx, dword ptr [ebx+484]
0054A478 |. E8 E7A4EBFF call 00404964
0054A47D |. 8B45 F8 mov eax, dword ptr [ebp-8]
0054A480 |. E8 17A7EBFF call 00404B9C
0054A485 |. 83F8 16 cmp eax, 16 ; 注册码要求16H位数的
0054A488 |. 0F85 83020000 jnz 0054A711
0054A48E |. 8B45 F8 mov eax, dword ptr [ebp-8] ; 假码
0054A491 |. E8 06A7EBFF call 00404B9C
0054A496 |. 83F8 16 cmp eax, 16
0054A499 |. 0F85 72020000 jnz 0054A711
0054A49F |. 8B45 F8 mov eax, dword ptr [ebp-8]
0054A4A2 |. E8 F5A6EBFF call 00404B9C ; 好像不用检测这么多次吧!!
0054A4A7 |. 83F8 16 cmp eax, 16 ; 作者的用意我想不通
0054A4AA |. 0F85 61020000 jnz 0054A711
0054A4B0 |. 8B45 F8 mov eax, dword ptr [ebp-8]
0054A4B3 |. E8 E4A6EBFF call 00404B9C
0054A4B8 |. 83F8 16 cmp eax, 16
0054A4BB |. 0F85 50020000 jnz 0054A711
0054A4C1 |. 8D4D EC lea ecx, dword ptr [ebp-14]
0054A4C4 |. BA 03000000 mov edx, 3
0054A4C9 |. 8B83 84040000 mov eax, dword ptr [ebx+484]
0054A4CF |. E8 C43FEFFF call 0043E498
0054A4D4 |. 8B45 EC mov eax, dword ptr [ebp-14] ; “ACM”
0054A4D7 |. BA 44A75400 mov edx, 0054A744 ; acm
0054A4DC |. E8 07A8EBFF call 00404CE8 ; 头三位应当为“ACM”
0054A4E1 |. 0F85 2A020000 jnz 0054A711
0054A4E7 |. 8B45 F8 mov eax, dword ptr [ebp-8] ; (ASCII "ACM-123456-123456-1234")
0054A4EA |. E8 ADA6EBFF call 00404B9C
0054A4EF |. 83F8 16 cmp eax, 16 ; 又检测
0054A4F2 |. 0F85 19020000 jnz 0054A711
0054A4F8 |. 8D4D E8 lea ecx, dword ptr [ebp-18]
0054A4FB |. BA 03000000 mov edx, 3
0054A500 |. 8B83 84040000 mov eax, dword ptr [ebx+484]
0054A506 |. E8 8D3FEFFF call 0043E498 ; 取字符函数
0054A50B |. 8B45 E8 mov eax, dword ptr [ebp-18]
0054A50E |. BA 44A75400 mov edx, 0054A744 ; acm
0054A513 |. E8 D0A7EBFF call 00404CE8
0054A518 |. 0F85 F3010000 jnz 0054A711
0054A51E |. 8B45 F8 mov eax, dword ptr [ebp-8]
0054A521 |. E8 76A6EBFF call 00404B9C
0054A526 |. 83F8 16 cmp eax, 16
0054A529 |. 0F85 E2010000 jnz 0054A711
0054A52F |. 8D4D E4 lea ecx, dword ptr [ebp-1C]
0054A532 |. BA 03000000 mov edx, 3
0054A537 |. 8B83 84040000 mov eax, dword ptr [ebx+484] ; 作者很喜欢重复重复重复的比较
0054A53D |. E8 563FEFFF call 0043E498
0054A542 |. 8B45 E4 mov eax, dword ptr [ebp-1C]
0054A545 |. BA 44A75400 mov edx, 0054A744 ; acm
0054A54A |. E8 99A7EBFF call 00404CE8
0054A54F |. 0F85 BC010000 jnz 0054A711
0054A555 |. 8D4D F8 lea ecx, dword ptr [ebp-8]
0054A558 |. BA 13000000 mov edx, 13 ; 常数
0054A55D |. 8B83 84040000 mov eax, dword ptr [ebx+484]
0054A563 |. E8 A83FEFFF call 0043E510
0054A568 |. 837D FC 00 cmp dword ptr [ebp-4], 0 ; 用户名输入没有
0054A56C |. 0F84 9F010000 je 0054A711
0054A572 |. 837D F8 00 cmp dword ptr [ebp-8], 0 ; 后面那部分有没有东西
0054A576 |. 0F84 95010000 je 0054A711
0054A57C |. 33DB xor ebx, ebx
0054A57E |> 8BFB /mov edi, ebx ; 循环开始
0054A580 |. 83C7 01 |add edi, 1 ; 计数器
0054A583 |. 71 05 |jno short 0054A58A
0054A585 |. E8 3294EBFF |call 004039BC
0054A58A |> 8B45 F8 |mov eax, dword ptr [ebp-8] ; 后面那部分
0054A58D |. 4F |dec edi
0054A58E |. 85C0 |test eax, eax
0054A590 |. 74 05 |je short 0054A597
0054A592 |. 3B78 FC |cmp edi, dword ptr [eax-4]
0054A595 |. 72 05 |jb short 0054A59C
0054A597 |> E8 1894EBFF |call 004039B4
0054A59C |> 47 |inc edi
0054A59D |. 807C38 FF 2D |cmp byte ptr [eax+edi-1], 2D ; 和2D“-”比较
0054A5A2 |. 74 2A |je short 0054A5CE
0054A5A4 |. 8D45 E0 |lea eax, dword ptr [ebp-20]
0054A5A7 |. 8B55 F8 |mov edx, dword ptr [ebp-8]
0054A5AA |. 4F |dec edi
0054A5AB |. 85D2 |test edx, edx
0054A5AD |. 74 05 |je short 0054A5B4
0054A5AF |. 3B7A FC |cmp edi, dword ptr [edx-4]
0054A5B2 |. 72 05 |jb short 0054A5B9
0054A5B4 |> E8 FB93EBFF |call 004039B4
0054A5B9 |> 47 |inc edi
0054A5BA |. 8A543A FF |mov dl, byte ptr [edx+edi-1]
0054A5BE |. E8 F1A4EBFF |call 00404AB4
0054A5C3 |. 8B55 E0 |mov edx, dword ptr [ebp-20]
0054A5C6 |. 8D45 F4 |lea eax, dword ptr [ebp-C]
0054A5C9 |. E8 D6A5EBFF |call 00404BA4
0054A5CE |> 43 |inc ebx
0054A5CF |. 83FB 13 |cmp ebx, 13
0054A5D2 |.^ 75 AA \jnz short 0054A57E ; 这个循环是检测和去掉这个符号“-”间隔符号
0054A5D4 |. 8D45 F8 lea eax, dword ptr [ebp-8]
0054A5D7 |. 8B55 F4 mov edx, dword ptr [ebp-C] ; 去掉符号后 的字符串:"1234561234561234"
0054A5DA |. E8 85A3EBFF call 00404964
0054A5DF |. 8D45 F4 lea eax, dword ptr [ebp-C]
0054A5E2 |. E8 E5A2EBFF call 004048CC
0054A5E7 |. 8B45 F8 mov eax, dword ptr [ebp-8]
0054A5EA |. E8 ADA5EBFF call 00404B9C ; 计算位数
0054A5EF |. 83F8 10 cmp eax, 10 ; 从这里我们看出,输入的假码要应该有3个“-”。哈哈
0054A5F2 0F85 19010000 jnz 0054A711 ; 这个10H害我想了好长时间。
0054A5F8 |. 33DB xor ebx, ebx
0054A5FA |> 8BC3 /mov eax, ebx
0054A5FC |. 25 01000080 |and eax, 80000001
0054A601 |. 79 05 |jns short 0054A608
0054A603 |. 48 |dec eax
0054A604 |. 83C8 FE |or eax, FFFFFFFE
0054A607 |. 40 |inc eax
0054A608 |> 85C0 |test eax, eax
0054A60A |. 75 38 |jnz short 0054A644
0054A60C |. 8D45 DC |lea eax, dword ptr [ebp-24]
0054A60F |. 8BD3 |mov edx, ebx
0054A611 |. 83C2 01 |add edx, 1
0054A614 |. 71 05 |jno short 0054A61B
0054A616 |. E8 A193EBFF |call 004039BC
0054A61B |> 8B4D F8 |mov ecx, dword ptr [ebp-8]
0054A61E |. 4A |dec edx
0054A61F |. 85C9 |test ecx, ecx
0054A621 |. 74 05 |je short 0054A628
0054A623 |. 3B51 FC |cmp edx, dword ptr [ecx-4]
0054A626 |. 72 05 |jb short 0054A62D
0054A628 |> E8 8793EBFF |call 004039B4
0054A62D |> 42 |inc edx
0054A62E |. 8A5411 FF |mov dl, byte ptr [ecx+edx-1] ; 取字符
0054A632 |. E8 7DA4EBFF |call 00404AB4
0054A637 |. 8B55 DC |mov edx, dword ptr [ebp-24]
0054A63A |. 8D45 F0 |lea eax, dword ptr [ebp-10]
0054A63D |. E8 62A5EBFF |call 00404BA4
0054A642 |. EB 36 |jmp short 0054A67A
0054A644 |> 8D45 D8 |lea eax, dword ptr [ebp-28]
0054A647 |. 8BD3 |mov edx, ebx
0054A649 |. 83C2 01 |add edx, 1
0054A64C |. 71 05 |jno short 0054A653
0054A64E |. E8 6993EBFF |call 004039BC
0054A653 |> 8B4D F8 |mov ecx, dword ptr [ebp-8]
0054A656 |. 4A |dec edx
0054A657 |. 85C9 |test ecx, ecx
0054A659 |. 74 05 |je short 0054A660
0054A65B |. 3B51 FC |cmp edx, dword ptr [ecx-4]
0054A65E |. 72 05 |jb short 0054A665
0054A660 |> E8 4F93EBFF |call 004039B4
0054A665 |> 42 |inc edx
0054A666 |. 8A5411 FF |mov dl, byte ptr [ecx+edx-1]
0054A66A |. E8 45A4EBFF |call 00404AB4
0054A66F |. 8B55 D8 |mov edx, dword ptr [ebp-28]
0054A672 |. 8D45 F4 |lea eax, dword ptr [ebp-C]
0054A675 |. E8 2AA5EBFF |call 00404BA4
0054A67A |> 43 |inc ebx
0054A67B |. 83FB 10 |cmp ebx, 10
0054A67E |.^ 0F85 76FFFFFF \jnz 0054A5FA
0054A684 |. 8D45 FC lea eax, dword ptr [ebp-4]
0054A687 |. E8 40A2EBFF call 004048CC
0054A68C |. 33DB xor ebx, ebx
0054A68E |> 8D45 D4 /lea eax, dword ptr [ebp-2C]
0054A691 |. BA 08000000 |mov edx, 8
0054A696 |. 2BD3 |sub edx, ebx
0054A698 |. 71 05 |jno short 0054A69F
0054A69A |. E8 1D93EBFF |call 004039BC
0054A69F |> 8B4D F4 |mov ecx, dword ptr [ebp-C] ; (ASCII "24624624") 上面循环过滤的结果
0054A6A2 |. 4A |dec edx
0054A6A3 |. 85C9 |test ecx, ecx
0054A6A5 |. 74 05 |je short 0054A6AC
0054A6A7 |. 3B51 FC |cmp edx, dword ptr [ecx-4]
0054A6AA |. 72 05 |jb short 0054A6B1
0054A6AC |> E8 0393EBFF |call 004039B4
0054A6B1 |> 42 |inc edx
0054A6B2 |. 8A5411 FF |mov dl, byte ptr [ecx+edx-1]
0054A6B6 |. E8 F9A3EBFF |call 00404AB4
0054A6BB |. 8B55 D4 |mov edx, dword ptr [ebp-2C]
0054A6BE |. 8D45 FC |lea eax, dword ptr [ebp-4]
0054A6C1 |. E8 DEA4EBFF |call 00404BA4
0054A6C6 |. 43 |inc ebx
0054A6C7 |. 83FB 08 |cmp ebx, 8
0054A6CA |.^ 75 C2 \jnz short 0054A68E ; 这两个循环我觉得没必要跟进
0054A6CC |. 8D55 D0 lea edx, dword ptr [ebp-30]
0054A6CF |. 8B45 F0 mov eax, dword ptr [ebp-10] ; "13513513" 上面循环过滤的结果
0054A6D2 |. E8 3DB8FFFF call 00545F14 ; 这个对得到上面的“13513513”,取它的MD5值
0054A6D7 |. 8B55 D0 mov edx, dword ptr [ebp-30] ; “50DAACD1190706850135441B2FD23047”这个就是MD5值
0054A6DA |. 8D45 F0 lea eax, dword ptr [ebp-10]
0054A6DD |. E8 82A2EBFF call 00404964
0054A6E2 |. 8D4D CC lea ecx, dword ptr [ebp-34]
0054A6E5 |. BA 08000000 mov edx, 8 ; 取8位数
0054A6EA |. 8B45 F0 mov eax, dword ptr [ebp-10]
0054A6ED |. E8 AE3EEFFF call 0043E5A0
0054A6F2 |. 8B55 CC mov edx, dword ptr [ebp-34] ; 从上面的字符串后面取得 "2FD23047"
0054A6F5 |. 8D45 F0 lea eax, dword ptr [ebp-10]
0054A6F8 |. E8 67A2EBFF call 00404964 ; 翻转刚才的“24624624”
0054A6FD |. 8B45 FC mov eax, dword ptr [ebp-4] ; "42642642"
0054A700 |. 8B55 F0 mov edx, dword ptr [ebp-10] ; 和"2FD23047"比较,相等的话就注册成功了。终于搞定
0054A703 |. E8 E0A5EBFF call 00404CE8 ; 这个就是比较函数了,经典啊
0054A708 75 05 jnz short 0054A70F ; 不等的话就没了
0054A70A |. 83CE FF or esi, FFFFFFFF ; 注册成功标志。
0054A70D |. EB 02 jmp short 0054A711
0054A70F |> 33F6 xor esi, esi
0054A711 |> 33C0 xor eax, eax
【破解总结】
------------------------------------------------------------------------
名:binbinbin
码:ACM-123456-123456-1234
要对照相应位置来讲。
1、采用了MD5算法。
2、首先,对输入的假码进行格式化,就是说,头三位要是“ACM”。然后就是检测分隔符“-”要有三个,具体位置好像没有限定的。再然后就
是把那些分隔符去掉。
3、去掉分隔符后,取得上面相应的“24624624”这些位数的位置的字符。
4、然后取出相应的“13513513”这些位数的位置的字符。然后对这个字符串取MD5值。得到“50DAACD1190706850135441B2FD23047”
5、先把输入的假码的“24624624”对应位置的字符倒过来,即是:“42642642”。然后取MD5值的最后8位:“2FD23047”和倒过来后的字符串
一一比较。相等就成功。
所以我们对应上面的输入信息可以得到相应真码:ACM-173450-13325D-1F32
收工。