ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

CPU ID - Ajuda para sistema de proteção

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
pardal3000
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 3 de Mai de 2004
Mensagens: 223

MensagemEnviada: Sáb Out 12, 2013 10:12 pm    Assunto: CPU ID - Ajuda para sistema de proteção Responder com Citaçã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
Ver o perfil de Usuários Enviar Mensagem Particular
pardal3000
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 3 de Mai de 2004
Mensagens: 223

MensagemEnviada: Dom Out 13, 2013 1:00 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
pardal3000
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 3 de Mai de 2004
Mensagens: 223

MensagemEnviada: Dom Out 13, 2013 1:14 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Netrunner
Aprendiz
Aprendiz


Registrado: Domingo, 7 de Julho de 2013
Mensagens: 236

MensagemEnviada: Dom Out 13, 2013 4:48 pm    Assunto: Responder com Citação

olá, está faltando arquivo na source
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tiagoshimizu
Membro Junior
Membro Junior


Registrado: Segunda-Feira, 28 de Setembro de 2009
Mensagens: 329

MensagemEnviada: Dom Out 13, 2013 5:33 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
pardal3000
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 3 de Mai de 2004
Mensagens: 223

MensagemEnviada: Dom Out 13, 2013 5:59 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Netrunner
Aprendiz
Aprendiz


Registrado: Domingo, 7 de Julho de 2013
Mensagens: 236

MensagemEnviada: Dom Out 13, 2013 6:01 pm    Assunto: Responder com Citação

NETRUNNERX - Windows 7 Ultimate Edition 64-bit
CPU ID: 00414200-0018F584-0018F700-004293B8
MAC Address: F2-CA-6D-E0-56-39
--------------------------------------------------------------------------------------------------
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
tiagoshimizu
Membro Junior
Membro Junior


Registrado: Segunda-Feira, 28 de Setembro de 2009
Mensagens: 329

MensagemEnviada: Dom Out 13, 2013 10:27 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
faccruz
Colaborador
Colaborador


Registrado: Terça-Feira, 20 de Julho de 2010
Mensagens: 1563

MensagemEnviada: Seg Out 14, 2013 8:42 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário
pardal3000
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 3 de Mai de 2004
Mensagens: 223

MensagemEnviada: Seg Out 14, 2013 11:01 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
pardal3000
Aprendiz
Aprendiz


Registrado: Segunda-Feira, 3 de Mai de 2004
Mensagens: 223

MensagemEnviada: Ter Out 15, 2013 1:00 am    Assunto: Responder com Citação

E aí pessoal, alguém mais poderia dar uma ajudinha?

Obrigado!
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB