Deletar Linhas Do Script

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Deletar Linhas Do Script

Re: Deletar Linhas Do Script

Post by Hologram » 25 Sep 2020, 13:17

vou melhorar ela em uma atualização futura proxima, eu fiquei um pouco confuso pq nunca tinha usado quase nenhuma das funçoes embutididas usadas nesse script, por hora ela esta boa, agradeço por tudo, agora só vou terminar um auto-update e esta pronta pro mercado :)

Re: Deletar Linhas Do Script

Post by Gio » 24 Sep 2020, 09:32

Bom dia Hologram.


Creio que o problema está nesta linha:

if (string_final_Data_campo <= verificar_Mes) and (string_final_Data_campo_2 <= verificar_Mes){

:arrow: A questão é que verificar_mes é a variável da data atual, e string_final_data_campo é o mes da licença. Logo, a lógica está invertida aqui, pois verificar_mes deveria ser menor-ou-igual-a string_final_Data_campo (e não o inverso).

Linha corrigida comparando corretamente:

Code: Select all

if (verificar_Mes <= string_final_Data_campo) and (verificar_Mes <= string_final_Data_campo_2 ){
Também não deve esquecer de escolher as informações corretamente na formação da string_para_encriptar. São necessárias pelo menos 5 informações textuais que estejam todas presentes no relatório do computador do cliente e elas devem ser as que melhor individualizem aquela máquina.

:arrow: Se você estiver pensando em usar este método, lembro novamente que a criptografia aqui é muito fraca, pois o método é apenas exemplificativo. O cliente pode facilmente perceber que a data se refere a apenas 6 caracteres da chave e que pode ser manipulada diretamente. Sugiro criar um algoritmo que implemente uma transformação matemática mais adequada na string_para_encriptar (inclusive acabando com a relação 1 para 1 de caracteres da string original e da chave).

Re: Deletar Linhas Do Script

Post by Hologram » 23 Sep 2020, 21:58

Neste caso não há mistério, basta trocar no código os lugares onde foi utilizada a variável embutida A_Now por uma variável que você fará conter a data/hora obtida da internet.
Eu até tentei, mas por algum motivo na hora de comparação de data mesmo a data sendo menor, ele seta como false, tenta rodar pra tu ver:

Chave:

Code: Select all

string_para_Encriptar := "INFO|INFO|INFO|INFO|INFO"
vencimento_Mes := 09 
vencimento_Ano := 2021
vencimento_Data := vencimento_Mes . vencimento_Ano

new_Key := Criptografar(String_Para_Encriptar, vencimento_Data)
msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%new_Key% `n`nA chave foi copiada.
Clipboard := new_Key
return


Criptografar(Key , Dataa)
{
	DADOS := Key . "|" . "data:" . Dataa . "end"
	Loop, Parse, DADOS
	{
		Nova_Letra := Asc(A_LoopField) + 1
		Nova_String := Nova_String . Chr(Nova_Letra)
	}
	Return Nova_String
}
return



Script_verificador:

Code: Select all

#SingleInstance, Force

Gui, add, Text, x20 y40, Insira a chave validadora do seu ID aqui:
Gui, add, Edit, x20 y60 w360 vCHAVE_INSERIDA
Gui, add, Button, x150 y100 w100 gVERIFICAR_CHAVE, VALIDAR
Gui, add, button, x300 y250 gGERAR_ID, GERAR ID
Gui, add, statusbar, , Bem vindo
Gui, show, w400 h300, Script de chaves de licença
Return


VERIFICAR_CHAVE:
Gui, submit, nohide
Gui, Default
SB_SetText("Verificando chave inserida...")
TENTATIVA_DE_CHAVE := Descriptografar(CHAVE_INSERIDA)
StringSplit, CAMPO_, TENTATIVA_DE_CHAVE, |
If (CAMPO_0 < 5)
{
	Msgbox, 0x10, Erro, A chave inserida e invalida.
	SB_SetText("")
	Return
}
RunWait, %comspec% /c systeminfo > tmpFile,,Hide
FileRead, INFO_PC, tmpFile
FileDelete, tmpFile
Loop % CAMPO_0 - 1
{
	If (!(InStr(INFO_PC, CAMPO_%A_Index%)) AND !(A_Index = CAMPO_0 ))
	{
		ATUAL := CAMPO_%A_Index%
		Msgbox, 0x10, Erro, A chave inserida e invalida. %ATUAL%
		SB_SetText("")
		Sleep, 5000
		ExitApp
		Return
	}
}
DATA_DA_LICENCA := TENTATIVA_DE_CHAVE
StringGetPos, localiza_data_Campo, DATA_DA_LICENCA, data:
adicionar_caractere := localiza_data_Campo + 5
StringTrimLeft, data_Localizada_Campo, DATA_DA_LICENCA, %adicionar_caractere%
StringGetPos, data_Localizada_campo_2, data_Localizada_Campo, end
cortar_caracteres_a_Esquerda_campo := data_Localizada_campo_2 - 4
string_final_Data_campo := SubStr(data_Localizada_Campo, 1, cortar_caracteres_a_Esquerda_campo)

DATA_DA_LICENCA_2 := TENTATIVA_DE_CHAVE
StringGetPos, localiza_data_Campo_2, DATA_DA_LICENCA_2, data:
adicionar_caractere_2 := localiza_data_Campo_2 + 7
StringTrimLeft, data_Localizada_Campo_2, DATA_DA_LICENCA_2, %adicionar_caractere_2%
StringGetPos, data_Localizada_campo_2_2, data_Localizada_Campo_2, end
cortar_caracteres_a_Esquerda_campo_2 := data_Localizada_campo_2_2 - 0
string_final_Data_campo_2 := SubStr(data_Localizada_Campo_2, 1, cortar_caracteres_a_Esquerda_campo_2)
verificar_Mes := verificacao_Online(34, 25)
verificar_Ano := verificacao_Online(29, 28)

msgbox, %string_final_Data_campo%
msgbox, %string_final_Data_campo_2%
msgbox, %verificar_Mes%
msgbox, %verificar_Ano%

if (string_final_Data_campo <= verificar_Mes) and (string_final_Data_campo_2 <= verificar_Mes){
	msgbox, login efetuado com sucesso!
}
else{
	Msgbox, 0x10, Erro, A chave inserida expirou.
}
return

GERAR_ID:
Gui, Default
SB_SetText("Gerando arquivo de ID...")
RunWait, %comspec% /c systeminfo > tmpFile,,Hide
FileRead, INFO_PC, tmpFile
FileDelete, tmpFile
FileSelectFile, CAMINHO_DO_ARQUIVO, S, , Selecione a pasta de destino, Arquivo usid (*.usid) ; Use uma extensão bem diferente para evitar leigos curiosos e associações erradas do arquivo de ID a outras programas da máquina do cliente.

If (ErrorLevel = 1)
{
	msgbox, 0x10, Erro, Você precisa selecionar um local para salvar o arquivo de ID.
	Return
}
FileAppend, %INFO_PC%, %CAMINHO_DO_ARQUIVO%.usid
If (ErrorLevel = 1)
{
	msgbox, 0x10, Erro, Não foi possível gravar o arquivo de ID. Verifique as permissões da pasta e tente novamente.
	Return
}
msgbox, 0, Aviso, Arquivo gerado com sucesso. Envie o arquivo ao suporte para geração da chave de acesso.
SB_SetText("Arquivo de ID gerado com sucesso.")
Return


Descriptografar(String)
{
	Loop, Parse, String
	{
		Nova_Letra := Asc(A_LoopField) - 1
		Nova_String := Nova_String . Chr(Nova_Letra)
	}
	Return Nova_String
}
return

verificacao_Online(Var_1, Var_2){
	URLDownLoadToFile, http://worldtimeapi.org/, %A_ScriptDir%/verificador.usid
	FileRead, verificar_data_online, %A_ScriptDir%/verificador.usid
	verificador := verificar_data_online
	FileDelete, verificador.usid

	StringGetPos, localiza_data, verificador, The unixtime is: 
	adicionar_caracteres_a_Direita := localiza_data + Var_1
	StringTrimLeft, data_Localizada, verificador, %adicionar_caracteres_a_Direita%
	StringGetPos, data_Localizada_2, data_Localizada, </var>
	cortar_caracteres_a_Esquerda := data_Localizada_2 - Var_2
	string_final_Data := SubStr(data_Localizada, 1, cortar_caracteres_a_Esquerda)
		return string_final_Data
}
return

Re: Deletar Linhas Do Script

Post by Gio » 23 Sep 2020, 17:20

No caso você quer usar a data/hora obtida da internet para comparar com a chave inserida (ao invés de usar a data/hora do computador)?

Neste caso não há mistério, basta trocar no código os lugares onde foi utilizada a variável embutida A_Now por uma variável que você fará conter a data/hora obtida da internet.

Re: Deletar Linhas Do Script

Post by Hologram » 22 Sep 2020, 16:43

excelente :), eu fiz uma funcao para verificaçao de mes e ano online ( tinha feito de hora e minutos tambem, porem devido a desnecessidade pra mim, acabei retirando), tu pode me ajudar a emplementa-la na sua criptografia plis:

funçao que fiz:

Code: Select all

; < -- esses dados serao passados pela chave! -- >
expiracao_Mes := 10
expiracao_Ano := 2020
; < -- esses dados serao passados pela chave! -- >

verificar_Mes := verificacao_Online(34, 25)
verificar_Ano := verificacao_Online(29, 28)
msgbox, Mes atual: %verificar_Mes%
msgbox, Ano atual: %verificar_Ano%

if (verificar_Mes <= expiracao_Mes) and (verificar_Ano <= expiracao_Ano){
	Msgbox, Verificacao completa, todos os dados conferem!
}
else{
	Msgbox, o Script expirou, entre em contato com o suporte para obter mais tempo.
}

return

verificacao_Online(Var_1, Var_2){
	URLDownLoadToFile, http://worldtimeapi.org/, %A_ScriptDir%/verificador.usid
	FileRead, verificar_data_online, %A_ScriptDir%/verificador.usid
	verificador := verificar_data_online
	FileDelete, verificador.usid

	StringGetPos, localiza_data, verificador, The unixtime is: 
	adicionar_caracteres_a_Direita := localiza_data + Var_1
	StringTrimLeft, data_Localizada, verificador, %adicionar_caracteres_a_Direita%
	StringGetPos, data_Localizada_2, data_Localizada, </var>
	cortar_caracteres_a_Esquerda := data_Localizada_2 - Var_2
	string_final_Data := SubStr(data_Localizada, 1, cortar_caracteres_a_Esquerda)
	retornar_Verificacao := string_final_Data
		return retornar_Verificacao
}


Chave:

Code: Select all

String_Para_Encriptar := "FULANO|SAMSUNG ELECTRONICS|300E5EV/300E4EV/|P07RBD|05/03/2020, 16:54:46"
expiracao_Mes := 10
expiracao_Ano := 2020
NOVA_CHAVE := Criptografar(String_Para_Encriptar, expiracao_Mes, expiracao_Ano)
Clipboard := NOVA_CHAVE
msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%NOVA_CHAVE% `n`nA chave foi copiada.
return


Criptografar(CHAVE , expiracao_Mes, expiracao_Ano)
{
	DADOS := CHAVE . "|" . expiracao_Mes . "|" . experiracao_Ano
	Loop, Parse, DADOS
	{
		Nova_Letra := Asc(A_LoopField) + 1
		Nova_String := Nova_String . Chr(Nova_Letra)
	}
	Return Nova_String
}
Return

Re: Deletar Linhas Do Script

Post by Gio » 21 Sep 2020, 10:29

Bom dia Hologram.

Você pode clicar em qualquer nome de comando, função embutida ou etc que esteja dentro de uma caixa de código aqui nos posts do fórum para ver a página de ajuda daqueles respectivos comandos, funções embutidas ou etc. Para traduzir a página, basta usar o tradutor do navegador Google Chrome.

Hologram wrote:
18 Sep 2020, 16:37

Code: Select all

Clipboard := NOVA_CHAVE
Essa linha foi criada meramente por conforto né? não esta fazendo nada no script certo?
:arrow: Essa linha foi criada para inserir o conteúdo da variável NOVA_CHAVE dentro da variável sistêmica Clipboard. Essa variável contém aquilo que foi copiado (o famoso Control + C), então ao colocar o conteúdo da variáveil NOVA_CHAVE dentro da variável sistêmica Clipboard, você pode colar esse conteúdo no bloco de notas ou qualquer outro lugar de sua escolha. Colocar um valor no ClipBoard é uma forma de o script retornar um texto ao usuário, de modo que ele possa colá-lo onde quiser.

Code: Select all

msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%NOVA_CHAVE% `n`nA chave foi copiada.
Os 2 " 'n' " servem para fazer 1 quebra de linha?

:arrow: Servem para fazer 2 quebras de linhas. Colocar duas linhas vazias é apenas uma questão de formatação da mensagem (como ela aparecerá no Msgbox).

Code: Select all

DADOS := CHAVE . "|" . Data
De onde veio essa 'CHAVE'?, não seria a variavel 'String' criada na funçao?

:arrow: Sim, creio que você encontrou um erro no código. Ao inves de String, o primeiro parâmetro da função deveria se chamar CHAVE para que a função possa operar sobre ele (ou poderíamos colocar String em todos os momentos onde referenciamos CHAVE no código do corpo da função).

Code: Select all

Loop, Parse, DADOS
Oq significa 'Parse'?

:arrow: Significa passo-a-passo. No caso do loop, colocar essa opção significa que em cada iteração, estaremos tratando de apenas um caractere do conteúdo da variável DADOS. Assim, se o conteúdo for "abc", na primeira iteração do loop teremos "a", na segunda teremos "b", e na terceira teremos "c" como sendo o conteúdo da variável embutida A_LoopField.

Code: Select all

Nova_Letra := Asc(A_LoopField) + 1
Oq significa 'Asc(A_LoopField) + 1'?

:arrow: Essa é uma função embutida que transforma o primeiro caractere de uma string em seu valor correspondente na tabela ASCII. Fazemos isso para codificar numericamente um texto (no caso, a nossa chave). Ao transformar a letra "a", por exemplo, recebemos o valor 97, que é o valor correspondente a "a" na tabela ASCII. Com esse valor, podemos alterá-lo matemáticamente para "encriptá-lo" e ao mesmo tempo podemos posteriormente reverter a alteração para ter de volta a letra certa.

Code: Select all

Chr(Nova_Letra)
Oq significa Chr?
[/quote]

:arrow: Essa é outra função embutida que faz o inverso da função Chr(). Ao invés de uma letra, ela recebe um número, e depois devolve a letra correspondente na tabela ASCII.


:arrow: Código corrigido:

Code: Select all

String_Para_Encriptar := "FULANO|SAMSUNG ELECTRONICS|300E5EV/300E4EV/|P07RBD|05/03/2020, 16:54:46" ; ESCREVA AQUI AS PALAVRAS ESCOLHIDAS DO PC ALVO !!
Data_De_Validade := "20200531" ; Formato AAAAMMDD    (ano com quatro dígitos, seguido de mês com 2 dígitos, seguido de dia com 2 dígitos. Zeros devem estar presentes em caso de dias e meses menores que 10).
NOVA_CHAVE := Criptografar(String_Para_Encriptar, Data_De_Validade)
Clipboard := NOVA_CHAVE
msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%NOVA_CHAVE% `n`nA chave foi copiada.
Return


Criptografar(CHAVE , Data)
{
	DADOS := CHAVE . "|" . Data
	Loop, Parse, DADOS
	{
		Nova_Letra := Asc(A_LoopField) + 1
		Nova_String := Nova_String . Chr(Nova_Letra)
	}
	Return Nova_String
}
Return

Re: Deletar Linhas Do Script

Post by Hologram » 18 Sep 2020, 16:37

Hop! Desculpe reviver o tópico, mas poderia me orientar sobre algumas linhas pra entender melhor o script?
Eu fui testar o script novamente e por algum motivo nao esta funcionando :( creio que estou errando algo, por isso quero entender melhor oq ta acontecendo nele

Code: Select all

Clipboard := NOVA_CHAVE
Essa linha foi criada meramente por conforto né? não esta fazendo nada no script certo?

Code: Select all

msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%NOVA_CHAVE% `n`nA chave foi copiada.
Os 2 " 'n' " servem para fazer 1 quebra de linha?

Code: Select all

DADOS := CHAVE . "|" . Data
De onde veio essa 'CHAVE'?, não seria a variavel 'String' criada na funçao?

Code: Select all

Loop, Parse, DADOS
Oq significa 'Parse'?

Code: Select all

Nova_Letra := Asc(A_LoopField) + 1
Oq significa 'Asc(A_LoopField) + 1'?

Code: Select all

Chr(Nova_Letra)
Oq significa Chr?

Re: Deletar Linhas Do Script

Post by Gio » 27 May 2020, 09:59

Havia um pequeno erro nas linhas de comparação da data de validade da licença com a data atual do computador.
Efetuei a correção no post acima.

Linhas afetadas:

Code: Select all

DATA_DA_LICENCA := CAMPO_%CAMPO_0% . "000000"
DATA_PARA_EXIBIR := SubStr(DATA_DA_LICENCA, 7, 2) . "/" . SubStr(DATA_DA_LICENCA, 5, 2) . "/" .  SubStr(DATA_DA_LICENCA, 1, 4)
If !(A_Now <= DATA_DA_LICENCA)

:arrow: A comparação de datas no formato YYYYMMDDHHMISS requer que a data tenha todos os elementos (inclusive hora, minuto e segundo, motivo pelo qual foi necessário apensar "000000" à data antes de comparar diretamente através de uma condicional If.

Re: Deletar Linhas Do Script

Post by Gio » 26 May 2020, 18:11

Poderia Dar Um Exemplo, De Como Fazer O Script Rodar Somente Em Determinada Maquina?
Certo, mas esta é uma rotina que tem muito a ver com a criatividade e o conhecimento de criptografia na verdade, então vou tentar ser o mais simplista possível ok?

Perceba que isso significa que não vou propor um código forte em termos criptográficos. Mas veja que a segurança depende entre outras coisas do segredo do código, então não teria nem como eu recomendar o uso de um exemplo que tornei público, por isso vou escrevê-lo apenas por razões didáticas.

De antemão reitero que o exemplo usará um algoritmo BEEEEEM básico de criptografia que é muito fácil de quebrar. Não é um algoritmo recomendado para nível comercial, só vou usar ele porque é fácil de implementar e o assunto não é exatamente a criptografia em si.

Tendo dito isto, vamos lá :beer:

Primeiro você fará na verdade dois scripts, mas um deles ficará com você e o outro será o que já iria para o cliente mesmo.

Um dos scripts (o que vai para o usuário) será o script que você já ia vender pra ele, só que você vai colocar nele duas rotinas especiais acessíveis na tela de login: uma para descriptografar e testar uma chave, e outra para gerar um arquivo indentificador da máquina. O arquivo nada mais é do que uma leitura dos componentes (hardware) e dados da máquina, conforme a rotina descrita no outro post.

:arrow: Embora seja possível, é extremamente improvável que dois computadores tenham os exatos mesmos valores de hardware, além de que o arquivo também pode conter outras informações ainda mais difíceis de se repetirem (como a data/hora da instalação do Windows).

Então o script do cliente será tipo esse aqui:

Code: Select all

#SingleInstance, Force

Gui, add, Text, x20 y40, Insira a chave validadora do seu ID aqui:
Gui, add, Edit, x20 y60 w360 vCHAVE_INSERIDA
Gui, add, Button, x150 y100 w100 gVERIFICAR_CHAVE, VALIDAR
Gui, add, button, x300 y250 gGERAR_ID, GERAR ID
Gui, add, statusbar, , Bem vindo
Gui, show, w400 h300, Script de chaves de licença
Return


VERIFICAR_CHAVE:
Gui, submit, nohide
Gui, Default
SB_SetText("Verificando chave inserida...")
TENTATIVA_DE_CHAVE := Descriptografar(CHAVE_INSERIDA)
StringSplit, CAMPO_, TENTATIVA_DE_CHAVE, |
If (CAMPO_0 < 5) ; Primeiro, garantimos que a chave inserida tenha pelo menos 5 campos verificáveis.
{
	Msgbox, 0x10, Erro, A chave inserida é inválida.
	SB_SetText("")
	Return
}
RunWait, %comspec% /c systeminfo > tmpFile,,Hide
FileRead, INFO_PC, tmpFile
FileDelete, tmpFile
Loop % CAMPO_0 - 1 ; Este loop verifica se os campos da chave inserida estão no arquivo de ID da máquina, então não vamos procurar o último campo (que é a data de validade) aqui ainda.
{
	If (!(InStr(INFO_PC, CAMPO_%A_Index%)) AND !(A_Index = CAMPO_0 ))
	{
		ATUAL := CAMPO_%A_Index%
		Msgbox, 0x10, Erro, A chave inserida é inválida. %ATUAL%
		SB_SetText("")
		Return
	}
}

DATA_DA_LICENCA := CAMPO_%CAMPO_0% . "000000"
DATA_PARA_EXIBIR := SubStr(DATA_DA_LICENCA, 7, 2) . "/" . SubStr(DATA_DA_LICENCA, 5, 2) . "/" .  SubStr(DATA_DA_LICENCA, 1, 4)
If !(A_Now <= DATA_DA_LICENCA)
{
	Msgbox, 0x10, Erro, A chave inserida expirou em %DATA_PARA_EXIBIR%. 
	Return
}
msgbox, 0, Aviso, Login efetuado com sucesso!
SB_SetText("Login efetuado com sucesso.")
Return


GERAR_ID:
Gui, Default
SB_SetText("Gerando arquivo de ID...")
RunWait, %comspec% /c systeminfo > tmpFile,,Hide
FileRead, INFO_PC, tmpFile
FileDelete, tmpFile
FileSelectFile, CAMINHO_DO_ARQUIVO, S, , Selecione a pasta de destino, Arquivo usid (*.usid) ; Use uma extensão bem diferente para evitar leigos curiosos e associações erradas do arquivo de ID a outras programas da máquina do cliente.

If (ErrorLevel = 1)
{
	msgbox, 0x10, Erro, Você precisa selecionar um local para salvar o arquivo de ID.
	Return
}
FileAppend, %INFO_PC%, %CAMINHO_DO_ARQUIVO%.usid
If (ErrorLevel = 1)
{
	msgbox, 0x10, Erro, Não foi possível gravar o arquivo de ID. Verifique as permissões da pasta e tente novamente.
	Return
}
msgbox, 0, Aviso, Arquivo gerado com sucesso. Envie o arquivo ao suporte para geração da chave de acesso.
SB_SetText("Arquivo de ID gerado com sucesso.")
Return


Descriptografar(String)
{
	Loop, Parse, String
	{
		Nova_Letra := Asc(A_LoopField) - 1
		Nova_String := Nova_String . Chr(Nova_Letra)
	}
	Return Nova_String
}
Return

Execute ele e veja que o cliente quando abrir o seu programa terá duas opçoes: inserir uma chave OU gerar um ID.

Ao clicar em "Gerar ID" o script salvará um arquivo na pasta escolhida pelo cliente com as informações da máquina dele (obtidas conforme o código do outro post). Este arquivo você vai solicitar que ele envie para você por email. Os dados do arquivo podem ser visualizados em qualquer editor de texto, inclusive no bloco de notas do Windows, pois se trata de fato de um arquivo texto, apesar da extensão diferentona (.usid)

O conteúdo arquivo será tipo este aqui (com mais algumas informações):

Code: Select all

Nome do host:                              DESKTOP-XCV32CB
Nome do sistema operacional:               Microsoft Windows 10 Pro
VersÆo do sistema operacional:             10.0.18362 N/A compila‡Æo 18362
Fabricante do sistema operacional:         Microsoft Corporation
Configura‡Æo do SO:                        Esta‡Æo de trabalho aut“noma
Tipo de compila‡Æo do sistema operacional: Multiprocessor Free
Propriet rio registrado:                   FULANO
Organiza‡Æo registrada:                    
Identifica‡Æo do produto:                  00338-10004-00001-AB241
Data da instala‡Æo original:               05/03/2020, 16:54:46
Tempo de Inicializa‡Æo do Sistema:         25/05/2020, 08:49:55
Fabricante do sistema:                     SAMSUNG ELECTRONICS CO., LTD.
Modelo do sistema:                         300E5EV/300E4EV/270E5EV/270E4EV/2470EV
Tipo de sistema:                           x64-based PC
Processador(es):                           1 processador(es) instalado(s).
                                           [01]: Intel64 Family 6 Model 58 Stepping 9 GenuineIntel ~2400 Mhz
VersÆo do BIOS:                            Phoenix Technologies Ltd. P07RBD, 23/10/2013
Pasta do Windows:                          C:\Windows
Pasta do sistema:                          C:\Windows\system32
Inicializar dispositivo:                   \Device\HarddiskVolume1
Localidade do sistema:                     pt-br;Portuguˆs (Brasil)
Localidade de entrada:                     pt-br;Portuguˆs (Brasil)

Então o que você tem que fazer é selecionar algumas "palavras" dessas (pelo menos 5 e não selecione elas dos títulos é claro. Cada "palavra" pode conter espaços). Essas palavras devem ser suficientes para você identificar a máquina do cliente. Por exemplo, do arquivo acima eu selecionei estas:

Code: Select all

FULANO
SAMSUNG ELECTRONICS
300E5EV/300E4EV/
P07RBD
05/03/2020, 16:54:46

:arrow: Veja que estas palavras contém basicamente: o modelo do notebook, o nome do usuário, o fabricante do notebook, um código da versão da BIOS e a data/hora de instalação do windows. Não precisa ser o código completo, mas é importante ser uma parte boa. Eu escolhi exatamente essas "palavras" porque elas se referem ao hardware do computador, que dificilmente será trocado pelo cliente. Além disso, é praticamente impossível tudo isso se repetir na máquina do amigo dele ou em outra máquina qualquer.

Agora vamos ao segundo script.

O script abaixo é o que ficará com você (ou seja, você NÃO vai enviar pro cliente nunca). Não precisa nem compilar ele e nem precisa ter tela, já que é você que vai operar. Ele basicamente transforma uma string (mais uma data de validade que você escolher) em uma chave criptografada. Isso é feito através de um algoritmo criptográfico ridiculamente simples que eu não recomendo o uso, pois é somente para exemplo (simplesmente peguei as palavras, criei uma lista separada por |, colei a data no final da string, e depois aumentei o código ASCII de cada letra da string final em 1).

Code: Select all

String_Para_Encriptar := "FULANO|SAMSUNG ELECTRONICS|300E5EV/300E4EV/|P07RBD|05/03/2020, 16:54:46" ; ESCREVA AQUI AS PALAVRAS ESCOLHIDAS DO PC ALVO !!
Data_De_Validade := "20200531" ; Formato AAAAMMDD    (ano com quatro dígitos, seguido de mês com 2 dígitos, seguido de dia com 2 dígitos. Zeros devem estar presentes em caso de dias e meses menores que 10).
NOVA_CHAVE := Criptografar(String_Para_Encriptar, Data_De_Validade)
Clipboard := NOVA_CHAVE
msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%NOVA_CHAVE% `n`nA chave foi copiada.
Return


Criptografar(String, Data)
{
	DADOS := CHAVE . "|" . Data
	Loop, Parse, DADOS
	{
		Nova_Letra := Asc(A_LoopField) + 1
		Nova_String := Nova_String . Chr(Nova_Letra)
	}
	Return Nova_String
}
Return

A chave gerada será então enviada ao cliente para que possa efetuar a validação do seu sistema.

Para validar o sistema, o script do cliente (aquele primeiro deste post), através da rotina do botão "VALIDAR" vai descriptografar a chave (neste caso diminuir 1 no código ANSI de cada letra) e depois vai interpretar as informações da seguinte forma:

Primeiro o script vai repetir a rotina de obtenção daquele arquivo de ID da máquina (embora apenas para uma variável).
Depois, vai cortar os campos da chave criptografada e procurar uma correspondência exata para cada um no arquivo de ID atual da máquina (exceto a data de validade, é claro).
Se as palavras estiverem todas lá, ele vai então comparar o último campo (a data da validade) com a data atual do computador. Se a data for menor que a atual, ele valida.

:arrow: Você pode (e deve) melhorar essa rotina de comparação da data, para que não fique refém do usuário mudar a data do computador. Tem alguns tópicos discutindo opções (como pegar a data atual online ou usar o registro para gravar sempre a data máxima de execução do script, de modo a poder conferir se a data do computador é maior que ela).

:arrow: Mas não se esqueça que este exemplo é somente para uma discussão didática, não estou em nenhuma hipótese indicando você a usar essa mesma rotina para um software comercial. Você pode incrementar este código de muitas maneiras para melhorar a sua segurança e eu não me responsabilizo por uma quebra deste algoritmo simples ok :beer:

O algoritmo de criptografia utilizado neste exemplo foi a Cifra de César, e como disse reiteradamente, ele é um dos mais simples de quebrar. Serve apenas para discussões didáticas.

Re: Deletar Linhas Do Script

Post by Hologram » 26 May 2020, 13:18

Hologram wrote:
25 May 2020, 19:36
Validação por chaves mensais
Poderia Dar Um Exemplo De Como Fazer Uma?
pode estar atrelada a vários elementos individualizadores
Poderia Dar Um Exemplo, De Como Fazer O Script Rodar Somente Em Determinada Maquina?

:D
@Up

Re: Deletar Linhas Do Script

Post by Hologram » 25 May 2020, 19:36

Validação por chaves mensais
Poderia Dar Um Exemplo De Como Fazer Uma?
pode estar atrelada a vários elementos individualizadores
Poderia Dar Um Exemplo, De Como Fazer O Script Rodar Somente Em Determinada Maquina?

:D

Re: Deletar Linhas Do Script

Post by Gio » 25 May 2020, 11:35

Bom dia Hologram.

Não recomendo essa via para a solução do problema. Quando você compila um script (especialmente quando usa o MPress ou outro packer), ele perde seu formato de texto e se torna código de máquina (praticamente ilegível) dentro de um arquivo executável (.exe), que é um formato de arquivo cheio de metadados, checksums e âncoras de posições, o que significa que não é muito viável tentar ler informações e modificá-las diretamente do código de um arquivo executável (e ainda sem corrompê-lo no processo). Isso poderia até ser feito, mas somente através de uma engenharia reversa muito criteriosa e trabalhosa.

Além do mais, mesmo que você conseguisse implementar essa rotina, o que impediria o usuário de fazer uma cópia desse arquivo com as licenças ainda válidas de antemão? Afinal, você vai ter que enviar isso por email ou disponibilizar um link para download certo? O que o impediria de baixar de novo ou mesmo de copiar de novo da pasta download para a pasta final?

:arrow: Existem algumas estratégias usadas comercialmente para validação de licenças de software e elas têm uma relação de facilidade de implementação x segurança muito mais vantajosa. Eis algumas:

1. Validação por chaves mensais: Se você for cobrar uma mensalidade pelo uso do software, pode enviar uma chave criptografada para o cliente a cada mês quando ele efetuar o pagamento. Essa chave validará o software para o mês atual e pode estar atrelada a vários elementos individualizadores (usuário e senha OU no seu caso que está receoso de ele compartilhar o usuário e senha, pode usar a configuração do computador do cliente - que teria de ser coletada no início da prestação do serviço é claro) além de ser normalmente criptografada (para que o usuário não consiga gerar ele próprio uma chave válida) e mandaria os dados para que você pudesse gerar a chave.

:arrow: Para encontrar dados individualizadores da máquina do cliente, você pode usar o script abaixo. Este script foi escrito pelo usuário Jaco0646 e você pode encontrá-lo aqui. No caso, o usuário rodaria isso na máquina dele (poderia ser um botão "Gerar ID" na tela de login do seu script mesmo).

Code: Select all

RunWait, %comspec% /c systeminfo > tmpFile,,Hide
FileRead, info, tmpFile
FileDelete, tmpFile
Gui, Font,,Lucida Console
Gui, Add, Edit,,%info%
Gui, Show
return

GuiClose:
 ExitApp

2. Validação online: Você também pode fazer o programa procurar uma licença válida online em qualquer endereço da web onde somente você tenha o controle das informações. Normalmente, isso é feito através de um servidor próprio, mas se você estiver com pouca grana pode usar até mesmo um repositório qualquer de texto público onde somente você possa alterar o conteúdo (verifique sempre os termos de uso antes).

Deletar Linhas Do Script

Post by Hologram » 23 May 2020, 14:27

Hop! Desculpe reviver o tópico, mas poderia me orientar sobre algumas linhas pra entender melhor o script?
Eu fui testar o script novamente e por algum motivo nao esta funcionando :( creio que estou errando algo, por isso quero entender melhor oq ta acontecendo nele

Code: Select all

Clipboard := NOVA_CHAVE
Essa linha foi criada meramente por conforto né? não esta fazendo nada no script certo?

Code: Select all

msgbox, 0, Aviso, Chave gerada com sucesso: `n`n%NOVA_CHAVE% `n`nA chave foi copiada.
Os 2 " 'n' " servem para fazer 1 quebra de linha?

Code: Select all

DADOS := CHAVE . "|" . Data
De onde veio essa 'CHAVE'?, não seria a variavel 'String' criada na funçao?

Code: Select all

Loop, Parse, DADOS
Oq significa 'Parse'?

Code: Select all

Nova_Letra := Asc(A_LoopField) + 1
Oq significa 'Asc(A_LoopField) + 1'?

Code: Select all

Chr(Nova_Letra)
Oq significa Chr?

Top