本文是摘自一个加密论坛的帖子,请大家好好看看,里面有好多东西的嘿嘿!~ 本站主要摘录精华部分。 字串8
楼主csdndelphi 在 Delphi / VCL组件开发及应用 提问 字串9
编写注册码程序,按硬盘柱面数、磁头数及每道扇区数
获得硬件特征行不行?
字串1
7 楼torble(阿裕) 得分 15 字串4
硬盘的序列号是厂家设定的,且只能用I/O指令读取,所以,这在以前的DOS时代
根本不是什么问题.方法非常简单,如下面的代码所示:
static int WaitIde()
{
int al;
while ((al=inp(0x1F7))>=0x80) ;
return al;
}
static void ReadIDE()
{
int al;
int i;
WORD pw[256];
WaitIde();
outp(0x1F6,0xA0); 字串9
al = WaitIde();
if ((al&0x50)!=0x50) return;
outp(0x1F6,0xA0);
outp(0x1F7,0xEC);
al = WaitIde();
if ((al&0x58)!=0x58) return;
for (i=0;i<256;i++) {
pw[i] = inpw(0x1F0);
}
}
至此,关于IDE硬盘的信息已经在 pw 数组中了,需要注意的是该数组是一个 WORD
类型,硬盘的序列号存放于 pw[10] 开始的10个WORD中,使用时需要将每个WORD的 字串8
高低字节颠倒一下。
真正有点麻烦的是在Windows 95/98下,I/O指令作为特权指令在应用程序级别,即
Ring 3是不可使用的,所以上面的代码在执行到 WaitIde()时会陷到死循环中,原
因就是 IN 0x1F7 总是返回 0xFF
容易想到的解决办法是写一个VxD,因为VxD运行Ring 0级别上,即最高特权级上,所以
所有的指令都是可用的。当然,这没有任何问题,事实上我已经写了这样的 VxD,效果
是明显的,如果哪位有兴趣,可与我联系。
如果你是一个编程高手,这没有什么难度,所以不必看下去。
如果你连VxD也不会写,请参阅拙作"VxD入门教程"。
当然,如果连象读取硬盘序列号这样小的问题都要写个VxD,确实是一件令人生厌的事,
且不说既要额外装个Win 95 DDK,又要防止VxD出现错误使系统崩溃这种多余的工作
字串2
字串3
8 楼torble(阿裕)得分 10 字串9
加密过程中,请注意以下问题:
读 CPU ID:不是所有的 CPU 都有序列号,而且同一型号的 CPU ID 相同!
读硬盘序列号:有些硬盘没有序列号,或无法正确读取(人为或系统等因素造成)。
读硬盘卷标号:不安全,可以克隆或用程序修改。
读网卡序列号:局限性太大,且序列号可以用一种很简单的办法修改(改注册表)。
读用户名或计算机名:局限性太大,在大型网吧等场合不适用(改名后注册码不可用)!
读其它能在注册表能找到的数据:太不保险,极不安全!
在程序内含注册码或者使用注册名+用户名:注册太灵活,只要注册一套即可通用。
判断硬件过多极不妥,如果用户其中一种硬件坏了,此序列号都将不可用,又要重新注册!
再就是注册后的信息保存在何处??????很不简单,问题多多!!!!!
字串8