|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
pardal3000 Aprendiz
Registrado: Segunda-Feira, 3 de Mai de 2004 Mensagens: 223
|
Enviada: Sáb Out 12, 2013 10:12 pm Assunto: CPU ID - Ajuda para sistema de proteção |
|
|
Olá todos!
Depois da tentativa frustada de usar o Mac Address para gerar um código confiável para um sistema de proteção de um software (vejam: http://www.activedelphi.com.br/forum/viewtopic.php?t=83324), agora estou tentando usar o CPU ID.
Criei o código abaixo através de uma pesquisa no Google:
Código: |
Function CPUID: String;
type
TCPUID = Array[1..4] of LongInt;
const
ID_BIT = $200000;
var
CPUID: TCPUID;
Function Has_CPUID: 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 Get_CPUID : 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;
Begin
Result := '';
If Has_CPUID Then
Begin
CPUID := Get_CPUID;
Result :=
IntToHex(CPUID[1], 8) + '-' +
IntToHex(CPUID[2], 8) + '-' +
IntToHex(CPUID[3], 8) + '-' +
IntToHex(CPUID[4], 8);
end;
end;
|
Por favor, poderiam testar o código e retornar este tópico apenas informando a versão do Windows que está usando e se funcionou ou não (retornou alguma coisa)?
Se alguém tiver alguma dica sobre isso, por favor compartilhe com a gente!!
Abraço! |
|
Voltar ao Topo |
|
|
pardal3000 Aprendiz
Registrado: Segunda-Feira, 3 de Mai de 2004 Mensagens: 223
|
Enviada: Dom Out 13, 2013 1:00 pm Assunto: |
|
|
Segue abaixo uma atualização da função anterior. Testei aqui em duas máquinas, com Windows 7 64 bit, uma com processador Intel I5 e outra com AMD FX-8150, e funcionou normalmente.
Agradeço quem puder testar e retornar informando a versão do Windows (XP, 7, 8, etc.), plataforma (32 ou 64 bit), e o tipo de processador (Intel ou AMD).
Código: |
Function CPUID: String;
type
TCPUID = Array[1..4] of LongInt;
const
ID_BIT = $200000;
var
CPUID: TCPUID;
//----------------------------------------------------------------------------
Function Has_CPUID: 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 Get_CPUID: TCPUID; Assembler; Register;
Asm
{$IF Defined(CPUX86)}
PUSH EBX
PUSH EDI
MOV EDI, EAX
MOV EAX, 1
CPUID
MOV [EDI + $0], EAX
MOV [EDI + $4], EBX
MOV [EDI + $8], ECX
MOV [EDI + $c], EDX
POP EDI
POP EBX
{$ELSEIF Defined(CPUX64)}
MOV R8, RBX
MOV R9, rcx
MOV EAX, 1
CPUID
MOV [R9 + $0], EAX
MOV [R9 + $4], EBX
MOV [R9 + $8], ECX
MOV [R9 + $c], EDX
MOV RBX, R8
{$IFEND}
end;
//----------------------------------------------------------------------------
Begin
Result := '';
If Has_CPUID Then
Begin
CPUID := Get_CPUID;
Result :=
IntToHex(CPUID[1], 8) + '-' +
IntToHex(CPUID[2], 8) + '-' +
IntToHex(CPUID[3], 8) + '-' +
IntToHex(CPUID[4], 8);
end;
end;
|
Fontes:
- http://balaiotecnologico.blogspot.com.br/2009/06/obtendo-informacoes-da-cpu-em-delphi.html
- http://stackoverflow.com/questions/13874152/porting-assembler-x86-cpu-id-code-to-amd64
- http://www.delphipages.com/forum/showthread.php?t=159330
Obrigado! |
|
Voltar ao Topo |
|
|
pardal3000 Aprendiz
Registrado: Segunda-Feira, 3 de Mai de 2004 Mensagens: 223
|
Enviada: Dom Out 13, 2013 1:14 pm Assunto: |
|
|
Criei um aplicativo de demostração (com código fonte em Delphi 7) das funções que obtém:
- Nome da máquina
- Versão do Windows
- CPU ID
- Mac Address
Coloquei neste link:
CPUID-MAC.zip (95 KB)
https://mega.co.nz/#!ixoxRZTB!FrzPhgMi2Xwwdrj5uWkFrDQwFQpXLKt4ItK4jLm9APA
Por favor, ajudem! Não custa nada e vai ajudar muitas pessoas que estão desenvolvendo um sistema de proteção para seus programas!!
Lembrando que a pirataria é ruim para todos! Até se o software do seu concorrente for pirateado, você terá prejuízos!
Abraço! |
|
Voltar ao Topo |
|
|
Netrunner Aprendiz
Registrado: Domingo, 7 de Julho de 2013 Mensagens: 236
|
Enviada: Dom Out 13, 2013 4:48 pm Assunto: |
|
|
olá, está faltando arquivo na source
|
|
Voltar ao Topo |
|
|
tiagoshimizu Membro Junior
Registrado: Segunda-Feira, 28 de Setembro de 2009 Mensagens: 329
|
Enviada: Dom Out 13, 2013 5:33 pm Assunto: |
|
|
pardal3000, primeiramente parabéns pela iniciativa de compartilhar o código com todos.
Compilei o projeto no delphi 2010, onde tive de comentar as linhas:
26 : //{$IF RTLVersion < 19}
137 ://function GetVersionEx(var lpVersionInformation: TOSVersionInfo): BOOL; stdcall; overload;
138: // external kernel32 name 'GetVersionExA';
142 : //{$IFEND}
Também, como já comentado pelo Netrunner, só retirei do projeto o FastMM4.dcu por também não ter ele em meu pc.
Tirando isso, rodei a aplicação no Windows XP, Windows 7 x64 e Windows 8 x64 e todos funcionaram ok.
Quais quer novidades, também vou postando. |
|
Voltar ao Topo |
|
|
pardal3000 Aprendiz
Registrado: Segunda-Feira, 3 de Mai de 2004 Mensagens: 223
|
Enviada: Dom Out 13, 2013 5:59 pm Assunto: |
|
|
Opa, obrigado por tentarem ajudar...
Netrunner, FastMM é uma biblioteca para detectar vazamento de memória que eu uso. Basta retirar essa linha "FastMM4," da cláusula USES do arquivo .dpr (Project1.dpr).
Thiago, correto, a biblioteca que pega a versão do Windows foi testada apenas até o Delphi 2007 se não me engano. Mas ótimo que conseguiu rodar comentando essas linhas! Obrigado pela ajuda!
Pessoal, quando forem testar por favor tentem duas vezes. Fechem o aplicativo e depois façam um novo teste para comparar os resultados. Na primeira função que postei neste tópico, cada vez que eu rodava dava um resultado diferente...
Abraço! |
|
Voltar ao Topo |
|
|
Netrunner Aprendiz
Registrado: Domingo, 7 de Julho de 2013 Mensagens: 236
|
Enviada: Dom Out 13, 2013 6:01 pm Assunto: |
|
|
NETRUNNERX - Windows 7 Ultimate Edition 64-bit
CPU ID: 00414200-0018F584-0018F700-004293B8
MAC Address: F2-CA-6D-E0-56-39
-------------------------------------------------------------------------------------------------- |
|
Voltar ao Topo |
|
|
tiagoshimizu Membro Junior
Registrado: Segunda-Feira, 28 de Setembro de 2009 Mensagens: 329
|
Enviada: Dom Out 13, 2013 10:27 pm Assunto: |
|
|
Cara, abri várias vezes a aplicação e em todas as vezes mandei gerar os códigos e todas as vezes se mantiveram iguais. |
|
Voltar ao Topo |
|
|
faccruz Colaborador
Registrado: Terça-Feira, 20 de Julho de 2010 Mensagens: 1563
|
Enviada: Seg Out 14, 2013 8:42 am Assunto: |
|
|
DES_91 - Windows 7 Professional 32-bit
CPU ID: 0041491C-0012F5C0-0012F73C-00429B28
MAC Address: 00-1E-C9-1D-B9-0F
----------------------------------------------------------------------------------------
repeti várias vezes, sempre com o mesmo resultado. _________________ Facc System - Sistemas para Computador |
|
Voltar ao Topo |
|
|
pardal3000 Aprendiz
Registrado: Segunda-Feira, 3 de Mai de 2004 Mensagens: 223
|
Enviada: Seg Out 14, 2013 11:01 am Assunto: |
|
|
Segue alguns resultados obtidos aqui:
COMP01 - Windows 7 Ultimate Edition 64-bit (AMD)
CPU ID: 00417360-0018F584-0018F700-0042C56C
MAC Address: 00-1B-B9-6E-D1-D9
--------------------------------------------------------------------------------------------------
COMP02 - Windows 7 Home Premium Edition 32-bit (INTEL)
CPU ID: 00417360-0012F5C0-0012F73C-0042C56C
MAC Address: 00-18-37-07-55-4B
--------------------------------------------------------------------------------------------------
NOTEBOOK - Windows 7 Home Premium Edition 64-bit (INTEL)
CPU ID: 00417360-0018F444-0018F5C0-0042C56C
MAC Address: 24-B6-FD-05-2C-78
--------------------------------------------------------------------------------------------------
SERVER - Windows 7 Professional 64-bit (AMD)
CPU ID: 00417360-0018F528-0018F6A4-0042C56C
MAC Address: 30-85-A9-F7-6B-D7
--------------------------------------------------------------------------------------------------
O que já pude perceber é que não houve diferença no primeiro e último octeto, mesmo sendo computadores completamente diferentes, comprados em anos diferentes (os dois primeiros têm pelo menos 5 anos, o notebook tem 2 anos, e o SERVIDOR é desse ano).
Por favor, não esqueçam de informar se é AMD ou INTEL, pois os problemas que tive com a primeira versão da função, de resultados diferentes cada vez que executava, ocorreram com o processador AMD. Mas agora nessa nova função não tive mais problemas.
Aguardamos mais testes! Obrigado pela ajuda!! |
|
Voltar ao Topo |
|
|
pardal3000 Aprendiz
Registrado: Segunda-Feira, 3 de Mai de 2004 Mensagens: 223
|
Enviada: Ter Out 15, 2013 1:00 am Assunto: |
|
|
E aí pessoal, alguém mais poderia dar uma ajudinha?
Obrigado! |
|
Voltar ao Topo |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|