请问各位大鱼虾????????????? 软件加密 (100分)

  • 主题发起人 主题发起人 fg007
  • 开始时间 开始时间
F

fg007

Unregistered / Unconfirmed
GUEST, unregistred user!
请问各位大鱼虾:

; 不知近来还好吗?
; 我有一个问题想问:

;在用DELPHI 5.0 编制数据库程序时,为了对我的软件进行加密,

我想了一个办法是利用机器中的硬盘的全球唯一的序列号来进行变换而生成一个每个机器不同的密码,
而且不能利用什么克盘来进行复制? 我用过windows api 读了一个格式化后生成的序列号,可这会克盘所解除,还有什么方法来读一个物理序列号吗?
cpu , 也可以呀?
各位大侠我所写的是一个关于中小学校中实用的自动排课软件, 我感觉还可以的
有几个学校用它做工后都觉得好,
但我不能给他们安装,
因为我没有找到一个加密的好办法,我想大家一定得帮帮我了,
如你能帮我,
并且你想, 我可以发给你源程序当然是大家一起来进步吗!

如果用网卡, 具体怎么做呀? ;

谢天谢地先要谢你了,帮我解决吧,小孩不胜感谢!!!!!!
 
或者你用GUID了,这个更具有唯一性。
 
Hard disk serial number
Question
Is there anyone who knows how to obtain the hard disk serial number?
Answer
I have an unit to get the Hd Name and the Hd Serial number for Borland
Pascal 7.0. I don't know if it's working with Delphi and the other thing is
that it is in dutch and I don't have time to translate it in englisch. Mayby
you can use it, otherwise drop it out of the window.
Unit HardDisk;
INTERFACE
FUNCTION ;GetHardDiskNaam ;: STRING;
FUNCTION ;GetHardDiskSerieNummer ; ; ; ;: STRING;
FUNCTION ;GetHardDiskControlleNummer ; ;: STRING;
PROCEDURE GetHardDiskGegevens;
CONST
; CodeerTabel : ARRAY[0..24] OF BYTE =
(3,1,2,1,4,1,3,2,6,4,6,5,1,2,6,4,2,6,3,4,6,2,4,1,2);
TYPE
; CharArray = ARRAY[0..24] OF CHAR;
VAR
; HardDiskGegevens ; ; ; ; ;: ARRAY[1..256] OF INTEGER;
; HardDiskNaam ;: CharArray;
; SerieNummer ;: CharArray;
; ControlleNummer ; ; ; ; ;: CharArray;
; C_HardDiskNaam: STRING;
; C_HardDiskSerieNummer ; ;: STRING;
; C_HardDiskControlleNummer : STRING;
; C_LicentieNaam: STRING;
IMPLEMENTATION
FUNCTION GetHardDiskNaam : STRING;
VAR
; Teller : INTEGER;
; Lus ; ;: INTEGER;
BEGIN
; ; GetHardDiskNaam := '';
; ; Teller := 1;
; ; FOR Lus := 1 TO 18 DO
; ; BEGIN
; ; ; HardDiskNaam[Teller] := CHR( ( HardDiskGegevens[27+Lus] DIV 256 ));
; ; ; Inc(Teller);
; ; ; HardDiskNaam[Teller] := CHR( ( HardDiskGegevens[27+Lus] MOD 256 ));
; ; ; Inc(Teller);
; ; END;
; ; GetHardDiskNaam := HardDiskNaam;
END;
FUNCTION GetHardDiskSerieNummer : STRING;
VAR
; Teller : INTEGER;
; Lus ; ;: INTEGER;
BEGIN
; ; GetHardDiskSerieNummer := '';
; ; Teller := 1;
; ; FOR Lus := 1 TO 8 DO
; ; BEGIN
; ; ; SerieNummer[Teller] := CHR( ( HardDiskGegevens[10+Lus] DIV 256 ));
; ; ; Inc(Teller);
; ; ; SerieNummer[Teller] := CHR( ( HardDiskGegevens[10+Lus] MOD 256 ));
; ; ; Inc(Teller);
; ; END;
; ; GetHardDiskSerieNummer := SerieNummer;
END;
FUNCTION GetHardDiskControlleNummer : STRING;
VAR
; Teller : INTEGER;
; Lus ; ;: INTEGER;
BEGIN
; ; GetHardDiskControlleNummer := '';
; ; Teller := 1;
; ; FOR Lus := 1 TO 3 DO
; ; BEGIN
; ; ; ControlleNummer[Teller] := CHR( ( HardDiskGegevens[23+Lus] DIV 256 ));
; ; ; Inc(Teller);
; ; ; ControlleNummer[Teller] := CHR( ( HardDiskGegevens[23+Lus] MOD 256 ));
; ; ; Inc(Teller);
; ; END;
; ; GetHardDiskControlleNummer := ControlleNummer;
END;
PROCEDURE GetHardDiskGegevens;
VAR
; Lus ; ;: INTEGER;
BEGIN
; WHILE ( Port[$1f7] <> $50) DO ;
; Port[$1F6] := $A0 ;
; Port[$1F7] := $EC ;
; WHILE ( Port[$1f7] <> $58 ) DO ;
; FOR Lus := 1 TO 256 DO
; BEGIN
; ; HardDiskGegevens[Lus] := Portw[$1F0] ;
; END;
END;
END.


