来篇简单的破文,帮我写注册机!! (7千字)
EZ Extract Resource v1.3软件介绍:
懒的写了,反正是个资源提取软件!
下载地址:www.seamoontech.com
废话少说,下载安装后,运行程序,弹出注册框,输入用户名:Turkey,注册码:987654321,确定。软件告诉你要重新运行软件来检查注册成功与否。好,关闭软件,我门来找它把注册信息放的哪里里了,呵呵。运气好,注册码存放在注册表里面,而且是明文形式的,好说。
启动trw,load软件,在入口处被trw断下,我们下断点
bpx RegQueryValueExa do "db *(esp+8)"
先解释一下这个命令的作用,当软件去读取注册表中某一个键的值的时候,就会被trw中断下来,且自动显示*(esp+8)的内容,内容就是那个键的名称!双引号中就是被断下来后执行的命令,这样我们可以省很多操作,不要问我为什么*(esp+8)中就是那个键的名称,我也不知道,我只是依葫芦画瓢!
接下来按F5让软件继续运行,在中断N次后,在trw的数据窗口的右上角区域,终于看到了存放用户名的那个键的名称“regusername”,再按几下F5,看到了存放注册码的那个键的名称“regcode”,再安一下F5,也就是当你第二次看到“regcode”时(为什么实在第二次?因为我试过啊,再按F5你看到的就不是regcode啦,所以是第二次啦),下bd *,然后pmodule回到程序领空,这时候改用F10开始慢慢的,小心的跟踪,不久你就来到如下地方:
|:0040CE56
|
:0040D5B0 6AFF push FFFFFFFF
:0040D5B2 68B0DB4500 push 0045DBB0
:0040D5B7 64A100000000 mov eax, dword ptr fs:[00000000]
:0040D5BD 50 push eax
:0040D5BE 64892500000000 mov dword ptr fs:[00000000], esp
:0040D5C5 81ECD0000000 sub esp, 000000D0
:0040D5CB C78424D800000000000000 mov dword ptr [esp+000000D8], 00000000
:0040D5D6 8B8424E0000000 mov eax, dword ptr [esp+000000E0]//用户名送eax
:0040D5DD 6874CC4700 push 0047CC74
:0040D5E2 50 push eax
:0040D5E3 E8D1A20100 call 004278B9
:0040D5E8 83C408 add esp, 00000008
:0040D5EB 85C0 test eax, eax//测试用户名是否为空
:0040D5ED 0F8432010000 je 0040D725//空就跳走
:0040D5F3 8B8C24E4000000 mov ecx, dword ptr [esp+000000E4]//注册码送ecx
:0040D5FA 6874CC4700 push 0047CC74
:0040D5FF 51 push ecx
:0040D600 E8B4A20100 call 004278B9
:0040D605 83C408 add esp, 00000008
:0040D608 85C0 test eax, eax//测试注册码是否为空
:0040D60A 0F8415010000 je 0040D725//空就跳走
:0040D610 8B9424E0000000 mov edx, dword ptr [esp+000000E0]//用户名送edx
:0040D617 53 push ebx
:0040D618 56 push esi
:0040D619 33C9 xor ecx, ecx
:0040D61B 8B72F8 mov esi, dword ptr [edx-08]//用户名长度送esi
:0040D61E C644240868 mov [esp+08], 68--
:0040D623 85F6 test esi, esi |
:0040D625 C644240979 mov [esp+09], 79 |
:0040D62A C644240A64 mov [esp+0A], 64 |
:0040D62F C644240B73 mov [esp+0B], 73 这一段代码是在从[esp+08]处放入hydsoft字符串
:0040D634 C644240C6F mov [esp+0C], 6F |
:0040D639 C644240D66 mov [esp+0D], 66 |
:0040D63E C644240E74 mov [esp+0E], 74 |
:0040D643 C644240F00 mov [esp+0F], 00--
:0040D648 7E3F jle 0040D689
:0040D64A 55 push ebp
:0040D64B 57 push edi
:0040D64C 8D7C3417 lea edi, dword ptr [esp+esi+17]
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D685(C)
|
:0040D650 8B8424F0000000 mov eax, dword ptr [esp+000000F0]//用户名送eax
:0040D657 BD07000000 mov ebp, 00000007//7送ebp
:0040D65C 8A1C01 mov bl, byte ptr [ecx+eax]//[ecx+eax]送bl,eax中放的是用户名,第一次经过时ecx=0
:0040D65F 8BC1 mov eax, ecx//ecx->eax
:0040D661 99 cdq//edx清零
:0040D662 F7FD idiv ebp//(eax idiv ebp)->dl(指余数,下同)
:0040D664 0FBEC3 movsx eax, bl//bl->eax(带符号扩展,下同)
:0040D667 8BD9 mov ebx, ecx//ecx->ebx
:0040D669 0FBE541410 movsx edx, byte ptr [esp+edx+10]//[esp+edx+10]送edx,[esp+10]处放着字符串hydsoft
:0040D66E 03DA add ebx, edx//edx+ebx->ebx
:0040D670 03C3 add eax, ebx//ebx+eax->eax
:0040D672 BB09000000 mov ebx, 00000009//9送ebx
:0040D677 03C6 add eax, esi//eax+esi->eax,esi是用户名长度
:0040D679 99 cdq//edx清零
:0040D67A F7FB idiv ebx//(eax idiv ebx)->dl
:0040D67C 80C230 add dl, 30//dl+30->dl,实际上是将结果转换成阿拉伯数字
:0040D67F 41 inc ecx//ecx加1
:0040D680 8817 mov byte ptr [edi], dl//dl->[edi]
:0040D682 4F dec edi//edi减1
:0040D683 3BCE cmp ecx, esi//比较用户名是否取完
:0040D685 7CC9 jl 0040D650//没有取完,跳上去继续循环
:0040D687 5F pop edi
:0040D688 5D pop ebp
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D648(C)
|
:0040D689 8D464D lea eax, dword ptr [esi+4D]//[esi+4D]送eax,实际上是用户名长度加上4D的结果送eax
:0040D68C B909000000 mov ecx, 00000009//9送ecx
:0040D691 99 cdq//edx清零
:0040D692 F7F9 idiv ecx//(eax idiv ecx)->dl
:0040D694 8B8424EC000000 mov eax, dword ptr [esp+000000EC]//用户输入的假注册码送eax
:0040D69B 80C230 add dl, 30//dl+30->dl,作用和上面一样
:0040D69E 88543410 mov byte ptr [esp+esi+10], dl//dl->[esp+esi+10]
:0040D6A2 C644341100 mov [esp+esi+11], 00//00->[esp+esi+11],作为注册码的结束标志
:0040D6A7 8D742410 lea esi, dword ptr [esp+10]//真正的注册码送esi
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D6CD(C)
|
:0040D6AB 8A10 mov dl, byte ptr [eax]//这里向下是将真假注册码一位以为的进行比较,一个经典的组合!!
:0040D6AD 8A1E mov bl, byte ptr [esi]
:0040D6AF 8ACA mov cl, dl
:0040D6B1 3AD3 cmp dl, bl
:0040D6B3 751E jne 0040D6D3//不正确就死
:0040D6B5 84C9 test cl, cl
:0040D6B7 7416 je 0040D6CF
:0040D6B9 8A5001 mov dl, byte ptr [eax+01]
:0040D6BC 8A5E01 mov bl, byte ptr [esi+01]
:0040D6BF 8ACA mov cl, dl
:0040D6C1 3AD3 cmp dl, bl
:0040D6C3 750E jne 0040D6D3//不正确就死
:0040D6C5 83C002 add eax, 00000002
:0040D6C8 83C602 add esi, 00000002
:0040D6CB 84C9 test cl, cl//取完了吗?
:0040D6CD 75DC jne 0040D6AB//没有取完就跳上去继续循环
好了,关键代码就这些了,在0040D6AB处d eax看到自己输入的假码,d esi看到正确的注册码!!!算法就不总结了,我懒啊,呵呵,简单,一看就懂!
还是总结一下我的注册信息:
用户名:Turkey
注册码:0666252
事后的一点废话:
在注册表的这个地方
[HKEY_CURRENT_USER\Software\SeaMoonTech\EZ Extract Resource\V1.3]
存放这你的注册信息,将它改动或删除就又可以注册了!!
转载请保持其完整性!
Cracker:Turkey/灭害灵
2002.1.11@22:36
