如何实现软件有注册码功能(100分)

  • 主题发起人 pengshaopeng
  • 开始时间
Y

yongshiok

Unregistered / Unconfirmed
GUEST, unregistred user!
使用CPUID 或磁盘Serial Number通过一定算法生成用户序列号。
用户返回户用户序列号,通过一定的加密算法,提供注册码
每次程序启动时检测序列号和注册码便可
 
T

trustzhou

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样读取序列号?请高手赐教!
 
H

heart_beat

Unregistered / Unconfirmed
GUEST, unregistred user!
<<< 关于读 CPU ID 和主板 BIOS 等信息加密软件 >>>
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Do{
读主板信息:
主板名称: String(PChar(Ptr($FE061)));
版权: String(PChar(Ptr($FE091)));
日期: String(PChar(Ptr($FFFF5)));
序列号: String(PChar(Ptr($FEC71)));
* 这些语句在同一批主板上读出的信息是相同的!
* 在 Win2000 以上版本下运行(编译)无法通过!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* 读 CPU ID:不是所有的 CPU 都有序列号,而且同一型号的 CPU ID 相同!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*读硬盘序列号:有些硬盘没有序列号,或无法正确读取(人为或系统等因素造成)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*读硬盘卷标号:不安全,可以克隆或用程序修改。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
读网卡序列号:局限性太大,且序列号可以用一种很简单的办法修改(改注册表)。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
读用户名或计算机名:局限性太大,在大型网吧等场合不适用(改名后注册码不可用)!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
读其它能在注册表能找到的数据:太不保险,极不安全!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在程序内含注册码或者使用注册名+用户名:注册太灵活,只要注册一套即可通用。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
判断硬件过多极不妥,如果用户其中一种硬件坏了,此序列号都将不可用,又要重新注册!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
再就是注册后的信息保存在何处??????很不简单,问题多多!!!!!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}Loop
呵呵:)请继续讨论此技术问题。。。。。。。限入死循环!!!!!!!!!!!!!
******************************************************************************
据我测试发现,美萍(V8.45以上)在同型号机器(网吧),特别是主板牌子型号相同、
硬盘相同(不论是否有无序列号)、CPU 相同,系统为克隆的,且能在Windows的任何版本
(98/2K)等情况下正常运行,每台机器都能读取到唯一且固定的序列号!!!实现了真正
的一机一码~~~~~~*请大家好好研究、学习美萍软件(它自称读主板信息加密的)!!!
OK.......Windows 95/98/SE/ME/NT/2K/XP...启动中>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 
L

lsssxs

Unregistered / Unconfirmed
GUEST, unregistred user!
来自:Beckham
如何实现软件有注册码功能
假设软件的主程序窗口为FORM1,则将该段代码置放在FORM1.CREATE事件中。代码如下:
能给我一份源码吗,谢谢 lsssxs@360cn.com
 

随风而逝

Unregistered / Unconfirmed
GUEST, unregistred user!
美萍,人家不是照搞D版
 
T

truecat

Unregistered / Unconfirmed
GUEST, unregistred user!
硬盘ID号倒是有程序可读了。IDE和SCSI的都可以在 离线库 中查到相关代码。
关键是CPU ID 和 主板信息 如何读取,
1、如何在WIN2K下读取,在WIN98下读取主板信息倒也不难。那WIN2K如何办到?
2、听说一批次的CPU其ID是相同的,这确切吗? 如果确切,又如何办? 读CPU ID的代码
好象还没发现有好用的。
 
S

samboy111

Unregistered / Unconfirmed
GUEST, unregistred user!
加密狗吧
 
S

skinstudio

Unregistered / Unconfirmed
GUEST, unregistred user!
请使用SkinPack,轻松开发皮肤软件
http://www.skin-studio.com
 
L

luoboxun

Unregistered / Unconfirmed
GUEST, unregistred user!
三星的硬盘就真的没有ID吗?
现在好多的软件都是采用硬盘加密算法来算的。
如果真的是没有ID,那通过硬盘加密的软件不都是可以钻空子的。????
技术问题技术讨论
 
U

uwslxcs2

