能力值:
( LV2,RANK:10 )
|
-
-
26 楼
看下 验收哈
|
能力值:
( LV2,RANK:10 )
|
-
-
27 楼
用户名和注册码各位asci 字符加起来=0x701,我的是name:arrrrrrrr sn:bbbbbbbb
后来写了两个注册机,玩的。delphi版。现附上C源码!
#include <stdio.h>
#include <stdlib.h> long getsum(char *na) //求和
{
int sum = 0;
for(;*na != 0;na++) sum += *na;
return sum;
}
char crack(char *na,char *sa)
{
long sum = 0;
int moder = 0, cnt = 0;
int i,j;
sum = 0x701 - getsum(na);
if (sum <= 0x20)
{
printf("need shorter name!\n");
return 0;
}
moder = sum % 0x7a; //只能算出ASCII和小于0x7a - 0x20 = 0x6e1 ('XXX' - ' ' = 0x6e1)
cnt = sum / 0x7a; //0x7a == 'z';
for (i=0; i<cnt; i++) //前面几个用‘Z’代
{
sa[i] = 0x7a;
}
if (moder == 0) //刚好整除
{
return 1;
}
else if (moder <= 0x20) //非常用字符(空格符以下)
{
sa[i-1] -= moder;
sa[i] = 2 * moder;
return 1;
}
else //常用字符
{
sa[i] = moder;
return 1;
}
return 0;
}
int main(int argc, char *argv[])
{
char name[40] = {0};
char sn[40] = {0};
printf("Input your name:\n");
scanf("%s",name); //输入姓名
if (crack(name,sn) == 1)
{
printf("sn is: %s \n",sn);
}
else printf("input error!\n"); //其他错误
system("PAUSE");
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
30 楼
name: searise
code: BC9999999999999999
虽然知道算法,姓名的ASCII累加为2EC,code的ASCII累加必须为415,但还是凑了很久才凑了个415出来。:-&
|
能力值:
( LV2,RANK:10 )
|
-
-
31 楼
我是菜鸟,用的爆破,成功。
但是,为什么看不到真实注册码啊?????
求大侠解答。
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
楼上大牛很多,偶一小菜鸟亦解出了。
(Name的ASCII码总和)+20090000=20090701-(Code的ASCII码总和);
一个Name对应太多Code了,看来写注册机只能用随机函数了。
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
0040EBA6 |. E8 C144FFFF call KeyGenMe.0040306C
0040EBAB |. 85C0 test eax,eax
0040EBAD 7E 13 jle short KeyGenMe.0040EBC2
0040EBAF >|. BA 01000000 mov edx,1 ; ebx -1
0040EBB4 |> 8B4D FC /mov ecx,dword ptr ss:[ebp-4] ; 用户名放到ecx
0040EBB7 >|. 0FB64C11 FF |movzx ecx,byte ptr ds:[ecx+edx-1] ; 先零扩展,再传送
0040EBBC |. 03D9 |add ebx,ecx
0040EBBE |. 42 |inc edx ; edx+1
0040EBBF >|. 48 |dec eax ; eax -1
0040EBC0 |.^ 75 F2 \jnz short KeyGenMe.0040EBB4 ; 不等与则循环
0040EBC2 |> 8B45 F8 mov eax,dword ptr ss:[ebp-8] ; 取完后保存在eax
0040EBC5 |. E8 A244FFFF call KeyGenMe.0040306C ; 取出注册码
0040EBCA |. 85C0 test eax,eax ; 注册码是否大于6 大与则跳//这个应该是错误的,请求正确的提示
0040EBCC 7E 13 jle short KeyGenMe.0040EBE1
0040EBCE |. BA 01000000 mov edx,1
0040EBD3 |> 8B4D F8 /mov ecx,dword ptr ss:[ebp-8] ; 传送假码
0040EBD6 >|. 0FB64C11 FF |movzx ecx,byte ptr ds:[ecx+edx-1] ; 取假码
0040EBDB |. 03F1 |add esi,ecx
0040EBDD >|. 42 |inc edx ; ebx +1
0040EBDE >|. 48 |dec eax ; eax -1
0040EBDF |.^ 75 F2 \jnz short KeyGenMe.0040EBD3 ; 循环
0040EBE1 81C3 00000920 add ebx,20090000
0040EBE7 B8 01070920 mov eax,20090701
0040EBEC |. 2BC6 sub eax,esi
0040EBEE 3BD8 cmp ebx,eax ; 比较是否为0 或相等则不跳
0040EBF0 |. 75 1C jnz short KeyGenMe.0040EC0E ; NO掉 就爆破了
0040EBF2 |. 68 4CEC4000 push KeyGenMe.0040EC4C ; 注册成功
0040EBF7 |. FF75 FC push dword ptr ss:[ebp-4]
0040EBFA |. 68 5CEC4000 push KeyGenMe.0040EC5C ; registered!
0040EBFF |. 8B45 F4 mov eax,dword ptr ss:[ebp-C]
0040EC02 |. BA 03000000 mov edx,3
0040EC07 |. E8 2045FFFF call KeyGenMe.0040312C
0040EC0C |. EB 0D jmp short KeyGenMe.0040EC1B
0040EC0E |> 8B45 F4 mov eax,dword ptr ss:[ebp-C]
0040EC11 |. BA 74EC4000 mov edx,KeyGenMe.0040EC74 ; 注册错误
0040EC16 |. E8 4543FFFF call KeyGenMe.00402F60
用户名 270+20090000=20090270 EBX
假码 135+20090701=200905CC EAX
算不出注册码,太笨了。. 只能爆破。.~
0040EBE1 81C3 00000920 add ebx,20090000
0040EBE7 B8 01070920 mov eax,20090701 // 这两个分别与用户名和假码相加。传送,如何令到他们为0或者相等呢? 真弄不明白。作者出来解释一下。~
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
明白了!~ 真是感谢前面发布的人
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
爆破成功
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
给分吧!!!!!!!!!!
ddddddddd
ddddddcaa
凑出来的!!
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
weky
ZZZZZZZZZZZZZZU
#include <stdio.h>
#include <iostream.h>
#include <windows.h>
void main(){
char inin[20];
memset(inin,0,20);
scanf("%s",&inin);
int s=0;
for(int i=0;i<20;i++){
s=s+inin[i];
if(inin[i]==0){
break;
}
}
printf("%x\n",s);
s=s+0x20090000;
int t=0x20090701;
int zhucema;
//t-注册码的总数值....t-s=zhucema
zhucema=t-s;
printf("%x\n",zhucema);
char zc[20];
memset(zc,0,20);
int n=zhucema/0x5a;
int l=zhucema%0x5a;
for(int q=0;q<n;q++){
zc[q]=0x5a;
}
zc[n]=l;
printf("%s",zc);
}
|
能力值:
( LV6,RANK:90 )
|
-
-
40 楼
楼上大侠这个机机的最后一个字符可能会出现不可视的情况吧?
|
能力值:
( LV6,RANK:90 )
|
-
-
41 楼
也不一定呀!比如楼上的楼上就没有用随机函数呀!是用字母Z来先拼凑的,最后一个才由剩余ASCII码转为其他字符的。
|
能力值:
( LV12,RANK:210 )
|
-
-
42 楼
给出一组
name:1 ASCII:31
code:mmmmmmmmmmmmmmmm ASCII:6d0
6d0+31=701
|
能力值:
( LV12,RANK:210 )
|
-
-
43 楼
1、KeyGenMe特点
Delphi编写、明显提示信息、明码比较、无壳无Anti、算法简单适合初学者
2、详细的分析过程
由于OD无法识别Delphi语言的函数,所以可以借助Dede工具导出map文件,然后再利用OD插件Godup Plugin载入map文件就可以识别出函数了。
首先,OD载入程序,查找提示字符串
/*--------------------------------------------------------------------------------------------------------------------------*/
0040EB70 /$ 55 push ebp
0040EB71 |. 8BEC mov ebp, esp
0040EB73 |. 83C4 F4 add esp, -0C
0040EB76 |. 53 push ebx
0040EB77 |. 56 push esi
0040EB78 |. 894D F4 mov dword ptr [ebp-C], ecx
0040EB7B |. 8955 F8 mov dword ptr [ebp-8], edx
0040EB7E |. 8945 FC mov dword ptr [ebp-4], eax
0040EB81 |. 8B45 FC mov eax, dword ptr [ebp-4]
0040EB84 |. E8 9746FFFF call 00403220 ; 没什么意义的call
0040EB89 |. 8B45 F8 mov eax, dword ptr [ebp-8]
0040EB8C |. E8 8F46FFFF call 00403220
0040EB91 |. 33C0 xor eax, eax
0040EB93 |. 55 push ebp
0040EB94 |. 68 36EC4000 push 0040EC36
0040EB99 |. 64:FF30 push dword ptr fs:[eax]
0040EB9C |. 64:8920 mov dword ptr fs:[eax], esp
0040EB9F |. 33DB xor ebx, ebx
0040EBA1 |. 33F6 xor esi, esi
0040EBA3 |. 8B45 FC mov eax, dword ptr [ebp-4]
0040EBA6 |. E8 C144FFFF call 0040306C ; 检测name和code是否为空
0040EBAB |. 85C0 test eax, eax
0040EBAD |. 7E 13 jle short 0040EBC2
0040EBAF |. BA 01000000 mov edx, 1
0040EBB4 |> 8B4D FC /mov ecx, dword ptr [ebp-4]
0040EBB7 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1]
0040EBBC |. 03D9 |add ebx, ecx
0040EBBE |. 42 |inc edx
0040EBBF |. 48 |dec eax
0040EBC0 |.^ 75 F2 \jnz short 0040EBB4 ; 累加注册码ebx
0040EBC2 |> 8B45 F8 mov eax, dword ptr [ebp-8]
0040EBC5 |. E8 A244FFFF call 0040306C
0040EBCA |. 85C0 test eax, eax
0040EBCC |. 7E 13 jle short 0040EBE1
0040EBCE |. BA 01000000 mov edx, 1
0040EBD3 |> 8B4D F8 /mov ecx, dword ptr [ebp-8]
0040EBD6 |. 0FB64C11 FF |movzx ecx, byte ptr [ecx+edx-1]
0040EBDB |. 03F1 |add esi, ecx
0040EBDD |. 42 |inc edx
0040EBDE |. 48 |dec eaxi
0040EBE1 |> 81C3 00000920 add ebx, 20090000 ; 加20090000
0040EBE7 |. B8 01070920 mov eax, -esi20090701 ;20090701
0040EBEC |. 2BC6 sub eax, esi
0040EBEE |. 3BD8 cmp ebx, eax
0040EBDF |.^ 75 F2 \jnz short 0040EBD3 ; 累加密码es
0040EBF0 |. 75 1C jnz short 0040EC0E ; 关键跳,爆破
0040EBF2 |. 68 4CEC4000 push 0040EC4C ; ASCII "Cool~ "
0040EBF7 |. FF75 FC push dword ptr [ebp-4]
0040EBFA |. 68 5CEC4000 push 0040EC5C ; ASCII " Registered!"
0040EBFF |. 8B45 F4 mov eax, dword ptr [ebp-C]
0040EC02 |. BA 03000000 mov edx, 3
0040EC07 |. E8 2045FFFF call 0040312C
0040EC0C |. EB 0D jmp short 0040EC1B
0040EC0E |> 8B45 F4 mov eax, dword ptr [ebp-C]
0040EC11 |. BA 74EC4000 mov edx, 0040EC74 ; ASCII "No,Unregistered!Try Again!"
0040EC16 |. E8 4543FFFF call 00402F60
0040EC1B |> 33C0 xor eax, eax
0040EC1D |. 5A pop edx
0040EC1E |. 59 pop ecx
0040EC1F |. 59 pop ecx
0040EC20 |. 64:8910 mov dword ptr fs:[eax], edx
0040EC23 |. 68 3DEC4000 push 0040EC3D
0040EC28 |> 8D45 F8 lea eax, dword ptr [ebp-8]
0040EC2B |. BA 02000000 mov edx, 2
0040EC30 |. E8 FB42FFFF call 00402F30
0040EC35 \. C3 retn
这里就是算法计算的核心部分,OD显示本地调用来自 0040ECCB(在这下断可找到获取name和code的代码)
/*--------------------------------------------------------------------------------------------------------------------------*/
0040EC9E |. 55 push ebp ; 获取用户名
0040EC9F |. 68 14ED4000 push 0040ED14
0040ECA4 |. 64:FF30 push dword ptr fs:[eax]
0040ECA7 |. 64:8920 mov dword ptr fs:[eax], esp
0040ECAA |. 8D55 F8 lea edx, dword ptr [ebp-8]
0040ECAD |. 8B43 68 mov eax, dword ptr [ebx+68]
0040ECB0 |. E8 AB8AFFFF call 00407760
0040ECB5 |. 8B45 F8 mov eax, dword ptr [ebp-8] ; ebp-8保存code
0040ECB8 |. 50 push eax
0040ECB9 |. 8D55 F4 lea edx, dword ptr [ebp-C]
0040ECBC |. 8B43 60 mov eax, dword ptr [ebx+60]
0040ECBF |. E8 9C8AFFFF call 00407760 ; 取得name和code的call
0040ECC4 |. 8B45 F4 mov eax, dword ptr [ebp-C] ; ebp-4保存name
0040ECC7 |. 8D4D FC lea ecx, dword ptr [ebp-4]
0040ECCA |. 5A pop edx
0040ECCB |. E8 A0FEFFFF call 0040EB70 ; 算法核心call---》0040EB70地址
我们再看下到底是如何获取name和 code 的,F7进入
0040ECBF |. E8 9C8AFFFF call 00407760 ; 取得name和code的call
/*--------------------------------------------------------------------------------------------------------------------------*/
00407760 /$ 53 push ebx
00407761 |. 57 push edi
00407762 |. 93 xchg eax, ebx
00407763 |. 89D7 mov edi, edx
00407765 |. 807B 46 00 cmp byte ptr [ebx+46], 0
00407769 |. 75 26 jnz short 00407791
0040776B |. 8B4B 28 mov ecx, dword ptr [ebx+28]
0040776E |. E3 21 jecxz short 00407791
00407770 |. 51 push ecx ; /hWnd
00407771 |. E8 AECAFFFF call <jmp.&user32.GetWindowTextLength>; \GetWindowTextLengthA
00407776 |. 50 push eax
00407777 |. 92 xchg eax, edx
00407778 |. 89F8 mov eax, edi
0040777A |. E8 F5BAFFFF call 00403274
0040777F |. 59 pop ecx
00407780 |. E3 1B jecxz short 0040779D
00407782 |. 41 inc ecx
00407783 |. 51 push ecx ; /Count
00407784 |. FF37 push dword ptr [edi] ; |Buffer
00407786 |. FF73 28 push dword ptr [ebx+28] ; |hWnd
00407789 |. E8 8ECAFFFF call <jmp.&user32.GetWindowTextA> ; \GetWindowTextA
0040778E |. 5F pop edi
0040778F |. 5B pop ebx
00407790 |. C3 retn
00407791 |> 8B93 89050000 mov edx, dword ptr [ebx+589]
00407797 |. 97 xchg eax, edi
00407798 |. E8 87B8FFFF call 00403024
0040779D |> 5F pop edi
0040779E |. 5B pop ebx
0040779F \. C3 retn
可见是调用的 GetWindowTextA 函数,但是也可以下断 bpx GetWindowTextA
/*--------------------------------------------------------------------------------------------------------------------------*/
3、算法
算法:name的ASCII码累加和 + 0x20090000 == 0x20090701 - code的ASCII累加和
一个name对应多个code,没价值,写注册机就省了。
/*--------------------------------------------------------------------------------------------------------------------------*/
4、总结
Delphi程序OD无法识别函数,可以结合DeDe来分析。
当无法找到提示信息时可以直接下断 bpx GetWindowTextA来寻找突破口。
该KeyGenMe存在设计缺陷,对用户名长度没限制,算法粗糙,适合初学者入门。
|
能力值:
( LV12,RANK:210 )
|
-
-
44 楼
晕 为什么在notexpad2排版好好的 复制到这就不整齐了
|
能力值:
( LV2,RANK:10 )
|
-
-
46 楼
|