【破文标题】Dll Show 4.7 汉化版注册算法
【破文作者】XXNB
【作者邮箱】支持PYG
【作者主页】http://free.ys168.com/?binbinbin7456
【破解工具】OD
【破解平台】xpsp2
【软件名称】Dll Show 4.7 汉化版
【软件大小】100 KB 
【原版下载】http://www.xdowns.com/soft/6/54/2006/Soft_28849.html
【保护方式】名+公司+码
【软件简介】可显示出程序启动过程,如内存的载入,与程序相关连的 DLL文件等。实时观察你的 Win95 当前进程使用情况。由于原程序原因

,有些项目不能汉化,敬请原谅! Dll Show 4.7 的汉化文件此为汉化修改版,无需原英文软件,解压后直接使用。
【破解声明】向大侠们学习!!!只为学习!
------------------------------------------------------------------------
【破解过程】
------------------------------------------------------------------------
1、早上看到一个dll,居然是英文的,所以想汉化它,没想到搜索了下找到这个软件,一运行就是个unreg。(感觉象是在示威)虽然已经有现

成的注册信息,毕竟是别人的,但我还是自己弄。

刚开始用messageboxa和getwindowtext都没能断下来。后来再看看,原来还有个GetDlgItemTextA。试了下能断。

在输入信息

user name:pediy

organization:yulin

registration:123456

按“OK”,OD中断在下面:

0041679B  |.  FF15 6C024200     call    dword ptr [<&USER32.GetDlgItemTextA>]  ; \GetDlgItemTextA     断在这里了。
004167A1  |.  5F                pop     edi
004167A2  |.  5E                pop     esi
004167A3  |.  B8 01000000       mov     eax, 1
004167A8  |.  5B                pop     ebx
004167A9  \.  C3                retn                     这里我们返回后,上下找了下可以得到下面关键代码。请看注释::

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
0040E430  /$  81EC 00010000     sub     esp, 100             如果要再重新开始的话,我们在这里下断,
0040E436  |.  53                push    ebx
0040E437  |.  55                push    ebp
0040E438  |.  8BAC24 0C010000   mov     ebp, dword ptr [esp+10C]
0040E43F  |.  56                push    esi
0040E440  |.  8BB424 14010000   mov     esi, dword ptr [esp+114]               ;  用户名
0040E447  |.  8B46 64           mov     eax, dword ptr [esi+64]
0040E44A  |.  85C0              test    eax, eax
0040E44C  |.  74 0D             je      short 0040E45B
0040E44E  |.  A1 900B4300       mov     eax, dword ptr [430B90]
0040E453  |.  85C0              test    eax, eax
0040E455  |.  0F84 A2000000     je      0040E4FD
0040E45B  |>  57                push    edi
0040E45C  |.  6A 32             push    32
0040E45E  |.  56                push    esi
0040E45F  |.  6A 65             push    65
0040E461  |.  55                push    ebp
0040E462  |.  E8 09830000       call    00416770                               ;  读取公司名称
0040E467  |.  8D7E 32           lea     edi, dword ptr [esi+32]
0040E46A  |.  6A 32             push    32
0040E46C  |.  57                push    edi
0040E46D  |.  6A 66             push    66
0040E46F  |.  55                push    ebp
0040E470  |.  E8 FB820000       call    00416770
0040E475  |.  8D4424 30         lea     eax, dword ptr [esp+30]
0040E479  |.  68 00010000       push    100
0040E47E  |.  50                push    eax
0040E47F  |.  6A 67             push    67
0040E481  |.  55                push    ebp
0040E482  |.  E8 E9820000       call    00416770
0040E487  |.  8D4C24 40         lea     ecx, dword ptr [esp+40]                ;  读取假码
0040E48B  |.  51                push    ecx
0040E48C  |.  E8 65980000       call    00417CF6                               ;  假码转换成16进制函数
0040E491  |.  56                push    esi
0040E492  |.  8BD8              mov     ebx, eax
0040E494  |.  E8 67820000       call    00416700                               ;  这个是关键call。《《《《《《《《《《《(1)
0040E499  |.  83C4 38           add     esp, 38
0040E49C  |.  3D 92A71901       cmp     eax, 119A792                           ;  这里如果相等的话会很光荣的哦。好像是作者专

用的注册信息。
0040E4A1      75 18             jnz     short 0040E4BB
0040E4A3  |.  8B1D A0014200     mov     ebx, dword ptr [<&KERNEL32.lstrcpyA>]  ;  kernel32.lstrcpyA
0040E4A9  |.  68 60434200       push    00424360                               ; /gregory braun
0040E4AE  |.  56                push    esi                                    ; |String1
0040E4AF  |.  FFD3              call    ebx                                    ; \lstrcpyA
0040E4B1  |.  68 50434200       push    00424350                               ; /software design
0040E4B6  |.  57                push    edi                                    ; |String1
0040E4B7  |.  FFD3              call    ebx                                    ; \lstrcpyA
0040E4B9  |.  EB 07             jmp     short 0040E4C2
0040E4BB  |>  3D 3CCE5F0D       cmp     eax, 0D5FCE3C
0040E4C0  |.  75 0C             jnz     short 0040E4CE
0040E4C2  |>  57                push    edi
0040E4C3  |.  56                push    esi
0040E4C4  |.  E8 D77B0000       call    004160A0
0040E4C9  |.  83C4 08           add     esp, 8
0040E4CC  |.  8BD8              mov     ebx, eax
0040E4CE  |>  57                push    edi
0040E4CF  |.  56                push    esi
0040E4D0  |.  E8 CB7B0000       call    004160A0                               ;  这里面还有个运算。《《《《《《《《《《(2)
0040E4D5  |.  83C4 08           add     esp, 8
0040E4D8  |.  3BD8              cmp     ebx, eax                               ;  和输入的假码比较。这里eax装成10进制就是真码
0040E4DA  |.  5F                pop     edi                                    ;  相等的话就注册成功。(废话)
0040E4DB      74 1D             je      short 0040E4FA                         ;  这个一定要跳,不然就没了。~~~
0040E4DD  |.  68 CFEA0000       push    0EACF
0040E4E2  |.  68 88130000       push    1388
0040E4E7  |.  55                push    ebp
0040E4E8  |.  E8 33BAFFFF       call    00409F20                               ;  这里弹出错误对话框
0040E4ED  |.  83C4 0C           add     esp, 0C
0040E4F0  |.  5E                pop     esi
0040E4F1  |.  5D                pop     ebp
0040E4F2  |.  5B                pop     ebx
0040E4F3  |.  81C4 00010000     add     esp, 100
0040E4F9  |.  C3                retn
0040E4FA  |>  895E 64           mov     dword ptr [esi+64], ebx                ;  能跳到这句的话就成功了。
0040E4FD  |>  6A 68             push    68                                     ; /ButtonID = 68 (104.)
0040E4FF  |.  55                push    ebp                                    ; |hWnd
0040E500  |.  FF15 B8024200     call    dword ptr [<&USER32.IsDlgButtonChecked>; \IsDlgButtonChecked




+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2、首先跟进(1)这里这个 0040E494    call    00416700 。得到下面:

00416700  /$  51                push    ecx                                    ;  DLLShow.004283C6
00416701  |.  53                push    ebx
00416702  |.  8B5C24 0C         mov     ebx, dword ptr [esp+C]                 ;  用户名
00416706  |.  56                push    esi
00416707  |.  33F6              xor     esi, esi
00416709  |.  53                push    ebx                                    ; /String
0041670A  |.  897424 0C         mov     dword ptr [esp+C], esi                 ; |
0041670E  |.  FF15 EC004200     call    dword ptr [<&KERNEL32.lstrlenA>]       ; \得到用户名位数
00416714  |.  85DB              test    ebx, ebx
00416716  |.  74 4F             je      short 00416767
00416718  |.  85C0              test    eax, eax
0041671A  |.  74 4B             je      short 00416767
0041671C  |.  33D2              xor     edx, edx
0041671E  |.  85C0              test    eax, eax
00416720  |.  7E 45             jle     short 00416767
00416722  |.  55                push    ebp
00416723  |.  57                push    edi                                    ;  公司名
00416724  |.  BE 8C624200       mov     esi, 0042628C                          ;  |b!pz*ls;rn|lf$vi^Axpe)

rx5aic&9/2m5lsi4@0dmZw94cmqpfhw
00416729  |.  BF 01000000       mov     edi, 1                                 ;  上面是固定字符串,
0041672E  |.  2BF3              sub     esi, ebx
00416730  |.  8BCB              mov     ecx, ebx
00416732  |.  2BFB              sub     edi, ebx
00416734  |>  0FBE1C0E          /movsx   ebx, byte ptr [esi+ecx]               ;  逐个取固定字符串到ebx
00416738  |.  0FBEAC10 54624200 |movsx   ebp, byte ptr [eax+edx+426254]        ;  这里也是逐个取另一个固定字符串的。只不过取