用CPUID指令,首先你可以确定你用的CPU是Intel的。
然后执行:
; ; MOV EAX,01H
; ; CPUID
如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。
此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。
再执行:
; ; MOV EAX,03H
; ; CPUID
此时的EDX:ECX就是序列号的第64位。
回复人:westaf(2000-7-28 21:22:00) ;得80分
不敢当。
要想关闭这个ID,可执行下列代码:

; ; MOV ECX,119H
; ; RDMSR
; ; OR EAX,00200000H
; ; WRMSR

不过,一旦执行上述代码,cpu将一直不能取id,直到下次reset。
 
还是用网卡的序列号吧,如果你有的话。
 
发布读CPU信息、读硬盘序列号的VCL,可以做软件加密
来自:dandywesley, 时间:2001-9-19 19:09:00, ID:634049
在http://home.online.tj.cn/user/dandy/
全面支持WIN9X/ME/NT/2K/XP
可配合D4,D5,D6,CB4,CB5使用。

;
 
送段代码你瞧瞧!可以获得各种计算机信息!加密最好用硬件!
ogram Project1;

uses
; windows,
; messages,
; registry;
const
; ID_BIT=$200000;
type
; TCPUID=array[1..4] of Longint;
; TVendor=array[0..11] of char;
var
; ;WinClass:TWndClassA;
; ;inst,handle,button1,label1,edit1:integer;
; ;Msg:TMsg;
; ;hFont:integer;
; ;CPUID:TCPUID;
; ;V:AnsiString;
; ;S:TVendor;
; ;str:pchar;
; ;user:PChar;
; ;{procedure checkpassword;
; ;function isCPUID_Avalible:Boolean;
; ;function getcpuid:Tcpuid;
; ;function getcpuvendor:tvendor;
; ;function getwindowproductid:string;
; ;function getusername:ansistring;

; function WindowProc(hWnd,uMsg,wParam,lParam:integer):integer; }
;function iscpuid_avalible:boolean;register;
asm
; 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
; PUSH EBX
; PUSH EDI
; MOV EDI,EAX
; MOV EAX,1
; DW $A20F
; STOSD
; MOV EAX,EBX
; STOSD
; MOV EAX,ECX
; STOSD
; MOV EAX,EDX;
; STOSD
; POP EDI
; POP EBX
END;
FUNCTION GETCPUVENDOR:TVendor;assembler;register;
ASM
; PUSH EBX
; PUSH EDI
; MOV EDI,EAX
; MOV EAX,0
; DW $A20F
; MOV EAX,EBX
; XCHG EBX,ECX
; 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,EDX
; MOV ECX,4
@3:
; STOSB
; SHR EAX,8
; LOOP @3
; POP EDI
; POP EBX
END;
function getwindowsproductid:string;
var
;reg:TRegistry;
begin
;Result:='';
;reg:=TRegistry.Create;
;with reg do
; begin
; ;rootkey:=HKEY_LOCAL_MACHINE;
; ;OpenKey('Software/Microsoft/windows/currentvwesion',false);
; ;result:=readstring('productid');
; end;
;reg.free;
end;
function getusername:ansistring;
var
; lpUserName:PAnsiChar;
; lpnLength:DWORD;
begin
; result:='';
; lpnlength:=0;
; wnetgetuser(nil,nil,lpnlength);
; if lpnlength>0 then
; ;begin
; ; getmem(lpusername,lpnlength);
; ; if wnetgetuser(nil,lpusername,lpnlength)= NO_ERROR then
; ; result:=lpusername;
; ; freemem(lpusername,lpnlength);
; ;end;
;end;

