首页
社区
课程
招聘
[原创]****计算系统5.71破解过程
发表于: 2007-6-21 22:06 7912

[原创]****计算系统5.71破解过程

2007-6-21 22:06
7912

【文章标题】: 公路施工测量坐标计算系统5.71破解过程
【文章作者】: YagerM
【作者邮箱】: shinings@163com
【作者QQ号】: 18560048
【软件名称】: 公路施工测量坐标计算系统5.71
【软件大小】: 1.4M
【下载地址】: 自己搜索下载
【加壳方式】: SDprotect1.11
【编写语言】: Borland Delphi 6.0 - 7.0
【操作平台】: xpsp2
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  听一个同事说起"公路施工测量坐标计算系统5.71"这个软件挺不错的,只是未注册版本有大概
  20次的使用限制。故拿来试下能不能解了这个限制。
  
  -----------------------------------------------------
  【脱壳及部分修复过程】:
    首先PEID查下壳:竟然显示Microsoft Visual C++,没壳?不会吧,再用PEID的Advanced Scan
  插件扫描下:原来是SDprotector的壳。找找有没有现成的脱壳工具,试了loveboom前辈的SDProtector v1.16
  和1.14脱壳机,都显示未知版本。只好继续在论坛上搜索有关SDProtector壳的文章,研究壳的脱法。
  参考论坛上早期关于SDprotector v1.1的两篇文章和论坛上众多前辈的帮助,这里特别是感谢的是skylly兄,
  能顺利地完成这个软件的脱壳他帮了不小的忙。因为在下水平太次软件脱壳出来修复后并不完美,部分功能不能
  正常使用,所以只好硬着头皮分析软件算法看能不能找到薄弱之处,破解之。利用脚本达到OEP后DUMP出来,然
  后修复IAT,IAT进行了些很简单的处理,很容易就可以修复了。达到OEP的的脚本可以用http://bbs.pediy.com/showthread.php?t=45941里skylly兄的回复,再次感谢下他!
  程序对很多关键代码都进行了保护了,在OEP处DUMP出来后还需要对比带壳程序运行的情况手动的进行恢复,
  下面举其中一段,其它都类似:
  005C7988    53              push    ebx
  005C7989    56              push    esi
  005C798A    57              push    edi
  005C798B    8BFA            mov     edi, edx
  005C798D    8BD8            mov     ebx, eax
  005C798F    BE 10875F00     mov     esi, 005F8710
  005C7994    E8 BB86E3FF     call    00400054<==== 解密从005C79AC开始的代码段
  005C7999    EB 11           jmp     short 005C79AC<==== 跳到解密后的代码运行
  //下面是解密前的情况:
  005C79AC    2E:1958 1B      sbb     dword ptr cs:[eax+1B], ebx
  005C79B0    48              dec     eax
  005C79B1    94              xchg    eax, esp
  005C79B2    F2:             prefix repne:
  005C79B3    EC              in      al, dx
  ……
  //下面是解密后的情况:
  005C79AC    8B16            mov     edx, dword ptr [esi]
  005C79AE    8B83 D8030000   mov     eax, dword ptr [ebx+3D8]
  005C79B4    E8 2BEDF6FF     call    005366E4
  ……
  有几段关键部分代码都是类似的形式进行的加密,处理的方式也很简单,就是在带壳的程序中复制
  相应的解密后的代码到DUMP出来的文件里,然后把加密和销毁的CALL NOP掉就行了(如上面代码就
  需要NOP掉call    00400054这句以及下面不远处的销毁函数call    00400059)。这个步骤完成后
  就可以对DUMP出来的文件进行算法的分析了。
  
  --------------------------------------------------------------
  【注册算法分析】:
     输入试练码后,通过注册表分析知道存在software\t12mlp\system下了,OD载入DUMP文件,字符
  串搜索t12mlp就找到了注册验证的位置(这段代码也经过加密的,需要上面提到的方法从带壳文件里
  解密后粘贴到DUMP后的文件相应的位置):
  005B3ACA    B2 01           mov     dl, 1
  005B3ACC    A1 54974400     mov     eax, dword ptr [449754]
  005B3AD1    E8 7E5DE9FF     call    00449854
  005B3AD6    8945 F8         mov     dword ptr [ebp-8], eax
  005B3AD9    BA 03000080     mov     edx, 80000003
  005B3ADE    8B45 F8         mov     eax, dword ptr [ebp-8]
  005B3AE1    E8 0E5EE9FF     call    004498F4
  005B3AE6    B1 01           mov     cl, 1
  005B3AE8    BA 203C5B00     mov     edx,005B3C20                    ;default\software\t12mlp\system
  005B3AED    8B45 F8         mov     eax, dword ptr [ebp-8]
  005B3AF0    E8 675EE9FF     call    0044995C
  005B3AF5    84C0            test    al, al
  005B3AF7    0F84 C8000000   je      005B3BC5
  005B3AFD    33C0            xor     eax, eax
  005B3AFF    55              push    ebp
  005B3B00    68 323B5B00     push    005B3B32
  005B3B05    64:FF30         push    dword ptr fs:[eax]
  005B3B08    64:8920         mov     dword ptr fs:[eax], esp
  005B3B0B    8D4D F4         lea     ecx, dword ptr [ebp-C]
  005B3B0E    BA 483C5B00     mov     edx, 005B3C48                    ;pass
  005B3B13    8B45 F8         mov     eax, dword ptr [ebp-8]
  005B3B16    E8 B162E9FF     call    00449DCC<====取注册表里的试练码
  005B3B1B    8B55 F4         mov     edx, dword ptr [ebp-C]
  005B3B1E    B8 1C845F00     mov     eax, 005F841C
  005B3B23    E8 DC0EE5FF     call    00404A04
  005B3B28    33C0            xor     eax, eax
  005B3B2A    5A              pop     edx
  005B3B2B    59              pop     ecx
  005B3B2C    59              pop     ecx
  005B3B2D    64:8910         mov     dword ptr fs:[eax], edx
  005B3B30    EB 12           jmp     short 005B3B44
  005B3B32  ^ E9 E904E5FF     jmp     00404020
  005B3B37    8B45 FC         mov     eax, dword ptr [ebp-4]
  005B3B3A    E8 5D080000     call    005B439C
  005B3B3F    E8 0809E5FF     call    0040444C
  005B3B44    8B45 FC         mov     eax, dword ptr [ebp-4]
  005B3B47    E8 60090000     call    005B44AC<==== 对试练码进行运算
  005B3B4C    E8 0FFBFFFF     call    <jmp.&stchb.GetHD><==== 调用加密库GetHD函数取硬盘ID
  005B3B51    8BD0            mov     edx, eax
  005B3B53    8D45 EC         lea     eax, dword ptr [ebp-14]
  005B3B56    E8 4D10E5FF     call    00404BA8
  005B3B5B    8B45 EC         mov     eax, dword ptr [ebp-14]
  005B3B5E    8D55 F0         lea     edx, dword ptr [ebp-10]
  005B3B61    E8 EA59E5FF     call    00409550
  005B3B66    8B45 F0         mov     eax, dword ptr [ebp-10]
  005B3B69    E8 3AFBFFFF     call    005B36A8<==== 计算GetHD得到的硬盘ID的字串ASIIC码平方和
  005B3B6E    8BD8            mov     ebx, eax
  005B3B70    A1 20845F00     mov     eax, dword ptr [5F8420]
  005B3B75    E8 2EFBFFFF     call    005B36A8<==== 005B3B47处试练码计算后的结果的字串ASIIC码平方和
  005B3B7A    3BD8            cmp     ebx, eax
  005B3B7C    75 3D           jnz     short 005B3BBB<==== 上面两个平方和相等则注册成功!
  005B3B7E    A1 2C675F00     mov     eax, dword ptr [5F672C]
  005B3B83    8B00            mov     eax, dword ptr [eax]
  005B3B85    8B80 28030000   mov     eax, dword ptr [eax+328]
  005B3B8B    33D2            xor     edx, edx
  005B3B8D    E8 EA8CF1FF     call    004CC87C
  005B3B92    A1 2C675F00     mov     eax, dword ptr [5F672C]
  005B3B97    8B00            mov     eax, dword ptr [eax]
  005B3B99    8B80 58030000   mov     eax, dword ptr [eax+358]
  005B3B9F    8B80 08020000   mov     eax, dword ptr [eax+208]
  005B3BA5    BA 01000000     mov     edx, 1
  005B3BAA    E8 5509EAFF     call    00454504
  005B3BAF    BA 583C5B00     mov     edx, 005B3C58                    ; 正式版
  005B3BB4    E8 A708EAFF     call    00454460
  005B3BB9    EB 12           jmp     short 005B3BCD
  
  去了解下对试练码到底进行了什么样的操作,所以我们跟进005B3B47:
  
  
  005B44AC    55              push    ebp
  005B44AD    8BEC            mov     ebp, esp
  005B44AF    B9 08000000     mov     ecx, 8
  005B44B4    6A 00           push    0
  005B44B6    6A 00           push    0
  005B44B8    49              dec     ecx
  005B44B9  ^ 75 F9           jnz     short 005B44B4
  005B44BB    51              push    ecx
  005B44BC    53              push    ebx
  005B44BD    56              push    esi
  005B44BE    57              push    edi
  005B44BF    8945 FC         mov     dword ptr [ebp-4], eax
  005B44C2    33C0            xor     eax, eax
  005B44C4    55              push    ebp
  005B44C5    68 E7465B00     push    005B46E7
  005B44CA    64:FF30         push    dword ptr fs:[eax]
  005B44CD    64:8920         mov     dword ptr fs:[eax], esp
  005B44D0    90              nop<====下面代码也是解密出来后复制过来的,NOP掉的是解密CALL
  005B44D1    90              nop
  005B44D2    90              nop
  005B44D3    90              nop
  005B44D4    90              nop
  005B44D5    EB 11           jmp     short 005B44E8
  
  ...
  
  005B44E8    33C0            xor     eax, eax
  005B44EA    55              push    ebp
  005B44EB    68 A2465B00     push    005B46A2
  005B44F0    64:FF30         push    dword ptr fs:[eax]
  005B44F3    64:8920         mov     dword ptr fs:[eax], esp
  005B44F6    E8 65F1FFFF     call    <jmp.&stchb.GetHD>
  005B44FB    8BD0            mov     edx, eax
  005B44FD    8D45 F4         lea     eax, dword ptr [ebp-C]
  005B4500    E8 A306E5FF     call    00404BA8
  005B4505    8B45 F4         mov     eax, dword ptr [ebp-C]
  005B4508    8D55 F8         lea     edx, dword ptr [ebp-8]
  005B450B    E8 4050E5FF     call    00409550
  005B4510    8B45 F8         mov     eax, dword ptr [ebp-8]
  005B4513    E8 90F1FFFF     call    005B36A8
  005B4518    B9 05000000     mov     ecx, 5
  005B451D    99              cdq
  005B451E    F7F9            idiv    ecx
  005B4520    83FA 04         cmp     edx, 4
  005B4523    0F87 6F010000   ja      005B4698
  005B4529    FF2495 30455B00 jmp     dword ptr [edx*4+5B4530]<====再次取硬盘ID,通过其字符
  的ASIIC码平方和除5的余数来选择对试练码的运算方法
  ...
  005B4549    8BD0            mov     edx, eax<====余数为0时
  005B454B    8D45 E4         lea     eax, dword ptr [ebp-1C]
  005B454E    E8 5506E5FF     call    00404BA8
  005B4553    8B45 E4         mov     eax, dword ptr [ebp-1C]
  005B4556    8D55 E8         lea     edx, dword ptr [ebp-18]
  005B4559    E8 F24FE5FF     call    00409550
  005B455E    8B45 E8         mov     eax, dword ptr [ebp-18]
  005B4561    50              push    eax
  005B4562    E8 29F1FFFF     call    <jmp.&stchx.SHA512En>
  005B4567    8BD0            mov     edx, eax
  005B4569    8D45 EC         lea     eax, dword ptr [ebp-14]
  005B456C    E8 3706E5FF     call    00404BA8
  005B4571    8B55 EC         mov     edx, dword ptr [ebp-14]
  005B4574    8D4D F0         lea     ecx, dword ptr [ebp-10]
  005B4577    A1 1C845F00     mov     eax, dword ptr [5F841C]
  005B457C    E8 A3E4FFFF     call    005B2A24
  005B4581    8B55 F0         mov     edx, dword ptr [ebp-10]
  005B4584    B8 20845F00     mov     eax, 005F8420
  005B4589    E8 7604E5FF     call    00404A04
  005B458E    E9 05010000     jmp     005B4698
  005B4593    E8 C8F0FFFF     call    <jmp.&stchb.GetHD><====余数为1时
  005B4598    8BD0            mov     edx, eax
  005B459A    8D45 D8         lea     eax, dword ptr [ebp-28]
  005B459D    E8 0606E5FF     call    00404BA8
  005B45A2    8B45 D8         mov     eax, dword ptr [ebp-28]
  005B45A5    8D55 DC         lea     edx, dword ptr [ebp-24]
  005B45A8    E8 A34FE5FF     call    00409550
  005B45AD    8B45 DC         mov     eax, dword ptr [ebp-24]
  005B45B0    50              push    eax
  005B45B1    E8 BAF0FFFF     call    <jmp.&stchb.TIGER192En>
  005B45B6    8BD0            mov     edx, eax
  005B45B8    8D45 E0         lea     eax, dword ptr [ebp-20]
  005B45BB    E8 E805E5FF     call    00404BA8
  005B45C0    8B45 E0         mov     eax, dword ptr [ebp-20]
  005B45C3    50              push    eax
  005B45C4    A1 1C845F00     mov     eax, dword ptr [5F841C]
  005B45C9    50              push    eax
  005B45CA    E8 A9F0FFFF     call    <jmp.&stchx.KDD>
  005B45CF    8BD0            mov     edx, eax
  005B45D1    B8 20845F00     mov     eax, 005F8420
  005B45D6    E8 CD05E5FF     call    00404BA8
  005B45DB    E9 B8000000     jmp     005B4698
  005B45E0    A1 1C845F00     mov     eax, dword ptr [5F841C]<====余数为2时
  005B45E5    50              push    eax
  005B45E6    68 00475B00     push    005B4700                         ; 走马梁村
  005B45EB    68 14475B00     push    005B4714                         ; 河曲旧县
  005B45F0    E8 6BF0FFFF     call    <jmp.&stchb.GetHD>
  005B45F5    8BD0            mov     edx, eax
  005B45F7    8D45 CC         lea     eax, dword ptr [ebp-34]
  005B45FA    E8 A905E5FF     call    00404BA8
  005B45FF    8B45 CC         mov     eax, dword ptr [ebp-34]
  005B4602    8D55 D0         lea     edx, dword ptr [ebp-30]
  005B4605    E8 464FE5FF     call    00409550
  005B460A    8B45 D0         mov     eax, dword ptr [ebp-30]
  005B460D    50              push    eax
  005B460E    E8 5DF0FFFF     call    <jmp.&stchb.TIGER192En>
  005B4613    8BD0            mov     edx, eax
  005B4615    8D45 D4         lea     eax, dword ptr [ebp-2C]
  005B4618    E8 8B05E5FF     call    00404BA8
  005B461D    8B45 D4         mov     eax, dword ptr [ebp-2C]
  005B4620    50              push    eax
  005B4621    E8 5AF0FFFF     call    <jmp.&stchx.D3DesDe>
  005B4626    8BD0            mov     edx, eax
  005B4628    B8 20845F00     mov     eax, 005F8420
  005B462D    E8 7605E5FF     call    00404BA8
  005B4632    EB 64           jmp     short 005B4698
  005B4634    8D55 C8         lea     edx, dword ptr [ebp-38]<====余数为3时
  005B4637    A1 1C845F00     mov     eax, dword ptr [5F841C]
  005B463C    E8 17D5FFFF     call    005B1B58
  005B4641    8B55 C8         mov     edx, dword ptr [ebp-38]
  005B4644    B8 20845F00     mov     eax, 005F8420
  005B4649    E8 B603E5FF     call    00404A04
  005B464E    EB 48           jmp     short 005B4698
  005B4650    E8 0BF0FFFF     call    <jmp.&stchb.GetHD><====余数为4时
  005B4655    8BD0            mov     edx, eax
  005B4657    8D45 BC         lea     eax, dword ptr [ebp-44]
  005B465A    E8 4905E5FF     call    00404BA8
  005B465F    8B45 BC         mov     eax, dword ptr [ebp-44]
  005B4662    8D55 C0         lea     edx, dword ptr [ebp-40]
  005B4665    E8 E64EE5FF     call    00409550
  005B466A    8B45 C0         mov     eax, dword ptr [ebp-40]
  005B466D    50              push    eax
  005B466E    E8 F5EFFFFF     call    <jmp.&stchb.HAVAL256En>
  005B4673    8BD0            mov     edx, eax
  005B4675    8D45 C4         lea     eax, dword ptr [ebp-3C]
  005B4678    E8 2B05E5FF     call    00404BA8
  005B467D    8B45 C4         mov     eax, dword ptr [ebp-3C]
  005B4680    50              push    eax                              
  005B4681    A1 1C845F00     mov     eax, dword ptr [5F841C]
  005B4686    50              push    eax                           
  005B4687    E8 14F0FFFF     call    <jmp.&stchz.SelfDDe>
  005B468C    8BD0            mov     edx, eax
  005B468E    B8 20845F00     mov     eax, 005F8420
  005B4693    E8 1005E5FF     call    00404BA8
  005B4698    33C0            xor     eax, eax
  ...
  够狠,除了貌似利用了Ksaiy共享加密库外,还分出5中可能来进行不同的加密,难道是想用这种方
  式告诉我们菜鸟知难而退?不过我的原则从来都是迎难而上,这样的话我们就不能硬着头皮去一个
  一个的分析算法然后写出注册机了。要找一个更实在点方法!
  另辟蹊径:通过观察发现当余数为3时的注册算法最简单(最短,且没有调用加密库函数),我们就先从它下手
  (呵呵,这应该就叫做百密一疏吧,正是由这个简单的分枝,才使得其它所有复杂的多的算法群溃于蚁穴)
  
  研究余数3分支算法
  我们从005B463C处F7跟进:
  
  005B1B58    53              push    ebx
  005B1B59    56              push    esi
  005B1B5A    57              push    edi
  005B1B5B    55              push    ebp
  005B1B5C    83C4 F8         add     esp, -8
  005B1B5F    8BF2            mov     esi, edx
  005B1B61    8BF8            mov     edi, eax
  005B1B63    8BEF            mov     ebp, edi
  005B1B65    85ED            test    ebp, ebp
  005B1B67    74 54           je      short 005B1BBD
  005B1B69    8BC7            mov     eax, edi
  005B1B6B    83E8 04         sub     eax, 4
  005B1B6E    8B18            mov     ebx, dword ptr [eax]             ; 试练码长
  005B1B70    8D43 03         lea     eax, dword ptr [ebx+3]
  005B1B73    C1E8 02         shr     eax, 2
  005B1B76    8D1440          lea     edx, dword ptr [eax+eax*2]
  005B1B79    8BC6            mov     eax, esi
  005B1B7B    E8 7C34E5FF     call    00404FFC                         ; 12f9e8=18264c8
  005B1B80    33C0            xor     eax, eax
  005B1B82    890424          mov     dword ptr [esp], eax
  005B1B85    C74424 04 04000>mov     dword ptr [esp+4], 4
  005B1B8D    54              push    esp
  005B1B8E    8D4424 08       lea     eax, dword ptr [esp+8]
  005B1B92    50              push    eax
  005B1B93    8B0E            mov     ecx, dword ptr [esi]
  005B1B95    8BC5            mov     eax, ebp                         ; eax=试练码
  005B1B97    8BD3            mov     edx, ebx                         ; edx=试练码长
  005B1B99    E8 2E000000     call    005B1BCC                         ; 试练码加密过程,还需要跟进
  005B1B9E    8BD8            mov     ebx, eax
  005B1BA0    8B06            mov     eax, dword ptr [esi]
  005B1BA2    03C3            add     eax, ebx
  005B1BA4    8B4C24 04       mov     ecx, dword ptr [esp+4]
  005B1BA8    8B1424          mov     edx, dword ptr [esp]
  005B1BAB    E8 A0000000     call    005B1C50
  005B1BB0    03D8            add     ebx, eax
  005B1BB2    8BC6            mov     eax, esi
  005B1BB4    8BD3            mov     edx, ebx
  005B1BB6    E8 4134E5FF     call    00404FFC
  005B1BBB    EB 07           jmp     short 005B1BC4
  005B1BBD    8BC6            mov     eax, esi
  005B1BBF    E8 EC2DE5FF     call    004049B0
  005B1BC4    59              pop     ecx
  005B1BC5    5A              pop     edx
  005B1BC6    5D              pop     ebp
  005B1BC7    5F              pop     edi
  005B1BC8    5E              pop     esi
  005B1BC9    5B              pop     ebx
  005B1BCA    C3              retn
  
  
  继续005B1B99处F7进入,到达运算的地方(很短吧):
  005B1BCC    55              push    ebp
  005B1BCD    8BEC            mov     ebp, esp
  005B1BCF    83C4 F8         add     esp, -8
  005B1BD2    56              push    esi
  005B1BD3    57              push    edi
  005B1BD4    894D FC         mov     dword ptr [ebp-4], ecx
  005B1BD7    85D2            test    edx, edx
  005B1BD9    76 69           jbe     short 005B1C44
  005B1BDB    8BF8            mov     edi, eax
  005B1BDD    03D7            add     edx, edi
  005B1BDF    8955 F8         mov     dword ptr [ebp-8], edx
  005B1BE2    8B55 FC         mov     edx, dword ptr [ebp-4]
  005B1BE5    8B45 0C         mov     eax, dword ptr [ebp+C]
  005B1BE8    8B00            mov     eax, dword ptr [eax]
  005B1BEA    8B75 08         mov     esi, dword ptr [ebp+8]
  005B1BED    8B36            mov     esi, dword ptr [esi]            
  005B1BEF    3B7D F8         cmp     edi, dword ptr [ebp-8]
  005B1BF2    74 3B           je      short 005B1C2F                   ; 看试练码长度是否为0
  005B1BF4    33C9            xor     ecx, ecx
  005B1BF6    8A0F            mov     cl, byte ptr [edi]               ; 取第一个字符
  005B1BF8    8B0C8D 54575F00 mov     ecx, dword ptr [ecx*4+5F5754]
  005B1BFF    47              inc     edi
  005B1C00    81F9 FF000000   cmp     ecx, 0FF
  005B1C06    74 22           je      short 005B1C2A
  005B1C08    C1E0 06         shl     eax, 6                           ; 乘64
  005B1C0B    0BC1            or      eax, ecx
  005B1C0D    4E              dec     esi
  005B1C0E    85F6            test    esi, esi
  005B1C10    75 18           jnz     short 005B1C2A
  005B1C12    8842 02         mov     byte ptr [edx+2], al
  005B1C15    C1E8 08         shr     eax, 8
  005B1C18    8842 01         mov     byte ptr [edx+1], al
  005B1C1B    C1E8 08         shr     eax, 8
  005B1C1E    8802            mov     byte ptr [edx], al
  005B1C20    33C0            xor     eax, eax
  005B1C22    83C2 03         add     edx, 3
  005B1C25    BE 04000000     mov     esi, 4
  005B1C2A    3B7D F8         cmp     edi, dword ptr [ebp-8]
  005B1C2D  ^ 75 C5           jnz     short 005B1BF4                   ; 试练码未结束就跳
  005B1C2F    8B4D 0C         mov     ecx, dword ptr [ebp+C]
  005B1C32    8901            mov     dword ptr [ecx], eax
  005B1C34    8B45 08         mov     eax, dword ptr [ebp+8]
  005B1C37    8930            mov     dword ptr [eax], esi
  005B1C39    8B45 FC         mov     eax, dword ptr [ebp-4]
  005B1C3C    50              push    eax
  005B1C3D    8BC2            mov     eax, edx
  005B1C3F    5A              pop     edx
  005B1C40    2BC2            sub     eax, edx
  005B1C42    EB 02           jmp     short 005B1C46
  005B1C44    33C0            xor     eax, eax
  005B1C46    5F              pop     edi
  005B1C47    5E              pop     esi
  005B1C48    59              pop     ecx
  005B1C49    59              pop     ecx
  005B1C4A    5D              pop     ebp
  005B1C4B    C2 0800         retn    8
  整个计算很简单:试练码按顺序取4Byte生成了一个新的3Byte串
  生成方法具体方法如下(自己分析下是很简单的):
  1)试练码“ABCD”->找到“ABCD”在内存中表各自对应的值:
  
  试练码:A  B  C  D  E ... X  Y  Z... a ...z ...0 ...9
  对应码:00 01 02 03 04... 17 18 19...1A...33...34...3D
  
  故:“ABCD”中 A对应00 B对应01 C对应02 D对应03
  2)把对应值带入下式相应的位置,计算出T:
  T=((A*64+B)*64+C)*D
  3)把T的第2Byte做为新生成的Byte串的第一位,第3Byte做第二位,第4Byte做第三位。
  4)继续取试练码下面4Byte重复1开始的步骤
  所以,如果是8Byte的试练码就可以生成6Byte的新串,而这个新串就是最后用于计算
  每个ASIIC码的平方和去和硬盘ID的ASIIC码平方和比较验证注册与否的那个串了。可以看出这个分支
  算法比起其它分支的确是“太简单”,称之为整个软件的“蚁穴”不为过。
  
  有点晕,下面整理下思路:
  要通过余数3这个分支注册成功我们需要满足:
  1)通过上面提到GetHD()得到的硬盘ID的ASIIC码平方和要能被5除余3(要不就到不了余3这个分支)
  2)注册码要能注册(废话,意思就是说要通过上面“简单”的分支3的运算后能符合注册条件)
  
  好了首先解决第一个:
  把用于得到硬盘ID的GetHD()函数所在的DLL脱壳分析下,PECOMPACT的壳,简单,脱掉后修复下重定位表,然后还
  是把基址填为原来的400000。用PEID插件修改下CRC32为未脱壳的值。试着导入下,OK成功。运气真好。接着OD
  找到GetHD(),简单的修改下返回前的堆栈,目的只有一个:让它返回我们需要的“硬盘ID”:)。
  
  第二个条件:
  既可以通过注册码来算你要写入的“硬盘ID”,也可以通过随便一个写入的“硬盘ID”来计算注册码。我觉得第二
  种方法要简单的多(因为平方和能被除5余3的可能性比较小,好象是我随便试了几个也没验证)。两种方法都行编个
  程序循环下就行了,代码写的太烂就不发上来了:)
  第一种我选的注册码是“Ym000000”计算出来“硬盘ID”为“Urwwxx”
  第二种我选硬盘ID是  “K58311”  计算出来注册码是“SzU4MzEx”
  
  替换GetHD()所在的DLL文件为我们修改过的后,输入对应的注册码,程序重启后显示正式版。试了下完全正常没有任何
功能限制,OK搞定!
--------------------------------------------------------------------------------
【经验总结】
  这个软件对我这个新手来说而言有些过难了,单是脱壳修复代码就花了一周的时间。这个软件的注册部分也是颇费周折
  的,除了使用了专门的加密库外,还设计了不同的5种加密分支。如果真想写出注册机来那是要费很大的脑壳了,不过话说
  回来这个软件最终还是百密一疏,一处小小的处理不当被搞定了。
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪软件安全论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年06月21日 21:57:45


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 415
活跃值: (34)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
呵呵.费心了.很仔细.
2007-6-22 01:34
0
雪    币: 1925
活跃值: (906)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
3
很详细,学习哈~~
2007-6-22 15:01
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你能把这个做成动画教程或者是把脱壳及注册详细过程发给我吗照顾一下我们这些初学者好吗
2007-9-10 19:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你能把整改过程(脱壳及注册)做成动画或文章教程发给我吗,我是初学者不太看得懂
先谢了
邮箱:wanghua1138@163.com
QQ:356535036
2007-9-10 19:20
0
游客
登录 | 注册 方可回帖
返回