spc_cll
发表于 2006-4-1 09:52:40
根据总坛主的算法写的注册机。
在我的机器上注册成功(windows 2000 professinal)
godhack
发表于 2006-4-26 17:15:51
写的好,正适合我等新人,谢谢了,楼主
godhack
发表于 2006-4-27 16:34:16
0050C783 E8EC260000 call 0050EE74 算法call,跟进去
:0050C788 8BD8 mov ebx, eax
:0050C78A 8B45FC mov eax, dword ptr
:0050C78D E84ACDEFFF call 004094DC
:0050C792 3BD8 cmp ebx, eax 这里ebx的十六进制是真码
为什么不是第二个CALL是算法CALL呢?怎么知道第一个CALL是算法CALL呢?谢谢!
lwz864
发表于 2006-5-14 10:30:02
还看不懂,先复制,收下了.楼主水平好高.
浮云思音
发表于 2006-6-17 17:11:54
这个弄了半天也是不懂,下的软件和楼主的不太一样
wangyc75
发表于 2006-7-5 19:02:41
太强了
谢谢
weiruan198
发表于 2006-8-5 22:20:10
学习中。。。。
Gue
发表于 2006-10-26 17:53:01
我的破文和注册机....如果有不对的地方还请大虾指导下..
//OD下断在这里
0050B0F8 55 push ebp
0050B0F9 8BEC mov ebp,esp
0050B0FB 33C9 xor ecx,ecx //ecx清零
0050B0FD 51 push ecx
0050B0FE 51 push ecx
0050B0FF 51 push ecx
0050B100 51 push ecx
0050B101 51 push ecx
0050B102 53 push ebx
0050B103 56 push esi
0050B104 8BF0 mov esi,eax
0050B106 33C0 xor eax,eax
0050B108 55 push ebp
0050B109 68 88B25000 push dumped_.0050B288
0050B10E 64:FF30 push dword ptr fs:
0050B111 64:8920 mov dword ptr fs:,esp
0050B114 8D55 F8 lea edx,dword ptr ss:
0050B117 8B86 00030000 mov eax,dword ptr ds:
0050B11D E8 8E75F3FF call dumped_.004426B0 //得到注册码放在101C4FC
0050B122 837D F8 00 cmp dword ptr ss:,0
0050B126 75 1F jnz short dumped_.0050B147 //拿到注册码就跳到0050B147
0050B128 B8 A0B25000 mov eax,dumped_.0050B2A0
0050B12D E8 9A07F3FF call dumped_.0043B8CC //如果没有拿到就显示一个对话框。"请输入注册认证码!"
0050B132 8B96 00030000 mov edx,dword ptr ds:
0050B138 A1 F8055400 mov eax,dword ptr ds:
0050B13D E8 CE26F5FF call dumped_.0045D810 //无关的CALL
0050B142 E9 1E010000 jmp dumped_.0050B265
0050B147 8D55 FC lea edx,dword ptr ss:
0050B14A 8B86 00030000 mov eax,dword ptr ds:
0050B150 E8 5B75F3FF call dumped_.004426B0 //...
0050B155 8D55 F4 lea edx,dword ptr ss:
0050B158 8B86 00030000 mov eax,dword ptr ds:
0050B15E E8 4D75F3FF call dumped_.004426B0 //...
0050B163 8B45 F4 mov eax,dword ptr ss:
0050B166 E8 DD9DEFFF call dumped_.00404F48 //返回注册码的长度 放在EAX中
0050B16B 8BD0 mov edx,eax
0050B16D 85D2 test edx,edx //检测注册码长度为不为零
0050B16F 7E 3C jle short dumped_.0050B1AD //<=0跳到50B1AD
0050B171 B8 01000000 mov eax,1 //累加以后可以得到下一个字符
0050B176 8B4D FC mov ecx,dword ptr ss:
0050B179 8A4C01 FF mov cl,byte ptr ds: //得到EAX对应位数的字符 放入cl
0050B17D 80F9 30 cmp cl,30
0050B180 72 08 jb short dumped_.0050B18A //cl中的字符ASCII码<30h则跳转到 50b18a
0050B182 8B5D FC mov ebx,dword ptr ss:
0050B185 80F9 39 cmp cl,39
0050B188 76 1F jbe short dumped_.0050B1A9 //cl中的字符ASCII<=39h则跳转到 50b1a9
0050B18A B8 BCB25000 mov eax,dumped_.0050B2BC
0050B18F E8 3807F3FF call dumped_.0043B8CC //提示"注册码输入有误!" 无关CALL
0050B194 8B96 00030000 mov edx,dword ptr ds:
0050B19A A1 F8055400 mov eax,dword ptr ds:
0050B19F E8 6C26F5FF call dumped_.0045D810 //无关的CALL
0050B1A4 E9 BC000000 jmp dumped_.0050B265
0050B1A9 40 inc eax //指向下一字符
0050B1AA 4A dec edx //待比较的字符数
0050B1AB ^ 75 C9 jnz short dumped_.0050B176 //还有字符没校验则跳转到 50b176 PS:注册码必须是数字
0050B1AD 8D55 F0 lea edx,dword ptr ss:
0050B1B0 8B86 FC020000 mov eax,dword ptr ds:
0050B1B6 E8 F574F3FF call dumped_.004426B0 //得到注册码放在1013024 长度放在EAX
0050B1BB 8B45 F0 mov eax,dword ptr ss: //机器码放入EAX
0050B1BE E8 19E3EFFF call dumped_.004094DC //16进制转换
0050B1C3 E8 F8360000 call dumped_.0050E8C0 //计算wangshuang + yaoyuan + JSBuilder + 前一个CALL的结果
0050B1C8 8BD8 mov ebx,eax
0050B1CA 8B45 FC mov eax,dword ptr ss:
0050B1CD E8 0AE3EFFF call dumped_.004094DC //上两个CALL产生的值和输入的注册码运算
0050B1D2 3BD8 cmp ebx,eax
0050B1D4 0F85 81000000 jnz dumped_.0050B25B //ebx != eax 跳转到 502B25B 跳必死 PS:爆破点
0050B1DA B2 01 mov dl,1
0050B1DC A1 34B94600 mov eax,dword ptr ds:
0050B1E1 E8 4E08F6FF call dumped_.0046BA34
0050B1E6 8BD8 mov ebx,eax
0050B1E8 BA 02000080 mov edx,80000002
0050B1ED 8BC3 mov eax,ebx
0050B1EF E8 E008F6FF call dumped_.0046BAD4
0050B1F4 33C9 xor ecx,ecx
0050B1F6 BA E0B25000 mov edx,dumped_.0050B2E0 ; ASCII "System\CurrentControlSet\Services\Class\knightsoft\JSBuilder"
0050B1FB 8BC3 mov eax,ebx
0050B1FD E8 120AF6FF call dumped_.0046BC14
0050B202 8D55 EC lea edx,dword ptr ss:
0050B205 8B86 FC020000 mov eax,dword ptr ds:
0050B20B E8 A074F3FF call dumped_.004426B0
0050B210 8B45 EC mov eax,dword ptr ss:
0050B213 E8 C4E2EFFF call dumped_.004094DC
0050B218 E8 A3360000 call dumped_.0050E8C0
0050B21D 8BC8 mov ecx,eax
0050B21F BA 28B35000 mov edx,dumped_.0050B328 ; ASCII "registecode"
0050B224 8BC3 mov eax,ebx
0050B226 E8 390BF6FF call dumped_.0046BD64
0050B22B 8BC3 mov eax,ebx
0050B22D E8 7208F6FF call dumped_.0046BAA4
0050B232 8BC3 mov eax,ebx
0050B234 E8 678CEFFF call dumped_.00403EA0
0050B239 B8 3CB35000 mov eax,dumped_.0050B33C
0050B23E E8 8906F3FF call dumped_.0043B8CC
0050B243 B8 8CB35000 mov eax,dumped_.0050B38C
0050B248 E8 7F06F3FF call dumped_.0043B8CC
0050B24D A1 AC305300 mov eax,dword ptr ds:
0050B252 8B00 mov eax,dword ptr ds:
0050B254 E8 C775F5FF call dumped_.00462820
0050B259 EB 0A jmp short dumped_.0050B265
0050B25B B8 B8B35000 mov eax,dumped_.0050B3B8
0050B260 E8 6706F3FF call dumped_.0043B8CC
0050B265 33C0 xor eax,eax
0050B267 5A pop edx
0050B268 59 pop ecx
0050B269 59 pop ecx
0050B26A 64:8910 mov dword ptr fs:,edx
0050B26D 68 8FB25000 push dumped_.0050B28F
0050B272 8D45 EC lea eax,dword ptr ss:
0050B275 BA 04000000 mov edx,4
0050B27A E8 359AEFFF call dumped_.00404CB4
0050B27F 8D45 FC lea eax,dword ptr ss:
0050B282 E8 099AEFFF call dumped_.00404C90
0050B287 C3 retn
//CALL from 50B1BE
004094DC /$53 push ebx
004094DD |.56 push esi
004094DE |.83C4 F4 add esp,-0C
004094E1 |.8BD8 mov ebx,eax //EBX = 机器码
004094E3 |.8BD4 mov edx,esp
004094E5 |.8BC3 mov eax,ebx //EAX = 机器码
004094E7 |.E8 58A2FFFF call dumped_.00403744 //运算机器码 EAX = 3EA3989 返回值为eax ; eax = 0; eax = 10 * eax + 机器码每一位的ASCII码
004094EC |.8BF0 mov esi,eax
004094EE |.833C24 00 cmp dword ptr ss:,0
004094F2 |.74 19 je short dumped_.0040950D //检测结果
004094F4 |.895C24 04 mov dword ptr ss:,ebx
004094F8 |.C64424 08 0B mov byte ptr ss:,0B
004094FD |.8D5424 04 lea edx,dword ptr ss:
00409501 |.A1 402F5300 mov eax,dword ptr ds:
00409506 |.33C9 xor ecx,ecx
00409508 |.E8 EBF9FFFF call dumped_.00408EF8
0040950D |>8BC6 mov eax,esi
0040950F |.83C4 0C add esp,0C
00409512 |.5E pop esi
00409513 |.5B pop ebx
00409514 \.C3 retn
CALL from 4094e7 函数功能:检测注册码是不是数字.. eax = 0; eax = ((eax + eax * 4) * 2) + 机器码每一位的ASCII码
00403744 /$53 push ebx
00403745 |.56 push esi
00403746 |.57 push edi
00403747 |.89C6 mov esi,eax
00403749 |.50 push eax
0040374A |.85C0 test eax,eax
0040374C |.74 6C je short dumped_.004037BA
0040374E |.31C0 xor eax,eax
00403750 |.31DB xor ebx,ebx
00403752 |.BF CCCCCC0C mov edi,0CCCCCCC
00403757 |>8A1E /mov bl,byte ptr ds:
00403759 |.46 |inc esi
0040375A |.80FB 20 |cmp bl,20
0040375D |.^ 74 F8 \je short dumped_.00403757 //第一个字符如果是空格的话就跳到403757
0040375F |.B5 00 mov ch,0
00403761 |.80FB 2D cmp bl,2D
00403764 |.74 62 je short dumped_.004037C8 //第一个字符如果是'-'的话就跳到 4037c8
00403766 |.80FB 2B cmp bl,2B
00403769 |.74 5F je short dumped_.004037CA //第一个字符如果是'+'的话就跳到 4037ca
0040376B |.80FB 24 cmp bl,24
0040376E |.74 5F je short dumped_.004037CF //第一个字符如果是'$'的话就跳到 4037cf
00403770 |.80FB 78 cmp bl,78
00403773 |.74 5A je short dumped_.004037CF //第一个字符如果是'x'的话就跳到 4037cf
00403775 |.80FB 58 cmp bl,58
00403778 |.74 55 je short dumped_.004037CF //第一个字符如果是'X'的话就跳到 4037cf
0040377A |.80FB 30 cmp bl,30
0040377D |.75 13 jnz short dumped_.00403792 //第一个字符如果是零的话就跳到 403792 测试有没有字符.没有的话跳到4037b0
0040377F |.8A1E mov bl,byte ptr ds: //得到第二个字符
00403781 |.46 inc esi //指向下一个字符
00403782 |.80FB 78 cmp bl,78
00403785 |.74 48 je short dumped_.004037CF //第二个字符是'x'的话就跳到 4037cf
00403787 |.80FB 58 cmp bl,58
0040378A |.74 43 je short dumped_.004037CF //第二个字符是'X'的话就跳到 4037cf
0040378C |.84DB test bl,bl
0040378E |.74 20 je short dumped_.004037B0 //没有字符的话跳到4037b0
00403790 |.EB 04 jmp short dumped_.00403796
00403792 |>84DB test bl,bl
00403794 |.74 2D je short dumped_.004037C3 //测试bl是否有字符
00403796 |>80EB 30 /sub bl,30
00403799 |.80FB 09 |cmp bl,9
0040379C |.77 25 |ja short dumped_.004037C3 //第二个字符不是数字的话跳到 4037c3
0040379E |.39F8 |cmp eax,edi
004037A0 |.77 21 |ja short dumped_.004037C3 //eax里面的值大于0CCCCCCC时跳到 4037c3
004037A2 |.8D0480 |lea eax,dword ptr ds: //eax = eax + eax * 4
004037A5 |.01C0 |add eax,eax //eax = eax + eax
004037A7 |.01D8 |add eax,ebx //eax = eax + ebx
004037A9 |.8A1E |mov bl,byte ptr ds: //取得字符
004037AB |.46 |inc esi //指向下一个字符
004037AC |.84DB |test bl,bl
004037AE |.^ 75 E6 \jnz short dumped_.00403796 //还有字符的话就继续循环 PS:机器码必须是数字否则跳出累加循环
004037B0 |>FECD dec ch
004037B2 |.74 09 je short dumped_.004037BD
004037B4 |.85C0 test eax,eax
004037B6 |.7D 4E jge short dumped_.00403806
004037B8 |.EB 09 jmp short dumped_.004037C3
004037BA |>46 inc esi
004037BB |.EB 06 jmp short dumped_.004037C3
004037BD |>F7D8 neg eax
004037BF |.7E 45 jle short dumped_.00403806
004037C1 |.78 43 js short dumped_.00403806
004037C3 |>5B pop ebx ;Default case of switch 004037E3
004037C4 |.29DE sub esi,ebx
004037C6 |.EB 41 jmp short dumped_.00403809
004037C8 |>FEC5 inc ch
004037CA |>8A1E mov bl,byte ptr ds:
004037CC |.46 inc esi
004037CD |.^ EB C3 jmp short dumped_.00403792
004037CF |>BF FFFFFF0F mov edi,0FFFFFFF
004037D4 |.8A1E mov bl,byte ptr ds:
004037D6 |.46 inc esi
004037D7 |.84DB test bl,bl
004037D9 |.^ 74 DF je short dumped_.004037BA
004037DB |>80FB 61 /cmp bl,61
004037DE |.72 03 |jb short dumped_.004037E3
004037E0 |.80EB 20 |sub bl,20
004037E3 |>80EB 30 |sub bl,30 ;Switch (cases 30..46)
004037E6 |.80FB 09 |cmp bl,9
004037E9 |.76 0B |jbe short dumped_.004037F6
004037EB |.80EB 11 |sub bl,11
004037EE |.80FB 05 |cmp bl,5
004037F1 |.^ 77 D0 |ja short dumped_.004037C3
004037F3 |.80C3 0A |add bl,0A ;Cases 41 ('A'),42 ('B'),43 ('C'),44 ('D'),45 ('E'),46 ('F') of switch 004037E3
004037F6 |>39F8 |cmp eax,edi ;Cases 30 ('0'),31 ('1'),32 ('2'),33 ('3'),34 ('4'),35 ('5'),36 ('6'),37 ('7'),38 ('8'),39 ('9') of switch 004037E3
004037F8 |.^ 77 C9 |ja short dumped_.004037C3
004037FA |.C1E0 04 |shl eax,4
004037FD |.01D8 |add eax,ebx
004037FF |.8A1E |mov bl,byte ptr ds:
00403801 |.46 |inc esi
00403802 |.84DB |test bl,bl
00403804 |.^ 75 D5 \jnz short dumped_.004037DB
00403806 |>59 pop ecx
00403807 |.31F6 xor esi,esi
00403809 |>8932 mov dword ptr ds:,esi
0040380B |.5F pop edi
0040380C |.5E pop esi
0040380D |.5B pop ebx
0040380E \.C3 retn
CALL from 50B1C3
0050E8C0 /$55 push ebp
0050E8C1 |.8BEC mov ebp,esp
0050E8C3 |.6A 00 push 0
0050E8C5 |.53 push ebx
0050E8C6 |.56 push esi //输入的注册码的地址
0050E8C7 |.8BF0 mov esi,eax
0050E8C9 |.33C0 xor eax,eax //EAX清零
0050E8CB |.55 push ebp
0050E8CC |.68 8EE95000 push dumped_.0050E98E
0050E8D1 |.64:FF30 push dword ptr fs:
0050E8D4 |.64:8920 mov dword ptr fs:,esp
0050E8D7 |.BB D9D10E00 mov ebx,0ED1D9
0050E8DC |.8D45 FC lea eax,dword ptr ss:
0050E8DF |.BA A4E95000 mov edx,dumped_.0050E9A4 ;ASCII "wangshuang"
0050E8E4 |.E8 3F64EFFF call dumped_.00404D28 //无关CALL
0050E8E9 |.8B45 FC mov eax,dword ptr ss:
0050E8EC |.E8 5766EFFF call dumped_.00404F48 //计算传入字符串长度"wangshuang" 返回值在 EAX
0050E8F1 |.85C0 test eax,eax
0050E8F3 |.7E 1B jle short dumped_.0050E910 //长度 <= 0 跳转到 50E910
0050E8F5 |.BA 01000000 mov edx,1
0050E8FA |>8B4D FC /mov ecx,dword ptr ss:
0050E8FD |.0FB64C11 FF |movzx ecx,byte ptr ds:[ecx+edx-1>
0050E902 |.8D0C89 |lea ecx,dword ptr ds: //ECX = ECX + ECX * 4
0050E905 |.8D0C89 |lea ecx,dword ptr ds: //ECX = ECX + ECX * 4
0050E908 |.03D9 |add ebx,ecx //ebx = ecx + 0ED1D9
0050E90A |.03DE |add ebx,esi //ebx = ebx + esi
0050E90C |.42 |inc edx
0050E90D |.48 |dec eax
0050E90E |.^ 75 EA \jnz short dumped_.0050E8FA // 十六进制转换
0050E910 |>8D45 FC lea eax,dword ptr ss:
0050E913 |.BA B8E95000 mov edx,dumped_.0050E9B8 ;ASCII "yaoyuan"
0050E918 |.E8 0B64EFFF call dumped_.00404D28 //同上,无关CALL
0050E91D |.8B45 FC mov eax,dword ptr ss:
0050E920 |.E8 2366EFFF call dumped_.00404F48 //计算字符串"yaoyuan"的长度结果放在 eax
0050E925 |.85C0 test eax,eax
0050E927 |.7E 1B jle short dumped_.0050E944
0050E929 |.BA 01000000 mov edx,1
0050E92E |>8B4D FC /mov ecx,dword ptr ss:
0050E931 |.0FB64C11 FF |movzx ecx,byte ptr ds:[ecx+edx-1>
0050E936 |.8D0C89 |lea ecx,dword ptr ds:
0050E939 |.8D0C89 |lea ecx,dword ptr ds:
0050E93C |.03D9 |add ebx,ecx
0050E93E |.03DE |add ebx,esi
0050E940 |.42 |inc edx
0050E941 |.48 |dec eax
0050E942 |.^ 75 EA \jnz short dumped_.0050E92E
0050E944 |>8D45 FC lea eax,dword ptr ss:
0050E947 |.BA C8E95000 mov edx,dumped_.0050E9C8 ;ASCII "JSBuilder"
0050E94C |.E8 D763EFFF call dumped_.00404D28
0050E951 |.8B45 FC mov eax,dword ptr ss:
0050E954 |.E8 EF65EFFF call dumped_.00404F48
0050E959 |.85C0 test eax,eax
0050E95B |.7E 1B jle short dumped_.0050E978
0050E95D |.BA 01000000 mov edx,1
0050E962 |>8B4D FC /mov ecx,dword ptr ss:
0050E965 |.0FB64C11 FF |movzx ecx,byte ptr ds:[ecx+edx-1>
0050E96A |.8D0C89 |lea ecx,dword ptr ds:
0050E96D |.8D0C89 |lea ecx,dword ptr ds:
0050E970 |.03D9 |add ebx,ecx
0050E972 |.03DE |add ebx,esi
0050E974 |.42 |inc edx
0050E975 |.48 |dec eax
0050E976 |.^ 75 EA \jnz short dumped_.0050E962
0050E978 |>33C0 xor eax,eax
0050E97A |.5A pop edx
0050E97B |.59 pop ecx
0050E97C |.59 pop ecx
0050E97D |.64:8910 mov dword ptr fs:,edx
0050E980 |.68 95E95000 push dumped_.0050E995
0050E985 |>8D45 FC lea eax,dword ptr ss:
0050E988 |.E8 0363EFFF call dumped_.00404C90
0050E98D \.C3 retn
下面是注册机:
#include <iostream.h>
int main(int argc, char *argv[])
{
if (argc != 2)
{
cout << "Usage: Key.exe <UserName>";
return 0;
}
int UserNameLen = 0;
unsigned int MachineCode = 0;
while (*argv != '\0')
{
if (*argv < 0x30 || *argv > 0x39)
{
cout << "0 - 9 only! can't contain other!";
return 0;
}
++UserNameLen;
MachineCode = MachineCode + MachineCode * 4;
MachineCode += MachineCode;
MachineCode += *argv - 0x30;
++argv;
}
argv -= UserNameLen;
char key = {{"wangshuang"},{"yaoyuan"},{"JSBuilder"}};
unsigned int RegCode = 0x0ED1D9;
for (int i = 0; i < 3; ++i)
{
char *p = key[ i ];
while (*p != '\0')
{
unsigned int ecx = *p++;
ecx = ecx + ecx * 4;
ecx = ecx + ecx * 4;
RegCode = RegCode + ecx;
RegCode = RegCode + MachineCode;
}
}
cout << "The " << MachineCode << "\'s regcode is : " << RegCode;
return 1;
}
我进引导小组了..开心中..下面开始学习引导小组的内容..大大的教程就暂停一下..:)
易之侠
发表于 2007-2-8 09:28:53
支持老大,学习算法.
情天下雪
发表于 2007-2-18 16:59:29
收藏、、、、、学习
页:
1
2
[3]
4
5
6
7
8
9
10