procedure CheckPassWord;
; var
; ; TextLength:integer;
; ; text:Pchar;
; begin
; ; TextLength:=GetWindowTextLength(Edit1);
; ; if textlength=6 then
; ; ;begin
; ; ; ;getmem(text,textlength+1);
; ; ; ;getwindowtext(edit1,text,textlength+1);
; ; ; ;if text='winapi' then
; ; ; ;begin
; ; ; ; ;MessageBoxA(Handle,'Password is Correct.','password check',MB_OK);
; ; ; ;if isCPUID_Avalible then
; ; ; ; ;begin
; ; ; ; ; ;CPUID:=GetCPUID;
; ; ; ; ; ;S:=GetCpuVendor;
; ; ; ; ; ;V:=GetUserName;
; ; ; ; ; ;user:=Pchar(V);
; ; ; ; ; ;setwindowtext(label1,s);
; ; ; ; ; ;str:=PChar(GetWindowsProductId+' '+user);
; ; ; ; ; ;setwindowtext(edit1,str);
; ; ; ; ; end;
; ; ; ; freeMem(text,textlength+1);
; ; ; ; exit;
; ; ; end;
; ; ;end;
; ; ;messageboxa(handle,'password is incorrect.','password check',MB_OK);
; ; ;end;
;Function WindowProc(hWnd,uMsg,wParam,lParam:integer):integer;stdcall;
; ;begin
; ; ;result:=DefWindowProc(hWnd,uMsg,wParam,lParam);
; ; ;if (lParam=button1) and (uMsg=WM_COMMAND) then
; ; ; ;CheckPassWord;
; ; ;if uMsg=WM_DESTROY then
; ; ; ; Halt;
; ;end;


//以下是程序主体

begin
; inst:=hinstance;
; with winclass do
; begin
; ; style:=CS_CLASSDC or CS_PARENTDC;
; ; lpfnwndproc:=@WindowProc; //回调函数
; ; hinstance:=inst;
; ; hbrBackGround:=color_btnface+1;
; ; lpszCLassname:='AG_TESTWINDOW';
; ; hCursor:=loadCursor(0,IDC_ARROW);
; ;end;
; ;RegisterClass(WinClass);
; ;//创建窗体
; ;Handle:=CreateWindowEx(WS_EX_WINDOWEDGE,'AG_TESTWINDOW','Window API',WS_VISIBLE or
; ; ; WS_SIZEBOX OR WS_CAPTION OR WS_SYSMENU,150,200,380,65,0,0,inst,nil);
; ;Button1:=CreateWindow('button','OK',WS_VISIBLE or WS_CHILD or BS_PUSHLIKE or BS_TEXT,
; ; ; 316,8,50,20,handle,0,inst,nil);
; ;label1:=CreateWindow('Static','',WS_VISIBLE or WS_CHILD or SS_LEFT,8,12,76
; ; ; ,13,handle,0,inst,nil);
; ;edit1:=createwindowEx(WS_EX_CLIENTEDGE,'Edit','',WS_CHILD or WS_VISIBLE or WS_BORDER,
; ; ; 88,8,220,21,handle,0,inst,nil);
; ;hFont:=CreateFont(-11,0,0,0,400,0,0,0,
; ; ; DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
; ; ; DEFAULT_PITCH OR FF_DONTCARE,'MS SANS SERIF');
; ;if hfont<>0 then
; ; ; begin
; ; ; ; SendMessage(Button1,WM_SETFONT,hFont,0);
; ; ; ; SendMessage(label1,WM_SETFONT,hFont,0);
; ; ; ; SendMessage(edit1,WM_SETFONT,hFont,0);
; ; ; end;
; ;setwindowtext(label1,'enter password:');
; ;setfocus(edit1);
; ;updatewindow(handle);
; ;while(getmessage(Msg,handle,0,0)) do
; ; ; begin
; ; ; ; TranslateMessage(msg);
; ; ; ; DispatchMessage(msg);
; ; ; end;
;end.
 
我也遇到过这方面的问题,这种问题很难办的。
从效果上讲,最好还是用硬件,但一来会增加成本,况且给用户带来
诸多不便(如果用户使用十种不同的软件,在并口上串连了10个加密
狗???[:D])。
但用软件注册方法(硬盘难道能不被克隆?),就算无法复制,但如
果用户要求多次注册怎么办?(事实上可能其他的几个注册码是给他
的朋友用的呢?[:(])
关键可能还要看具体的软件再作定夺,其实真正很关键的软件,就算
别人盗版,如果没有售后服务的保障,人家也是不会要的,以上建议,
仅供参考,希望多交流。
Email: jbsoft@mail.jxptt.zj.cn
 
多人接受答案了。
 
后退
顶部