Desculpa a demora, não tinha visto essa mensagem acima, mas apenas para deixar registrado que até então venho usando apenas de Windows 2000 para cima, então não sei se funciona com Windows como 98 e 95, se alguem poder testar e postar o resultado aqui...
Compilado em Harbour e testado em WINXP e WIN98. Funciona normalmente.
Um clip-abraço !
Pablo César Arrascaeta Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pessoal, pelo visto o função acima postada pelo colega Sygecon funciona pelos posts dos colegas. Só lembrando que tudo que depender de leitura através de DLL, EXE e outros, são "manipulados" facilmente. Pode-se facilmente criar uma DLL com o mesmo nome e com uma unica funcao que le por exemplo um arquivo de texto e neste arquivo, basta definir o serial desejado e pronto acabou a segurança. E outra forma tambem seria alterar este registro que é lido, como se ve, está em uma base de dados que tambem pode ser manipulado.
Nossa vida de programador não é facil, alem de tudo que nós temos que cuidar, temos tambem a segurança anti-pirataria para nos preocuparmos.
Até+
Ola colegas.
Já faz bastante tempo que testei esta rotina. Ela realmente funciona muito bem, desde que o usuario do windows tenha privilégios de administrador, caso contrário, o retorno é vazio.
Com relação a segurança contra cópias piratas de nossos aplicativos, depois de anos trabalhando com isso, cheguei a conclusão de que nao existe um método totalmente seguro. O melhor então, é usar várias travas diferentes. E principalmente, induzir o fraudador por um caminho errado, deixando pistas falsas. Com um pouco de tempo e bastante criatividade (coisa que nao falta pra um bom programador, rs.) dá pra fazer umas coisas bem eficientes.
E é claro, tem que ficar sempre de olho, quando tiver evidencia de que alguma trava foi quebrada, tem que providenciar outra.
Sei que o post já é antigo, mas estou tentando testar o programinha do colega SYGECOMe não tem jeito de resolver a pendencia DLLCALL()
alguém poderia me dizer em qual biblioteca(lib) está esta rotina? estou usando minigui+harbour.
*-- Para Harbour
#include 'hbdyn.ch' //Necessario para trabalhar com a hb_dyncall
#include 'hbcompat.ch'
function SerialHD()
local tDLL, RETPORTA1, lpBuffer:=SPACE(512)
tDLL:=hb_LibLoad("DiskSerial.dll")
if TDLL == NIL // Nao carregou a Dll
hb_LibFree( TDLL ) //Libera a DLL
return 'Erro na DLL'
endif
RETPORTA1 := hb_dynCall( { "GetSerialNumber", tDLL, HB_DYN_CALLCONV_STDCALL}, 0, @lpBuffer)
lpBuffer := Left(TiraEspacos(lpBuffer), 14)
hb_LibFree( TDLL ) //Libera a DLL
return lpBuffer
***********************************************
function TiraEspacos(Arg1)
Arg1 := Alltrim(Arg1)
Arg1 := StrTran(Arg1, CHR(0),"")
return Arg1
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop Celular Android/iOS Windev Mobile WEB Windev Web
Há algo de errado com esta rotina, pois a cada leitura que ser faz vem um serial diferente, fiz um pequeno teste e a cada click do botão retorna um serial diferente, alguém poderia ver o que esta havendo, não tenho conhecimento desta DLL. anexei os fontes
Eu olhei seu PRG e com relação a rotina q pega o Serial do HD via Dll esta correta, da mesma forma q eu uso aki e não tenho problemas.
Agora o q eu pensei é o seguinte, será q no teu caso qdo vc carrega no objeto do MINIGUI pra exibir ele não esta mostrando somente os Nrs?
Pq na verdade o serial é Caracter ele pode conter Números e Letras.
Fora isto não sei o q pode ser, pq em modo console q uso a rotina e tb no visual (uso outra lib gráfica) não tive problemas.
[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop Celular Android/iOS Windev Mobile WEB Windev Web
Hoje temos a possibilidade de pegar as informações do volume, usando O.L.E...
"SELECT * FROM Win32_PhysicalMedia", não sei como utilizar em harbour, mas utilizo bastante em C++
Encontrei esse tutorial em C# que apresenta como utilzar também... http://www.codeproject.com/Articles/607 ... axed&fr=26
Andril, utlizando esse método... não tem como a pessoa "criar uma dll que retorne um serial invalido"....
//------------------------------------------------------------------------------
procedure TesteHD()
local oWmiService, oListaProcess, oDisk
oWmiService := Service_WMI()
oListaProcess := oWmiService:ExecQuery('Select * from Win32_PhysicalMedia')
FOR Each oDik in oListaProcess
alert(oDisk:SerialNumber)
NEXT
RETURN
Porém....
Se uso a Dll retorna assim: 2SQR9JCA019417
Se uso digamos "nativo" sem Dll retorna: S2RQJ9AC104971
Observe q se compararmos 1 com o outro a cada par de caracteres esta INVERTIDO...
Agora como eu sei qual é o correto?
[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop Celular Android/iOS Windev Mobile WEB Windev Web
Private Shared Function SwapChars(ByVal chars() As Char) As String
For i As Integer = 0 To chars.Length - 2 Step 2
chars.Reverse(chars, i, 2)
Next
Return New String(chars).Trim
End Function
Ok Benz fiz a o Swap e apareceu correto, porém meu aplicativo qdo fecha da um erro, ou seja, se utilizo esta função na hora q fecha o sistema dá um erro APPCRASH
Function TesteHD()
LOCAL oWmiService, oListaProcess, oProcessos,;
cSerial := '', cSerialNew := ''
oWmiService := Service_WMI()
oListaProcess := oWmiService:ExecQuery('Select * from Win32_PhysicalMedia')
FOR Each oProcessos in oListaProcess
cSerial := oProcessos:SerialNumber
exit
NEXT
*-- Faz Swap Char para SO Vista ou Higher (colocar função para identificar o SO, tipo if Vista or Higher faz o Swap)
For i := 1 To len(cSerial)
if i%2 !=0 // impar
cSerialNew += substr(cSerial, i+1, 1)
cSerialNew += substr(cSerial, i, 1)
endif
Next
RETURN cSerialNew
[]´s
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop Celular Android/iOS Windev Mobile WEB Windev Web