【破文标题】易通文件夹锁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
【保护方式】壳,注册码
【破解声明】学习飘云阁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跟码,一劳永逸的让程序自己注册了。

  这是偶发表的第一篇破文,所有分析是建立在前辈们的成果基础上的,希望不要被大家耻笑为抄袭用鸡蛋砸我哦,有兴趣的朋友请自己动手啊~~