ID del CPU y número de serie del disco duro

935 views
Skip to first unread message

Daniel Del Giudice

unread,
Mar 18, 2014, 5:04:25 PM3/18/14
to publice...@googlegroups.com
Hola amigos,

desde hace años utilizo llaves hardkey para proteger mi sistema de copias, pero hace poco las empecé a reemplazar por un certificado digital basado en una "huella digital" de cada pc donde está instalado. Para sacar dicha huella utilizo un par de rutinas sacadas de Internet. Cuando creía todo resuelto y encaminado, dos máquinas de un cliente me devuelven exactamente las mismas claves y me hace pensar que clonaron los discos para la instalación o algo parecido. Supuestamente NO PUEDEN tener el mismo número de serie e id del cpu.

Entonces:

a) ¿Estos valores son clonables? Si es así el certificado no sirve, ya que un cliente que paga una licencia puede clonar las pc y utilizar 10 computadoras con esa licencia.
b) ¿Hay alguna forma segura de obtener información confiable que identifique inequívocamente a una computadora?

Desde ya muchas gracias.

Daniel Del Giudice


edgar suarez kummers

unread,
Mar 18, 2014, 5:16:03 PM3/18/14
to publice...@googlegroups.com
Es que utilizas una rutina de windows y debe ser una de DOS.

Yo tuve el mismo problema,  mira baja el programa en el Link al hacer click en mi nombre y una vez lo instales, en el primer pantallazo veras HARD DISK SERIAL y al hacer click allí notarás el efecto de hacerlo bajo MSDOS.

Debo salir de la ciudad por unos días (estar ojalá presente en el nacimiento de mi primer nieto, de mi única hija) y mientras tanto hacer otros asuntos, pero te repito que yo pasé por allí ya hace un tiempo.

Igual conseguí esa rutina por INTERNET bajo MSDOS.

Saludos

 

Nilton CPM

unread,
Mar 18, 2014, 5:20:11 PM3/18/14
to publice...@googlegroups.com
Essa rotina te retorna tres grupos de numeros do HD e isso pelo que sei é de fabrica não tem como trocar.
 

Function

SerialHD

Parameters Unidade

If Empty(Unidade)

Unidade = 'C'

Endif

declara() && Declare ...

Local m.buflen, m.buf

m.buflen = 104

m.buf =

Replicate(Chr(0), m.buflen)

m.str1 = "C"

m.vnb =

Replicate(Chr(0),64)

m.vnbs = 64

m.vsn = 0

m.mcl = 0

m.fsf = 0

m.fsnb =

Replicate(Chr(0),10)

m.fsnbs = 10

