![]() |
【破文标题】Dll Show 4.7 汉化版注册算法 【破文作者】XXNB 【作者邮箱】支持PYG 【作者主页】http://free.ys168.com/?binbinbin7456 【破解工具】OD 【破解平台】xpsp2 【软件名称】Dll Show 4.7 汉化版 【软件大小】100 KB 【原版下载】http://www. |
【破解过程】 ------------------------------------------------------------------------ 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 /$Content$nbsp; 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 /$Content$nbsp; 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 /$Content$nbsp; 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进制后的哦)。 |