【文章标题】: 公路施工测量坐标计算系统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日开班!