Unregistered / Unconfirmed
GUEST, unregistred user!
为什么一定要别人注册??
如果你的软件非常优秀,相信会有很多人愿意购买的!!
 
L

liuzr

Unregistered / Unconfirmed
GUEST, unregistred user!
下边函数是取CPU的ID的
function ISCPUID:Boolean;register;
asm { 查看该机是否有CPU ID 号可以查 }
PUSHFD
POP EAX
MOV EDX,EAX
XOR EAX,ID_BIT
PUSH EAX
POPFD
PUSHFD
POP EAX
XOR EAX,EDX
JZ @exit
MOV AL,TRUE
@exit:
end;

function GetCPUID:TCPUID;assembler;register;
asm { 获取CPU ID 号 }
PUSH EBX
PUSH EDI
MOV EDI,EAX
MOV EAX,1
DW $A20F // CPUID Command
STOSD // CPUID[1]
MOV EAX,EBX
STOSD // CPUID[2]
MOV EAX,ECX
STOSD // CPUID[3]
MOV EAX,EDX
STOSD // CPUID[4]
POP EDI
POP EBX
end;
如果没有CPUID,则取硬盘的,如前,然后经过一个运算,生成注册码!
 
S

sunshine_zk

Unregistered / Unconfirmed
GUEST, unregistred user!
to liuzr
程序无法运行, ID_BIT??
谢谢!!!
 
H

hred

Unregistered / Unconfirmed
GUEST, unregistred user!
建个窗体,放个lable
uses cpu_utl //引用函数,
create 事件写入
if not IsCPUID_Available then

showmessage('没有cpuid')
else
begin

lable1.caption:=inttostr(GetCPUID);
lable2.caption:=GetCPUVendor
end;
cpu_utl.pas的内容;
////////////////////////////////
unit cpu_utl;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Dialogs,
StdCtrls, WinTypes, WinProcs, FORMS, Menus, inifiles;

// CPU ID 专用变量==================================
const
ID_BIT = $200000; // EFLAGS ID bit
type
TCPUID = array[1..4] of Longint;
TVendor = array [0..11] of char;
//===================================================
//CPU ID 及信息
FUNCTION IsCPUID_Available : BOOLEAN;
register;//是否存在cpuid
FUNCTION GetCPUID : TCPUID;
assembler;
register;//读序列号
FUNCTION GetCPUVendor : TVendor;
assembler;
register;//cpu供应商
implementation
// CPU ID ==================================================
FUNCTION IsCPUID_Available : BOOLEAN;
register;
asm
PUSHFD {direct access to flags no possible, only via stack}
POP EAX {flags to EAX}
MOV EDX,EAX {save current flags}
XOR EAX,ID_BIT {not ID bit}
PUSH EAX {onto stack}
POPFD {from stack to flags, WITH not ID bit}
PUSHFD {back to stack}
POP EAX {get back to EAX}
XOR EAX,EDX {check IF ID bit affected}
JZ @exit {no, CPUID not availavle}
MOV AL,TRUE {Result=TRUE}
@exit:
end;

FUNCTION GetCPUID : TCPUID;
assembler;
register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Resukt}
MOV EAX,1
DW $A20F {CPUID Command}
STOSD {CPUID[1]}
MOV EAX,EBX
STOSD {CPUID[2]}
MOV EAX,ECX
STOSD {CPUID[3]}
MOV EAX,EDX
STOSD {CPUID[4]}
POP EDI {Restore registers}
POP EBX
end;

FUNCTION GetCPUVendor : TVendor;
assembler;
register;
asm
PUSH EBX {Save affected register}
PUSH EDI
MOV EDI,EAX {@Result (TVendor)}
MOV EAX,0
DW $A20F {CPUID Command}
MOV EAX,EBX
XCHG EBX,ECX {save ECX result}
MOV ECX,4
@1:
STOSB
SHR EAX,8
LOOP @1
MOV EAX,EDX
MOV ECX,4
@2:
STOSB
SHR EAX,8
LOOP @2
MOV EAX,EBX
MOV ECX,4
@3:
STOSB
SHR EAX,8
LOOP @3
POP EDI {Restore registers}
POP EBX
end;

end.

不要说还不懂怎么用吧?
 
顶部