这个字符串要靠用户名的长度来决定。这个字符串我们可以找到是:#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtKpzSdtzoXqmb^Al@dv:s?x/
00416740  |.  0FAFDD            |imul    ebx, ebp                              ;  取到的这两个Ascii码值相乘
00416743  |.  8D2C0F            |lea     ebp, dword ptr [edi+ecx]
00416746  |.  0FAFDD            |imul    ebx, ebp                              ;  乘以ebp
00416749  |.  0FBE29            |movsx   ebp, byte ptr [ecx]                   ;  逐个取用户名ascii码值
0041674C  |.  0FAFDD            |imul    ebx, ebp                              ;  和上面的结果乘,结果在ebx
0041674F  |.  8B6C24 10         |mov     ebp, dword ptr [esp+10]
00416753  |.  03EB              |add     ebp, ebx                              ;  加上一次循环的结果
00416755  |.  42                |inc     edx
00416756  |.  41                |inc     ecx
00416757  |.  3BD0              |cmp     edx, eax                              ;  比较看看取完用户名没有
00416759  |.  896C24 10         |mov     dword ptr [esp+10], ebp               ;  运算的最终结果在esp+10里面
0041675D  |.^ 7C D5             \jl      short 00416734
0041675F  |.  8BC5              mov     eax, ebp                               ;  运算结果给eax
00416761  |.  5F                pop     edi                                    ;  公司名
00416762  |.  5D                pop     ebp                                    ;  
00416763  |.  5E                pop     esi                                    ;  用户名
00416764  |.  5B                pop     ebx                                    ;  假码
00416765  |.  59                pop     ecx
00416766  |.  C3                retn                   这里返回的就是eax的值了


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3、然后跟进(2)那里那个 0040E4D0    call    004160A0。这个call里面又会两次调用上面的那个(1)的call。一次是用来计算用户名,

另一次用来计算公司名。具体看下面代码:

004160A0  /$  8B4424 04         mov     eax, dword ptr [esp+4]
004160A4  |.  56                push    esi
004160A5  |.  8B35 64074300     mov     esi, dword ptr [430764]           ;  DB95DB95   这里这个是个常量。
004160AB  |.  50                push    eax                               ;  用户名
004160AC  |.  81CE 78030000     or      esi, 378                          ;  和378或
004160B2  |.  E8 49060000       call    00416700                          ;  这个是对用户名的运算结果。调用(1)的call
004160B7  |.  8B4C24 10         mov     ecx, dword ptr [esp+10]           
004160BB  |.  03F0              add     esi, eax                          ;  上面或的结果和运算结果相加
004160BD  |.  51                push    ecx                               ;  公司名
004160BE  |.  E8 3D060000       call    00416700                          ;  这个是对公司名的运算结果。也调用(1)的call
004160C3  |.  83C4 08           add     esp, 8
004160C6  |.  03C6              add     eax, esi                          ;  再加上就是注册码了,是装成10进制就是真码
004160C8  |.  5E                pop     esi                               
004160C9  \.  C3                retn



午睡中~~等下看能不能写注册机。
【破解总结】
------------------------------------------------------------------------
1、算法跟用户名和公司名都有关系,还有,软件好像没有对用户名等位数进行限制,所以不要填写太长的哦。

2、两个固定字符串。第一个直接看出来的:|b!pz*ls;rn|lf$vi^Axpe)rx5aic&9/2m5lsi4@0dmZw94cmqpfhw。
   第二个我们可以跟进软件在内存中找到:#serB&nz|mfM1/5(!sd$Mq.{s]+sFjtKpzSdtzoXqmb^Al@dv:s?x/。我在想是不是每台电脑的都一样。

3、先是算法call(1)从开头逐个取第一个字符串的Ascii码值,得a1。第二个字符串从(用户名的位数+循环次数)位置开始取Ascii码值,

得a2。     然后:a1×a2×循环次数。然后结果再×逐个取用户名的Ascii码值。最后和上一次的循环结果相加。这里加后的结果如果等于

119A792。那么恭喜您。你就是作者了。它会自动赋值。具体效果自己试试看。

4、上面加后的结果如果不等于119A792的话。就会进入算法(2)的call。就是用一个常量DB95DB95和378或。再调用算法call(1)来对用户名

和公司名进行运算。然后这三个结果相加。就是真码了(是装成10进制后的哦)。