GetVolumeInformation(m.str1 + ":\", @m.vnb, m.vnbs,@m.vsn, @m.mcl, @m.fsf, @m.fsnb, m.fsnbs)

If m.vsn < 0

m.vsn = m.vsn + 168

Endif

m.vsn = Padl(Alltrim(Substr(Transform(m.vsn,"@0"), 3)), 8, "0")

m.drivenumber =

Asc(m.str1) - Asc("C")

handle = CreateFile("\\.\" +

Chr(Asc("c") + m.drivenumber) + ":",0xC0000000, 3, 0, 3, 0, 0)

m.sn = ""

m.

mod = ""

m.rev = ""

If handle <> -1

m.sci =""

m.sci = m.sci +

Chr(0) + Chr(2) + Chr(0) + Chr(0)

m.sci = m.sci +

Chr(0)

m.sci = m.sci +

Chr(1)

m.sci = m.sci +

Chr(1)

m.sci = m.sci +

Chr(0)

m.sci = m.sci +

Chr(0)

m.sci = m.sci +

Chr(0xA0)

m.sci = m.sci +

Chr(0xEC)

m.sci = m.sci +

Chr(0)

m.sci = m.sci +

Chr(0)

m.sci = m.sci +

Replicate(Chr(0), 499)

m.sco =

Replicate(Chr(0), 2048)

m.ret_buffersize = 0

m.otv=DeviceIoControl( handle,;

0x7C088,;

@m.sci,;

LEN(sci),;

@m.sco,;

LEN(sco),;

@m.ret_buffersize,;

0;

)

CloseHandle(handle)

If m.otv <> 0

m.sn =

Chrtran( Alltrim( conv21( Substr(m.sco, 37, 20) ) ),Chr(0), "")

m.rev =

Chrtran( Alltrim( conv21( Substr(m.sco, 63, 8) ) ),Chr(0), "")

m.

mod = Chrtran( Alltrim( conv21( Substr(m.sco, 71, 40) ) ),Chr(0), "")

Endif

Endif

If Empty

(m.sn)

handle = CreateFile("\\.\" +

Chr(Asc("c") + m.drivenumber) +":", 0x00000000, 3,0, 3, 0, 0)

If handle <> -1

m.sn = ""

m.

mod = ""

m.rev = ""

m.sci =

Replicate(Chr(0),1024)

m.sco =

Replicate(Chr(0),1024)

m.ret_buffersize = 0

m.otv = DeviceIoControl( handle,;

0x2D1400,;

@m.sci,;

LEN(sci),;

@m.sco,;

LEN(sco),;

@m.ret_buffersize,;

0;

)

CloseHandle(handle)

If m.otv <> 0

m.pos0 =

Asc(Substr(m.sco,13,1))

m.pos1 =

Asc(Substr(m.sco,17,1))

If m.pos0 > 0

m.pos1 = m.pos0

Endif

m.pos2 = Asc(Substr(m.sco, 21, 1))

m.pos3 =

Asc(Substr(m.sco, 25, 1))

m.

mod = Substr(m.sco, m.pos1+1, m.pos2 - m.pos1)

m.pos4 =

At(Chr(0), m.mod)

If m.pos4 > 0

m.

mod = Alltrim(Chrtran(m.mod, Chr(0), ""))

Endif

If

m.pos3 > m.pos2

m.rev =

Substr(m.sco, m.pos2+1, m.pos3 - m.pos2)

Else

m.rev = Substr(m.sco, m.pos2+1)

Endif

m.pos4 = At(Chr(0), m.rev)

If m.pos4 > 0

m.rev =

Alltrim(Left(m.rev, m.pos4 - 1))

Endif

 

m.sn = ""

*!* If m.pos3 > 0

*!* m.pos3 = m.pos3 + 1

*!* m.sco1 = Substr(m.sco, m.pos3, 40)

*!* m.sco1 = Alltrim(m.sco1)

*!* m.sn = ""

*!* m.pos3 = 1

*!*

*!* SET STEP ON

*!*

*!* For m.j = 1 To 20

*!* m.ch1 = Chr(Evaluate("0x" + Alltrim(Substr(m.sco1, m.pos3, 2))))

*!* m.pos3 = m.pos3 + 2

*!* m.ch2 = Chr(Evaluate("0x" + Alltrim(Substr(m.sco1, m.pos3, 2))))

*!* m.pos3 = m.pos3 + 2

*!* m.sn = m.sn + m.ch2 + m.ch1

*!* Endfor

*!* m.sn = Alltrim(Chrtran(m.sn, Chr(0), ""))

*!* Else

*!* m.sn = ""

*!* Endif

Endif

Endif

Endif

Serial = m.mod + m.rev + m.sn

Clear Dlls CloseHandle, CreateFile, DeviceIoControl, GetLogicalDriveStrings, GetDriveType, GetVolumeInformation

Return Serial

Function

conv21

Lparameters m.str

If Len

(m.str)%2 = 1

m.

str = m.str + " "

Endif

Local

m.i, m.str2

m.str2 = ""

For m.i=1 To Len(m.str)

m.str2 = m.str2 +

Substr(m.str, m.i + Iif(m.i%2=0, -1, 1), 1)

Endfor

Return

m.str2

Function

declara

Declare Integer CloseHandle In kernel32 ;

INTEGER hObject

Declare Integer CreateFile In kernel32 ;

STRING lpFileName,;

INTEGER dwDesiredAccess,;

INTEGER dwShareMode,;

INTEGER lpSecurityAttributes,;

INTEGER dwCreationDisposition,;

INTEGER dwFlagsAndAttributes,;

INTEGER hTemplateFile

Declare Integer DeviceIoControl In kernel32 ;

INTEGER hDevice,;

INTEGER dwIoControlCode,;

STRING @lpInBuffer,;

LONG nInBufferSize,;

STRING @lpOutBuffer,;

LONG nOutBufferSize,;

INTEGER @lpBytesReturned,;

INTEGER lpOverlapped

Declare Integer GetLogicalDriveStrings In Win32API ;

INTEGER buflen,;

STRING @buf

Declare Integer GetDriveType In Win32API String cpath

Declare Integer GetVolumeInformation In Win32API ;

STRING lpRootPathName,;

STRING @lpVolumeNameBuffer,;

INTEGER nVolumeNameSize,;

LONG @lpVolumeSerialNumber,;

INTEGER @lpMaximumComponentLength,;

INTEGER @lpFileSystemFlags,;

STRING @lpFileSystemNameBuffer,;

INTEGER nFileSystemNameSize

Return

Daniel Del Giudice

unread,
Mar 26, 2014, 9:06:16 AM3/26/14
to publice...@googlegroups.com
Gracias Edgar y Nilton. Estuve leyendo todo lo que pude y no es un tema sencillo si se quiere encarar seriamente.

Los id de cpu a veces retornan valores como "To be fill by OEM..." o algo así
Los Mac address cambian si se enchufa o desenchufa el cable de red o se activa o desactiva el wi-fi, por lo tanto no se puede esperar que siempre sea la misma clave. Sin contar que se pueden clonar.
Nilton, tu rutina es mucho mejor que la que hay por ahí que lee el número de serie del volumen, pero en un cliente me devolvió una cadena vacía, así que no la pude usar ahí. Evidentemente el Windows no anda bien en esa máquina y todas las rutinas de este tipo interrogan al sistema operativo, con lo cual también eventualmente sería alterable
Edgar, el link que me diste lleva a otro lugar, no a la rutina para leer el serial del hard disk.

elkin dario uribe torres

unread,
Mar 26, 2014, 9:22:43 AM3/26/14
to publice...@googlegroups.com
Daniel mira este link de pronto sacas algo de ahi.


Saludos

Luis Santander

unread,
Mar 26, 2014, 10:29:26 AM3/26/14
to publice...@googlegroups.com
Esta funcion es la que uso

FUNCTION SERIALHDD

oFS=CreateObject('scripting.filesystemobject')
cadena=str(oFS.Drives('c').SerialNumber,10)
release ofs

RETURN CADENA

ENDFUNC

Me ha funcionado en todos los WIN.
Ah si todas estas funciones dependen del SO
y son suceptibles a ser Hackeadas, pero todo
depende del algoritmo que utilices para validar
la PC.


Alci

unread,
Apr 6, 2014, 7:42:20 AM4/6/14
to publice...@googlegroups.com
Si lo clonan le cobras por otra licencia y listo.

Cual es el problema que instalen en mas de una PC, cuando te enteras de eso, le pasas la factura por la nueva licencia, tienes que ver del lado comercial.

Lo que puedes hacer es, registrar en algún lugar todas las pc que utilizan el sistema, y con eso ya sabrás si instalaron en otra pc sin pagarte la licencia.

Mucho tiempo no te van a engan~ar.

Saludos,

El martes, 18 de marzo de 2014 18:04:25 UTC-3, Daniel Del Giudice escribió:

Alci

unread,
Apr 6, 2014, 7:45:00 AM4/6/14
to publice...@googlegroups.com
Desde el punto de vista comercial para mi no es problema que el sistema se instale en otra pc o en otra empresa, total, cuando necesiten de algo nuevo o alguna actualización van a tener que ponerse al día.

Cuando mas se utiliza tu sistema mas dependiente se vuelven, y eso significa $$$

Saludos,

Alcides

El martes, 18 de marzo de 2014 18:04:25 UTC-3, Daniel Del Giudice escribió:

Daniel Del Giudice

unread,
Apr 6, 2014, 5:42:33 PM4/6/14
to publice...@googlegroups.com
Eso depende del contexto. Cuando a tu aplicación la utilizan 200 clientes y están geográficamente distribuidos por todo el país, y tienes empleados o ex empleados que pueden iniciar su propio negocete y hacer el mantenimiento desde su casa o bajo tus propias narices o tienes técnicos que te representan y conocen todo acerca del sistema, entonces pueden está el riesgo que se instalen estaciones adicionales en un negocio sin que te enteres o podrían hasta copiar el sistema y vender todo funcionando llave en mano (sistema + computadora clonada).

Saludos,

Daniel
Reply all
Reply to author
Forward
0 new messages