能力值:
(RANK:300 )
|
-
-
2 楼
拜托楼主有没有版权啊?
不要瞎蒙人啊!违法的!
机器码 :04026228230
注册码 :MKQwM2YmM26mMtX=
楼主把分析贴出来了!我就不跟帖贴分析过程了!软件注册机制不是很好!
把注册的信息导入任何一台机器都可以注册成功!
也就是或上面的注册码在任何机器上都有用!只要改注册信息就好了!
附件是注册机和一个注册码!
注册机及万能注册表
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我晕
跟出来很简单
注册算法呢?
再次声明,绝对不会有什么版权问题!!!
再说这么简单的发功能,没必要写这么复杂的界面啊(界面挺不错的)。
说明软件的实现依据是arp攻击。
至于机器码怎么计算的,算法是怎么生成的,大家分析下。
我只有一个目的,跟大家多交流多学习,只有在不断的学习与交流中才能成长的更快,
有时候一个问题,你要考虑很久都不会有结果,当时突然看到别人的见解,就像当头棒喝、豁然开朗一样。。。。。
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
我也是刚入门,把自己得分析过程写出来,各位大侠指正。
1.初步分析软件的注册方式
运行程序->显示主机的相关信息->确定,提示未注册->点击注册—>通过机器码和注册码相互认证的
->输入假的注册码——>点击确定-->显示已注册,重启程序。
结论:程序在每次启动的时候,通过读取文件/注册表信息 来判断是否注册。
2.判断认证方式
输入假的注册码:pematrix
设置断点:bpx GetDlgItemTextA
点击确定,中断程序。
中断在一个子程序里面(程序多次调用了这个函数,用来取得对话框里面的信息),
这个子程序的地址是 ---0040E19B
F8运行到调用子程序的地址 -00405F90 |. E8 06820000 call 0040E19B
上下观察一下,发现原来是写注册表的,两个函数RegOpenKeyExA(打开注册表和子键)
和RegSetValueEXA(设置键值)
00405FA5 |. 50 push eax ; /BufSize
00405FA6 |. 8D4424 20 lea eax, dword ptr [esp+20] ; |
00405FAA |. 50 push eax ; |Buffer
00405FAB |. 6A 01 push 1 ; |ValueType = REG_SZ
00405FAD |. 53 push ebx ; |Reserved
00405FAE |. 8B1D 10A04300 mov ebx, dword ptr [<&ADVAPI32.RegSe>; |ADVAPI32.RegSetValueExA
00405FB4 |. 68 F0B44300 push 0043B4F0 ; |ValueName = "MachineNum"
00405FB9 |. 57 push edi ; |hKey
00405FBA |. FFD3 call ebx ; \RegSetValueExA
这里写注册表的值是:MachineNum
打开注册表,搜索MachineNum ->MachineNum 的值是我们的机器码
下面还有一个RegistryNum 的值是我们输入的假的注册码pematrix(是明文保存的?)
得出结论:程序以明文形式保存机器码和注册码在注册表里面;
在每次启动时,肯定要读取注册表,进行判断比较。
所以,设置断点:bpx RegQueryValueEx (在读取注册表时断)
3. 跟踪认证方式
(清除断点,重新载入程序)
设置断点:bpx RegQueryValueEx
猜想:从注册表读取MachineNum,RigisterNum,然后对这两个值做相应的处理,最后比较判断。
运行程序,停在
00402F7B |. FF15 1CA04300 call dword ptr [<&ADVAPI32.RegQueryVa>; \RegQueryValueExA ,从注册表取得机器码
按F8向下,并查看寄存器窗口中的数据变化,发现可疑数据否,原来只是一个读取注册表的子程序。
按F8返回到了调用它的地址,如下
0040378C |. E8 BFF7FFFF call 00402F50 ; 调用函数读取注册表。。
按F8继续,
004037D1 |> \57 push edi
004037D2 |. BF FBAA4300 mov edi, 0043AAFB
004037D7 |. 8D7424 14 lea esi, dword ptr [esp+14]
004037DB |. B9 01000000 mov ecx, 1
004037E0 |. 33D2 xor edx, edx
004037E2 |. F3:A6 repe cmps byte ptr es:[edi], byte ptr [e>
004037E4 |. 75 14 jnz short 004037FA
004037E6 |> 85ED test ebp, ebp
004037E8 |. 0F84 0C010000 je 004038FA
004037EE |. 55 push ebp ; /hKey
004037EF |. FF15 24A04300 call dword ptr [<&ADVAPI32.RegCloseKey>] ; \RegCloseKey
004037F5 |. E9 00010000 jmp 004038FA
004037FA |> 8D4424 14 lea eax, dword ptr [esp+14]
004037FE |. 50 push eax
004037FF |. E8 FCD7FFFF call 00401000 ; 这个函数就是对机器码的运算,计算出注册码来。写算法就要分析这个调用了。
此时查看寄存器窗口,EAX的值为注册码。EAX 0013E880 ASCII "MKQpM2PiNF9mNKUwMFIwN6=="
00403804 |. 83C4 04 add esp, 4
后面是对计算出得注册码处理,然后从注册表读取用户输入得注册码。
~~~待续
|
能力值:
(RANK:300 )
|
-
-
5 楼
新帖提示,所有新发布的内容都在二楼!
此处贴个源码吧!
#include "string.h"
#include "math.h"
#include "stdio.h"
main()
{
char MachineNum[24]="",sum[40]="",SN[2]="";
char *tab="XBCKPTZHUJDLMNOEQRSFIVWAYG3190856742+/abczyfgqojwsmtiphrlnuvkxed";
int MachineNumlen=0,i=0,tempMN=0;
printf("-----------NETCUT CRACK-----------\nMachineNum:");
scanf("%s",MachineNum);
MachineNumlen=strlen(MachineNum);
tempMN=MachineNumlen/3;
for(i=0;i<tempMN;i++)
{
sprintf(SN,"%c",tab[MachineNum[i*3] >> 2]);
strcat(sum,SN);
sprintf(SN,"%c",tab[MachineNum[i*3+1]>>4 | (MachineNum[i*3] & 0x3) << 4]);
strcat(sum,SN);
sprintf(SN,"%c",tab[(MachineNum[i*3+1] & 0xf)*2*2 | MachineNum[i*3+1] >> 6]);
strcat(sum,SN);
sprintf(SN,"%c",tab[MachineNum[i*3+2] & 0x3f]);
strcat(sum,SN);
}
if(MachineNumlen%3==1)
{
sprintf(SN,"%c",tab[MachineNum[tempMN*3]>>2]);
strcat(sum,SN);
sprintf(SN,"%c==",tab[(MachineNum[tempMN*3] & 3)<<4]);
strcat(sum,SN);
}
if(MachineNumlen%3==2)
{
sprintf(SN,"%c",tab[MachineNum[tempMN*3]>>2]);
strcat(sum,SN);
sprintf(SN,"%c",tab[MachineNum[tempMN*3+1]>>4 | (MachineNum[tempMN*3] & 3) << 4]);
strcat(sum,SN);
sprintf(SN,"%c=",tab[MachineNum[tempMN*3+1] & 0xf]);
strcat(sum,SN);
}
printf("\nSN:%s\n",sum);
printf("-----------------------------------");
getch();
}
|
能力值:
(RANK:300 )
|
-
-
6 楼
论坛能不能内加上代码高亮显示呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
厉害啊!
不知道如和下手,
该用注册表API,还是F12堆栈法,
就是没线索.
|
|
|