【破文标题】易通文件夹锁2006 V3.0.5.0 一劳永逸的自注册破解方法
【破文作者】蓝色の?(shenhaiyu)
【作者邮箱】yhz-163@163.com
【作者主页】http://www.pediy.com
【破解工具】OD,W32Dasm,ASPackDie
【破解平台】XP SP2
【软件名称】易通文件夹锁2006 V3.0.5.0
【软件大小】3128K
【原版下载】http://www.etongsoft.net
【保护方式】壳,注册码
【软件简介】
四大保护功能,三种保护方式。集文件夹锁、文件锁、磁盘锁、增强锁于一体。提供锁定、隐藏、移动三种保护方式。防删除、复制等,是您文件资料的安全屏障。
1.文件夹保护功能:文件夹保护功能具有文件夹加锁和文件夹深度隐藏两种文件夹保护方式。用户可以通过右击想要保护的文件夹,选择[易通加锁/解锁]菜单来实现保护,也可以直接进入软件主界面的文件夹锁功能区里面进行保护与解除保护。同时,保护后的文件夹可以防止复制,删除等操作。
2.文件保护功能:文件保护功能具有文件加锁和文件深度隐藏两种文件保护方式。用户可以通过右击想要保护的文件,选择[易通文件加密]菜单来实现保护,也可以直接进入软件主界面的文件锁功能区里面进行保护与解除保护。
3.磁盘保护功能:磁盘保护功能具有磁盘驱动器加锁和磁盘驱动器隐藏两种磁盘保护方式。用户可以进入软件主界面的磁盘锁功能区里面进行选择需要保护的磁盘驱动器。另外还提供了禁止使用USB设备,如U盘,USB移动硬盘等USB接口设备和禁止USB存储设备的写入功能等,保护您的资料不能通过U盘、移动硬盘等外接设备带走。
4.增强保护功能:增强加锁功能目前为您提供了文件夹移动保护、程序锁、文件夹伪装、高强压缩加密等功能。在以后软件的升级版本中我们还会努力为您提供更多、更实用的加锁保护功能!
【破解声明】学习飘云阁tigerisme斑竹的文章时发现只有算法分析,没有提供简单的破解思路,我就多此一举的补充上了!
------------------------------------------------------------------------
【破解过程】
【分析过程】
前辈们对于易通文件夹锁的分析已经很是深入了,但对于像我这样的菜鸟来说,每次破解都得挂上OD跟上半天才能搞到注册码实在很不爽,爆破掉吧还需要改很多地方,于是想到了让程序自注册这种极其简单却非常有效的方法,拿来与大家分享。
脱壳使用ASPackDie轻松搞定(易通所有文件都是ASP的壳),启动OD调试CDirLock.exe,经前辈们的分析可以肯定这个程序是调用了ETDirLock.dll进行注册加密,于是我们可以下bp MessageBoxA断点,然后运行并填入假码 11111-22222-33333-44444 后断下,打开反汇编窗口,在这里找到如下代码进行分析(注册名:shenhaiyu)。
(主要内容参考了 tigerisme、meiyou、网游难民 等前辈的文章,对他们表示衷心的感谢)。
0180220C 55 push ebp ; 注册算法入口
0180220D 8BEC mov ebp,esp
0180220F B9 0B000000 mov ecx,0B
01802214 6A 00 push 0
01802216 6A 00 push 0
01802218 49 dec ecx
01802219 ^ 75 F9 jnz short etdirloc.01802214
0180221B 53 push ebx
0180221C 8BD8 mov ebx,eax
0180221E 33C0 xor eax,eax
01802220 55 push ebp
01802221 68 82248001 push etdirloc.01802482
01802226 64:FF30 push dword ptr fs:[eax]
01802229 64:8920 mov dword ptr fs:[eax],esp
0180222C 8D55 F4 lea edx,dword ptr ss:[ebp-C]
0180222F 8B83 20030000 mov eax,dword ptr ds:[ebx+320]
01802235 E8 1EDAFAFF call etdirloc.017AFC58
0180223A 8B45 F4 mov eax,dword ptr ss:[ebp-C] ; 注册名=ebp-C送eax
0180223D 8D55 F8 lea edx,dword ptr ss:[ebp-8]
01802240 E8 D76CF7FF call etdirloc.01778F1C
01802245 837D F8 00 cmp dword ptr ss:[ebp-8],0 ; 注册名与0比较,防止名为空
01802249 0F84 80000000 je etdirloc.018022CF
0180224F 8D55 EC lea edx,dword ptr ss:[ebp-14]
01802252 8B83 24030000 mov eax,dword ptr ds:[ebx+324]
01802258 E8 FBD9FAFF call etdirloc.017AFC58
0180225D 8B45 EC mov eax,dword ptr ss:[ebp-14] ; 第一组注册码送eax
01802260 8D55 F0 lea edx,dword ptr ss:[ebp-10]
01802263 E8 B46CF7FF call etdirloc.01778F1C
01802268 837D F0 00 cmp dword ptr ss:[ebp-10],0 ; 第一组注册码与0比较
0180226C 0F85 9A000000 jnz etdirloc.0180230C
01802272 8D55 E4 lea edx,dword ptr ss:[ebp-1C]
01802275 8B83 2C030000 mov eax,dword ptr ds:[ebx+32C]
0180227B E8 D8D9FAFF call etdirloc.017AFC58
01802280 8B45 E4 mov eax,dword ptr ss:[ebp-1C]
01802283 8D55 E8 lea edx,dword ptr ss:[ebp-18]
01802286 E8 916CF7FF call etdirloc.01778F1C
0180228B 837D E8 00 cmp dword ptr ss:[ebp-18],0
0180228F 75 7B jnz short etdirloc.0180230C
01802291 8D55 DC lea edx,dword ptr ss:[ebp-24]
01802294 8B83 30030000 mov eax,dword ptr ds:[ebx+330]
0180229A E8 B9D9FAFF call etdirloc.017AFC58
0180229F 8B45 DC mov eax,dword ptr ss:[ebp-24]
018022A2 8D55 E0 lea edx,dword ptr ss:[ebp-20]
018022A5 E8 726CF7FF call etdirloc.01778F1C
018022AA 837D E0 00 cmp dword ptr ss:[ebp-20],0
018022AE 75 5C jnz short etdirloc.0180230C
018022B0 8D55 D4 lea edx,dword ptr ss:[ebp-2C]
018022B3 8B83 34030000 mov eax,dword ptr ds:[ebx+334]
018022B9 E8 9AD9FAFF call etdirloc.017AFC58
018022BE 8B45 D4 mov eax,dword ptr ss:[ebp-2C]
018022C1 8D55 D8 lea edx,dword ptr ss:[ebp-28]
018022C4 E8 536CF7FF call etdirloc.01778F1C
018022C9 837D D8 00 cmp dword ptr ss:[ebp-28],0
018022CD 75 3D jnz short etdirloc.0180230C
018022CF 68 30000400 push 40030
018022D4 8D55 D0 lea edx,dword ptr ss:[ebp-30]
018022D7 B8 9C248001 mov eax,etdirloc.0180249C
018022DC E8 DB4BFEFF call etdirloc.017E6EBC
018022E1 8B45 D0 mov eax,dword ptr ss:[ebp-30]
018022E4 E8 3B2BF7FF call etdirloc.01774E24
018022E9 50 push eax
018022EA 8D55 CC lea edx,dword ptr ss:[ebp-34]
018022ED B8 B4248001 mov eax,etdirloc.018024B4
018022F2 E8 C54BFEFF call etdirloc.017E6EBC
018022F7 8B45 CC mov eax,dword ptr ss:[ebp-34]
018022FA E8 252BF7FF call etdirloc.01774E24
018022FF 50 push eax
01802300 6A 00 push 0
01802302 E8 3D56F7FF call <jmp.&user32.MessageBoxA> ; jmp 到 user32.MessageBoxA
01802307 E9 EC000000 jmp etdirloc.018023F8
0180230C 8D55 C8 lea edx,dword ptr ss:[ebp-38]
0180230F 8B83 24030000 mov eax,dword ptr ds:[ebx+324]
01802315 E8 3ED9FAFF call etdirloc.017AFC58
0180231A FF75 C8 push dword ptr ss:[ebp-38] ; 第一组注册码 ebp-38=11111
0180231D 8D55 C4 lea edx,dword ptr ss:[ebp-3C]
01802320 8B83 2C030000 mov eax,dword ptr ds:[ebx+32C] ; eax=5
01802326 E8 2DD9FAFF call etdirloc.017AFC58
0180232B FF75 C4 push dword ptr ss:[ebp-3C] ; 第二组注册码 ebp-3C=22222
0180232E 8D55 C0 lea edx,dword ptr ss:[ebp-40]
01802331 8B83 30030000 mov eax,dword ptr ds:[ebx+330] ; eax=5
01802337 E8 1CD9FAFF call etdirloc.017AFC58
0180233C FF75 C0 push dword ptr ss:[ebp-40] ; 第三组注册码 ebp-40=33333
0180233F 8D55 BC lea edx,dword ptr ss:[ebp-44]
01802342 8B83 34030000 mov eax,dword ptr ds:[ebx+334] ; eax=5
01802348 E8 0BD9FAFF call etdirloc.017AFC58
0180234D FF75 BC push dword ptr ss:[ebp-44] ; 第四组注册码 ebp-44=44444
01802350 8D45 FC lea eax,dword ptr ss:[ebp-4]
01802353 BA 04000000 mov edx,4 ; edx=4
01802358 E8 8F29F7FF call etdirloc.01774CEC
0180235D 8D55 B8 lea edx,dword ptr ss:[ebp-48]
01802360 8B83 20030000 mov eax,dword ptr ds:[ebx+320]
01802366 E8 EDD8FAFF call etdirloc.017AFC58
0180236B 8B55 B8 mov edx,dword ptr ss:[ebp-48] ; 注册名送edx
0180236E 8B45 FC mov eax,dword ptr ss:[ebp-4] ; 假注册码送eax
01802371 E8 4E4FFEFF call etdirloc.017E72C4 ; 调用算法call(1)
01802376 84C0 test al,al ; 标志位检验
01802378 74 46 je short etdirloc.018023C0 ; 标志位判断,关键跳(但在此文不重要)
0180237A 68 40000400 push 40040
0180237F 8D55 B4 lea edx,dword ptr ss:[ebp-4C]
01802382 B8 9C248001 mov eax,etdirloc.0180249C
01802387 E8 304BFEFF call etdirloc.017E6EBC
0180238C 8B45 B4 mov eax,dword ptr ss:[ebp-4C]
0180238F E8 902AF7FF call etdirloc.01774E24
01802394 50 push eax
01802395 8D55 B0 lea edx,dword ptr ss:[ebp-50]
01802398 B8 E4248001 mov eax,etdirloc.018024E4
0180239D E8 1A4BFEFF call etdirloc.017E6EBC
018023A2 8B45 B0 mov eax,dword ptr ss:[ebp-50]
018023A5 E8 7A2AF7FF call etdirloc.01774E24
018023AA 50 push eax
018023AB 6A 00 push 0
018023AD E8 9255F7FF call <jmp.&user32.MessageBoxA> ; 注册成功提示****************
018023B2 A1 2CC18001 mov eax,dword ptr ds:[180C12C]
018023B7 8B00 mov eax,dword ptr ds:[eax]
018023B9 E8 82D0FCFF call etdirloc.017CF440
018023BE EB 38 jmp short etdirloc.018023F8
018023C0 68 30000400 push 40030
018023C5 8D55 AC lea edx,dword ptr ss:[ebp-54]
018023C8 B8 9C248001 mov eax,etdirloc.0180249C
018023CD E8 EA4AFEFF call etdirloc.017E6EBC
018023D2 8B45 AC mov eax,dword ptr ss:[ebp-54]
018023D5 E8 4A2AF7FF call etdirloc.01774E24
018023DA 50 push eax
018023DB 8D55 A8 lea edx,dword ptr ss:[ebp-58]
018023DE B8 28258001 mov eax,etdirloc.01802528
018023E3 E8 D44AFEFF call etdirloc.017E6EBC
018023E8 8B45 A8 mov eax,dword ptr ss:[ebp-58]
018023EB E8 342AF7FF call etdirloc.01774E24
018023F0 50 push eax
018023F1 6A 00 push 0
018023F3 E8 4C55F7FF call <jmp.&user32.MessageBoxA> ; 注册失败提示****************
018023F8 33C0 xor eax,eax
018023FA 5A pop edx
018023FB 59 pop ecx
018023FC 59 pop ecx
===================================================================================================
算法Call(1)
017E72DA 55 push ebp ; 算法Call(1)开始
017E72DB 68 1A747E01 push etdirloc.017E741A
017E72E0 64:FF30 push dword ptr fs:[eax]
017E72E3 64:8920 mov dword ptr fs:[eax],esp
017E72E6 C645 FF 00 mov byte ptr ss:[ebp-1],0
017E72EA B8 50697E01 mov eax,etdirloc.017E6950
017E72EF E8 64F8FFFF call etdirloc.017E6B58
017E72F4 84C0 test al,al
017E72F6 74 0C je short etdirloc.017E7304
017E72F8 A1 2CC18001 mov eax,dword ptr ds:[180C12C]
017E72FD 8B00 mov eax,dword ptr ds:[eax]
017E72FF E8 3C81FEFF call etdirloc.017CF440
017E7304 B8 04677E01 mov eax,etdirloc.017E6704
017E7309 E8 4AF8FFFF call etdirloc.017E6B58
017E730E 84C0 test al,al
017E7310 74 0C je short etdirloc.017E731E
017E7312 A1 2CC18001 mov eax,dword ptr ds:[180C12C]
017E7317 8B00 mov eax,dword ptr ds:[eax]
017E7319 E8 2281FEFF call etdirloc.017CF440
017E731E B8 18687E01 mov eax,etdirloc.017E6818
017E7323 E8 30F8FFFF call etdirloc.017E6B58
017E7328 84C0 test al,al
017E732A 74 0C je short etdirloc.017E7338
017E732C A1 2CC18001 mov eax,dword ptr ds:[180C12C]
017E7331 8B00 mov eax,dword ptr ds:[eax]
017E7333 E8 0881FEFF call etdirloc.017CF440
017E7338 8D45 F4 lea eax,dword ptr ss:[ebp-C]
017E733B E8 BCFAFFFF call etdirloc.017E6DFC ; 调用算法call(2)-根据硬盘号取得机器码
017E7340 8D4D F0 lea ecx,dword ptr ss:[ebp-10]
017E7343 8BD7 mov edx,edi ; edi=注册名
017E7345 A1 7CDC8001 mov eax,dword ptr ds:[180DC7C]
017E734A E8 BDFCFFFF call etdirloc.017E700C ; 调用算法call(4)-注册算法
017E734F 8B45 F0 mov eax,dword ptr ss:[ebp-10] ; EDX中存的就是注册真码
017E7352 8BF2 mov esi,edx ;!!!!!关键所在,请看后文分析!!!!!!!
017E7354 E8 17DAF8FF call etdirloc.01774D70 ; 由算法call(2)得出真正注册码
017E7359 0F85 A0000000 jnz etdirloc.017E73FF
017E735F B2 01 mov dl,1
..........
017E7419 C3 retn ; 算法Call(1)结束
===================================================================================================
算法Call(2)-根据硬盘号取得机器码
017E6DFC 55 push ebp ; 算法Call(2)开始-根据硬盘号取得机器码
017E6DFD 8BEC mov ebp,esp
017E6DFF 33C9 xor ecx,ecx
017E6E01 51 push ecx
017E6E02 51 push ecx
017E6E03 51 push ecx
017E6E04 51 push ecx
017E6E05 51 push ecx
017E6E06 53 push ebx
017E6E07 8BD8 mov ebx,eax
017E6E09 33C0 xor eax,eax
017E6E0B 55 push ebp
017E6E0C 68 AD6E7E01 push etdirloc.017E6EAD
017E6E11 64:FF30 push dword ptr fs:[eax]
017E6E14 64:8920 mov dword ptr fs:[eax],esp
017E6E17 8D45 FC lea eax,dword ptr ss:[ebp-4]
017E6E1A E8 5DFEFFFF call etdirloc.017E6C7C
017E6E1F 8D55 F8 lea edx,dword ptr ss:[ebp-8]
017E6E22 8B45 FC mov eax,dword ptr ss:[ebp-4] ; L407S8SG =ebp-4送eax
017E6E25 E8 F220F9FF call etdirloc.01778F1C
017E6E2A 8B55 F8 mov edx,dword ptr ss:[ebp-8] ; ebp-8=L407S8SG,送edx
017E6E2D 8D45 FC lea eax,dword ptr ss:[ebp-4]
017E6E30 E8 D7DBF8FF call etdirloc.01774A0C
017E6E35 837D FC 00 cmp dword ptr ss:[ebp-4],0 ; L407S8SG与0比较,判断是否有硬盘
017E6E39 74 22 je short etdirloc.017E6E5D
017E6E3B 8D45 F4 lea eax,dword ptr ss:[ebp-C]
017E6E3E 50 push eax
017E6E3F 33C9 xor ecx,ecx
017E6E41 BA 12000000 mov edx,12 ; edx=12
017E6E46 8B45 FC mov eax,dword ptr ss:[ebp-4] ; L407S8SG=ebp-4送eax,硬盘ID转移
017E6E49 E8 FA000000 call etdirloc.017E6F48 ; 调用算法Call(3)-机器码算法
017E6E4E 8B55 F4 mov edx,dword ptr ss:[ebp-C] ; 由前个Call得出“14121011813951089292015”
017E6E51 B8 7CDC8001 mov eax,etdirloc.0180DC7C
017E6E56 E8 6DDBF8FF call etdirloc.017749C8
017E6E5B EB 28 jmp short etdirloc.017E6E85
017E6E5D 8D45 F0 lea eax,dword ptr ss:[ebp-10]
017E6E60 50 push eax
017E6E61 8D45 EC lea eax,dword ptr ss:[ebp-14]
017E6E64 E8 2FFDFFFF call etdirloc.017E6B98
017E6E69 8B45 EC mov eax,dword ptr ss:[ebp-14]
017E6E6C 33C9 xor ecx,ecx
017E6E6E BA 12000000 mov edx,12
017E6E73 E8 D0000000 call etdirloc.017E6F48
017E6E78 8B55 F0 mov edx,dword ptr ss:[ebp-10]
017E6E7B B8 7CDC8001 mov eax,etdirloc.0180DC7C
017E6E80 E8 43DBF8FF call etdirloc.017749C8
017E6E85 8BC3 mov eax,ebx
017E6E87 8B15 7CDC8001 mov edx,dword ptr ds:[180DC7C]
017E6E8D E8 36DBF8FF call etdirloc.017749C8
017E6E92 33C0 xor eax,eax
017E6E94 5A pop edx
017E6E95 59 pop ecx
017E6E96 59 pop ecx
017E6E97 64:8910 mov dword ptr fs:[eax],edx
017E6E9A 68 B46E7E01 push etdirloc.017E6EB4
017E6E9F 8D45 EC lea eax,dword ptr ss:[ebp-14]
017E6EA2 BA 05000000 mov edx,5
017E6EA7 E8 ECDAF8FF call etdirloc.01774998
017E6EAC C3 retn ; 算法Call(2)结束
===================================================================================================
算法Call(3)--机器码算法
017E6F48 55 push ebp ; 算法Call(3)开始--机器码算法
017E6F49 8BEC mov ebp,esp
017E6F4B 83C4 EC add esp,-14
017E6F4E 53 push ebx
017E6F4F 56 push esi
017E6F50 57 push edi
017E6F51 33DB xor ebx,ebx
017E6F53 895D EC mov dword ptr ss:[ebp-14],ebx
017E6F56 895D F0 mov dword ptr ss:[ebp-10],ebx
017E6F59 894D F4 mov dword ptr ss:[ebp-C],ecx
017E6F5C 8955 F8 mov dword ptr ss:[ebp-8],edx
017E6F5F 8945 FC mov dword ptr ss:[ebp-4],eax
017E6F62 33C0 xor eax,eax
017E6F64 55 push ebp
017E6F65 68 FA6F7E01 push etdirloc.017E6FFA
017E6F6A 64:FF30 push dword ptr fs:[eax]
017E6F6D 64:8920 mov dword ptr fs:[eax],esp
017E6F70 8B45 FC mov eax,dword ptr ss:[ebp-4]
017E6F73 E8 B4DCF8FF call etdirloc.01774C2C ; L407S8SG=eax
017E6F78 8BF8 mov edi,eax
017E6F7A 85FF test edi,edi
017E6F7C 7E 61 jle short etdirloc.017E6FDF
017E6F7E BE 01000000 mov esi,1
017E6F83 8B45 FC mov eax,dword ptr ss:[ebp-4] ; L407S8SG=ebp-4送eax
017E6F86 0FB64430 FF movzx eax,byte ptr ds:[eax+esi->; 逐位取硬盘ID ASCII值“L407S8SG”,送eax
017E6F8B 99 cdq
017E6F8C F77D F8 idiv dword ptr ss:[ebp-8] ; L407S8SG逐位取,每位ASCII码除12,结果整数放eax,余数放edx
017E6F8F 8BDA mov ebx,edx ; 余数放edx并送ebx
017E6F91 33DE xor ebx,esi ; 余数逐位与1,2,3……15进行xor运算,结果记和起来就是机器码
017E6F93 837D F4 01 cmp dword ptr ss:[ebp-C],1 ; 与1比较
017E6F97 75 2A jnz short etdirloc.017E6FC3 ; 不相等就跳,如果不跳,就走下面的计算
017E6F99 8BC3 mov eax,ebx
017E6F9B B9 24000000 mov ecx,24
017E6FA0 99 cdq
017E6FA1 F7F9 idiv ecx
017E6FA3 8BDA mov ebx,edx
017E6FA5 8D45 F0 lea eax,dword ptr ss:[ebp-10]
017E6FA8 8A93 90B78001 mov dl,byte ptr ds:[ebx+180B790>
017E6FAE E8 A1DBF8FF call etdirloc.01774B54
017E6FB3 8B55 F0 mov edx,dword ptr ss:[ebp-10]
017E6FB6 8B45 08 mov eax,dword ptr ss:[ebp+8]
017E6FB9 E8 76DCF8FF call etdirloc.01774C34
017E6FBE 8B45 08 mov eax,dword ptr ss:[ebp+8]
017E6FC1 EB 18 jmp short etdirloc.017E6FDB
017E6FC3 8D55 EC lea edx,dword ptr ss:[ebp-14]
017E6FC6 8BC3 mov eax,ebx ; E送eax
017E6FC8 E8 6B21F9FF call etdirloc.01779138 ; 将值转化为十进制
017E6FCD 8B55 EC mov edx,dword ptr ss:[ebp-14] ; 由前面的Call将codeA逐个由16位转成十进制,即59365498545897452114
017E6FD0 8B45 08 mov eax,dword ptr ss:[ebp+8]
017E6FD3 E8 5CDCF8FF call etdirloc.01774C34
017E6FD8 8B45 08 mov eax,dword ptr ss:[ebp+8]
017E6FDB 46 inc esi
017E6FDC 4F dec edi
017E6FDD ^ 75 A4 jnz short etdirloc.017E6F83 ; 循环计算
017E6FDF 33C0 xor eax,eax
017E6FE1 5A pop edx
017E6FE2 59 pop ecx
017E6FE3 59 pop ecx
017E6FE4 64:8910 mov dword ptr fs:[eax],edx
017E6FE7 68 01707E01 push etdirloc.017E7001
017E6FEC 8D45 EC lea eax,dword ptr ss:[ebp-14]
017E6FEF BA 02000000 mov edx,2
017E6FF4 E8 9FD9F8FF call etdirloc.01774998
017E6FF9 C3 retn ; 算法Call(3)结束
===================================================================================================
算法call(4)-注册算法
017E700C 55 push ebp ; 算法call(4)开始-注册算法
017E700D 8BEC mov ebp,esp
017E700F 83C4 E0 add esp,-20
017E7012 53 push ebx
017E7013 56 push esi
017E7014 57 push edi
017E7015 33DB xor ebx,ebx
017E7017 895D E0 mov dword ptr ss:[ebp-20],ebx
017E701A 895D E4 mov dword ptr ss:[ebp-1C],ebx
017E701D 894D F4 mov dword ptr ss:[ebp-C],ecx
017E7020 8955 F8 mov dword ptr ss:[ebp-8],edx
017E7023 8945 FC mov dword ptr ss:[ebp-4],eax
017E7026 33C0 xor eax,eax
017E7028 55 push ebp
017E7029 68 19717E01 push etdirloc.017E7119
017E702E 64:FF30 push dword ptr fs:[eax]
017E7031 64:8920 mov dword ptr fs:[eax],esp
017E7034 8B45 F4 mov eax,dword ptr ss:[ebp-C]
017E7037 E8 38D9F8FF call etdirloc.01774974
017E703C 8B45 FC mov eax,dword ptr ss:[ebp-4]
017E703F E8 E8DBF8FF call etdirloc.01774C2C
017E7044 85C0 test eax,eax
017E7046 0F84 B2000000 je etdirloc.017E70FE
017E704C 8B45 F8 mov eax,dword ptr ss:[ebp-8]
017E704F E8 D8DBF8FF call etdirloc.01774C2C
017E7054 85C0 test eax,eax
017E7056 0F84 A2000000 je etdirloc.017E70FE
017E705C 8D45 E4 lea eax,dword ptr ss:[ebp-1C]
017E705F E8 10D9F8FF call etdirloc.01774974
017E7064 8B45 FC mov eax,dword ptr ss:[ebp-4]
017E7067 E8 C0DBF8FF call etdirloc.01774C2C
017E706C 8945 EC mov dword ptr ss:[ebp-14],eax
017E706F 8B45 F8 mov eax,dword ptr ss:[ebp-8]
017E7072 E8 B5DBF8FF call etdirloc.01774C2C
017E7077 8945 E8 mov dword ptr ss:[ebp-18],eax
017E707A BF 01000000 mov edi,1 ; EDX置1
017E707F BB 01000000 mov ebx,1 ; EBX置1
017E7084 C745 F0 0100000>mov dword ptr ss:[ebp-10],1 ; [ebp-10]=1
017E708B 8B45 FC mov eax,dword ptr ss:[ebp-4] ; 求出注册码,循环开始
017E708E 0FB64438 FF movzx eax,byte ptr ds:[eax+edi->; 机器码ASCII码逐位放入EAX
017E7093 2B45 F0 sub eax,dword ptr ss:[ebp-10] ; 减去 SS:[EBP-10]中的值
017E7096 03C7 add eax,edi ; 加上EDI
017E7098 8B55 F8 mov edx,dword ptr ss:[ebp-8]
017E709B 0FB6541A FF movzx edx,byte ptr ds:[edx+ebx->; 用户名ASCII码逐位放入EDX
017E70A0 33C2 xor eax,edx ; 上面两个数异或运算
017E70A2 03C3 add eax,ebx ; 上面得到的值加上EBX
017E70A4 99 cdq ; 扩展指令
017E70A5 33C2 xor eax,edx ; eax xor edx
017E70A7 2BC2 sub eax,edx ; eax-edx
017E70A9 8BF0 mov esi,eax ; eax转移
017E70AB 8BC6 mov eax,esi
017E70AD B9 24000000 mov ecx,24 ; ECX的值为24
017E70B2 99 cdq ; 扩展指令
017E70B3 F7F9 idiv ecx ; EAX中的值除以24,余数放在EDX中
017E70B5 8BF2 mov esi,edx ; EDX中的值放在ESI中
017E70B7 8D45 E0 lea eax,dword ptr ss:[ebp-20]
017E70BA 8A96 90B78001 mov dl,byte ptr ds:[esi+180B790>; 找到内存密码表中相应的值,把这些值连接起来就是真码
017E70C0 E8 8FDAF8FF call etdirloc.01774B54
017E70C5 8B55 E0 mov edx,dword ptr ss:[ebp-20]
017E70C8 8D45 E4 lea eax,dword ptr ss:[ebp-1C]
017E70CB E8 64DBF8FF call etdirloc.01774C34
017E70D0 3B7D EC cmp edi,dword ptr ss:[ebp-14] ; EDI中的值和机器码位数比较
017E70D3 7D 03 jge short etdirloc.017E70D8
017E70D5 47 inc edi
017E70D6 EB 05 jmp short etdirloc.017E70DD
017E70D8 BB 01000000 mov ebx,1
017E70DD 3B5D E8 cmp ebx,dword ptr ss:[ebp-18] ; EBX中的值和用户名位数比
017E70E0 7D 03 jge short etdirloc.017E70E5
017E70E2 43 inc ebx
017E70E3 EB 05 jmp short etdirloc.017E70EA
017E70E5 BB 01000000 mov ebx,1
017E70EA FF45 F0 inc dword ptr ss:[ebp-10] ; SS:[EBP-10]中的值加1
017E70ED 837D F0 15 cmp dword ptr ss:[ebp-10],15 ; SS:[EBP-10]的值和15h比较,控制循环次数
017E70F1 ^ 75 98 jnz short etdirloc.017E708B ; 循环结束
017E70F3 8B45 F4 mov eax,dword ptr ss:[ebp-C]
017E70F6 8B55 E4 mov edx,dword ptr ss:[ebp-1C]
017E70F9 E8 CAD8F8FF call etdirloc.017749C8
017E70FE 33C0 xor eax,eax
017E7100 5A pop edx
017E7101 59 pop ecx
017E7102 59 pop ecx
017E7103 64:8910 mov dword ptr fs:[eax],edx
017E7106 68 20717E01 push etdirloc.017E7120
017E710B 8D45 E0 lea eax,dword ptr ss:[ebp-20]
017E710E BA 02000000 mov edx,2
017E7113 E8 80D8F8FF call etdirloc.01774998
017E7118 C3 retn ; 算法Call(3)结束
===================================================================================================
【破解总结】
在这里给出的Call算法2-4并不是本文的关键,我只是将前辈们的分析成果一起放到这里方便大家研究。
经过四个Call的分析可以得出这样的结论:当 Call(1) retn 的时候程序立即在 01802376 处进行标志位检验,所以真假码的对比判断必定在 Call(1) 中完成。
下面进入 Call(1) 中,一步一步跟下去会发现程序在 017E734A 调用 Call(4) 计算注册码,先不管 Call(4) 接着来到下两句 017E7352,你会惊奇的发现 esi 和 edx 两个寄存器中分别存放着真假注册码。而且是将 edx 中的假码覆盖写入 esi 的真码,很明显是要将假码压入堆栈在 017E7354 调用 Call(2) 比较。
怎么样,脑子中是不是出现一个很坏的念头:把 017E7352 的 mov esi,edx 改为 mov edx,esi 会有什么后果。哈哈,恭喜你想对了,这样一来堆栈中存的就全都是程序自己算出来的真码啦,不管程序运行到哪里都是用两个真码进行比较,自然就会成功注册了。
既然已经找到要改的地方了,接下来可以使用 W32Dasm 打开 ETDirLock.dll 定位到 017E7352 将 8BF2 mov esi,edx 改为 8BD6 mov edx,esi,然后覆盖原文件,运行软件随意输入用户名与注册码,哈哈,提示什么?成功注册了。
再验证一下,将原文件覆盖回去,运行软件,嗯,仍然是注册版。只要保留修改后的 ETDirLock.dll 文件就可以不用OD跟码,一劳永逸的让程序自己注册了。
这是偶发表的第一篇破文,所有分析是建立在前辈们的成果基础上的,希望不要被大家耻笑为抄袭用鸡蛋砸我哦,有兴趣的朋友请自己动手啊~~
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课