LucasMTA

protecao script

Recommended Posts

Posted (edited)

Como faço para proteger meus scripts para um servidor expecifico "ip"

Edited by LucasMTA

Share this post


Link to post
Posted (edited)

 

11 minutes ago, #DeltaSCR said:

@Jonas^ Achei interessante essa proteção... Pode me explicar mais como ela funciona?

Bom pra ser sincero eu tentei utilizar esse modo e não consegui, mas acho que a melhor maneira é usar um element-data e verificar se ele é true or false por meio de um export, resumindo:

Você vai ter um resource principal que ira verificar todos os outros resouces, no caso você vai exportar a função do resource principal nos outros resouces pra verificar se ele esta sendo executado no ip cadastrado ou não.

EDIT: Pedi pro meu professor @DNL291 te explicar melhor como funciona uehuheuea

Edited by Jonas^
  • Like 1

Share this post


Link to post
Just now, Jonas^ said:

 

Bom pra ser sincero eu tentei utilizar esse modo e não consegui, mas sei que a melhor maneira é usar um element-data e verificar se ele é true or false por meio de um export, resumindo:

Você vai ter um resource principal que ira verificar todos os outros resouces, no caso você vai exportar a função do resource principal nos outros resouces pra verificar se ele esta sendo executado no ip cadastrado ou não.

Interessante, vou tentar utilizá-lo depois...

Share this post


Link to post
Posted (edited)
14 minutes ago, #DeltaSCR said:

@Jonas^ Achei interessante essa proteção... Pode me explicar mais como ela funciona?

A função fetchRemote ali vai obter o IP do servidor, daí no caso se você quiser verificar se o IP é o mesmo que um IP especificado faz uma verificação if SERVER_IP == seu_IP then.

Edit: com algumas modificações extras é possível fazer uma proteção no resource, cancelando o evento onResourceStart

Edited by DNL291

Share this post


Link to post

Meu sistema de proteção por IP também é por meio desse fetchRemote. Ele é feito por um único resource específico e dai os resources que possuem bloqueio verificam o IP através de um export desse resource. Se houver qualquer problema (o resource não existir, ou não conseguir retornar o IP por falta de permissão), o resource cancela sua própria ativação.

E também é claro, tudo deve estar compilado.

Share this post


Link to post
Posted (edited)
1 hour ago, Lord Henry said:

Meu sistema de proteção por IP também é por meio desse fetchRemote. Ele é feito por um único resource específico e dai os resources que possuem bloqueio verificam o IP através de um export desse resource. Se houver qualquer problema (o resource não existir, ou não conseguir retornar o IP por falta de permissão), o resource cancela sua própria ativação.

E também é claro, tudo deve estar compilado.

É uma proteção boa, mas nunca é bom confiar cegamente nesses sistemas. Se alguém conseguir o código mesmo que ele esteja compilado, pode conseguir executar o código protegido. No caso do onResourceStart + cancelEvent por exemplo, dá pra burlar isso.

Edited by DNL291

Share this post


Link to post

Seria bom também uma validação das funções que utilizará (debug.getinfo), evitando chamar funções que foram sobrescritas...

function fetchRemote(...)
	for _, param in ipairs(arg) do
		if (type(param) == "function") then
			return param("127.0.0.1") -- coloco o IP que a validação quer
		end
	end
end

 

Share this post


Link to post

@DNL291 a única maneira de burlar meu sistema é o cara conseguir descompilar o resource da proteção por IP e o resource bloqueado, para conseguir ter acesso as senhas de desbloqueio que são passadas de maneira criptografada através do export. Se o cara conseguir ser hacker o suficiente para descriptografar os resources, dai realmente não há o que fazer.

Também não adianta o cara tentar dar output nos valores retornados pelo export, pois como eu disse, as senhas são passadas criptografadas. O cara pode ser esperto e tentar criar um resource falso que sempre retorna um IP válido, mas mesmo assim vai faltar as senhas de cada resource.

Share this post


Link to post

Por questões de overwrite como já mencionado, você não tem garantia que o resource não será ativado (nos casos que não possua permissão). Uma proteção adicional é manter todo o seu código no escopo da validação:

-- código inseguro
addEventHandler("onResourceStart",resourceRoot,
	function()
		local ip,senha = exports.validar:autenticar()
		if (ip == "127.0.0.1" and descriptografar(senha) == "aljkdkhje") then
			-- código "seguro"
		else return cancelEvent()
		end
	end
)

Dependendo de como foi feito e sabendo mais/menos o funcionamento do sistema de segurança, dá pra bolar algo utilizando algumas funções do debug para tentar espiar funções/variáveis e talvez até obter a chave da descriptografia.

Enfim, nada é totalmente seguro... compilando e colocando em uma host confiável já dá pro gasto pra grande maioria, em casos mais extraordinários (scripts fodas) é que vale tal esforço.

Share this post


Link to post
Posted (edited)

Como assim overwrite? A questão da falta de permissão vc se refere a quais permissões?

E como o cara vai dar debug nas variáveis do meu script se ele é criptografado? Quer dizer, ele precisa saber os nomes das variáveis pra poder chamá-las, certo?

Edited by Lord Henry

Share this post


Link to post
Posted (edited)

overwrite acho que ele quis dizer questões de cancelar o inicio de algum script de proteção compilado, mas logicamente se não tiver uma noção de como é mais ou menos feito o código acredito que seja praticamente impossível burlar isso.

Edited by Jonas^

Share this post


Link to post

Cancelar a própria ativação não exige nenhuma permissão especial.

Share this post


Link to post
2 hours ago, Lord Henry said:

Como assim overwrite?

overwrite = sobrescrever… no nosso caso, funções.

Você usa onResourceStart e cancelEvent() na proteção né ? É possível que alguém sobrescrever o addEventHandler e não faça nada quando for onResourceStart, ou seja, não vai rodar a função do evento, sendo assim, ele vai “pular” sua verificação+cancelEvent():

_addEventHandler = addEventHandler
function addEventHandler(eventName, attachedTo, handlerFunction, getPropagated, priority)
	if (eventName ~= "onResourceStart") then
		getPropagated = getPropagated or true
		priority = priority or "normal"
		_addEventHandler(eventName, attachedTo, handlerFunction, getPropagated, priority)
	end
end
2 hours ago, Lord Henry said:

A questão da falta de permissão vc se refere a quais permissões?

Falta de permissão = alguém conseguiu ilegalmente seus resources e esta tentando ativar. A proteção sua então vai considerar que ele não tem permissão e então cancelar o ativamento do resource... Realmente ficou confuso essa questão de permissão, mas se trata de terceiros tentando utilizar seus resources.

2 hours ago, Lord Henry said:

E como o cara vai dar debug nas variáveis do meu script se ele é criptografado? Quer dizer, ele precisa saber os nomes das variáveis pra poder chamá-las, certo?

O script pode estar compilado, porém no mesmo resource eu posso adicionar um script malicioso que de certa forma conseguiria “monitorar” a execução do compilado, visto que estariam em um mesmo “ambiente”.

Dá para ver o nome das variáveis com:
debug.getlocal / debug.getupvalue / _G

Obs: Estou trazendo questões teóricas, nunca utilizei na prática, ou seja ->  Certeza que vai funcionar ? R: Não. (mas deveria!)

  • Like 1

Share this post


Link to post
Posted (edited)

@Lord Henry Não é necessário descompilar pra conseguir executar o código, e o MaligNos já explicou o porquê. Faça um teste você mesmo.

Aqui um exemplo:

function enterVehicle ( player, seat, jacked )
	cancelEvent( true )
	outputChatBox ( "Veiculos bloqueados!", player )
end
addEventHandler ( "onVehicleStartEnter", getRootElement(), enterVehicle )

Ok, esse código vai impossibilitar o jogador de entrar em qualquer veículo.

Agora, eu crio outro script separado, exatamente assim:

_cancelEvent = cancelEvent
function cancelEvent()
	return _cancelEvent(false)
end

Resultado, a função cancelEvent lá dentro do outro código será sempre chamada dessa forma: cancelEvent(false) mesmo que outro valor seja passado.

Agora, impedindo essa "interferência externa":


local _cancelEvent = cancelEvent
local function cancelEvent( ... )
	return _cancelEvent( ... )
end

function enterVehicle ( player, seat, jacked )
	cancelEvent( true )
	outputChatBox ( "Veiculos bloqueados!", player )
end
addEventHandler ( "onVehicleStartEnter", getRootElement(), enterVehicle )

Aquele wrapper (assim que também é conhecido) no outro script não vai mais mudar nada nesse que o cancelEvent está local.

--

Até mesmo a variável que armazena a chave de proteção está vulnerável - isso porque existe a biblioteca Lua debug (além de _G), já mencionados. E essas funções estão habilitadas no MTA.

Meio fora do assunto, mas há alguns anos atrás, um membro do fórum tinha conseguido obter a chave de encriptação utilizada internamente no MTA (procurei esse post, mas perece que já foi removido).

Edited by DNL291
  • Like 1

Share this post


Link to post
Posted (edited)

Hum... Os caras cancelam a função que cancela, lol '-'

10 hours ago, DNL291 said:

Até mesmo a variável que armazena a chave de proteção está vulnerável - isso porque existe a biblioteca Lua debug (além de _G), já mencionados. E essas funções estão habilitadas no MTA.

E existe alguma forma de cancelar a utilização delas? Da mesma forma que fizeram pra cancelar a função cancelEvent?

Edit: Na real não se trata de cancelar as funções e sim torná-las inutilizáveis.

Edited by Lord Henry

Share this post


Link to post
10 hours ago, DNL291 said:

Agora, impedindo essa "interferência externa":


local _cancelEvent = cancelEvent
local function cancelEvent( ... )
	return _cancelEvent( ... )
end

function enterVehicle ( player, seat, jacked )
	cancelEvent( true )
	outputChatBox ( "Veiculos bloqueados!", player )
end
addEventHandler ( "onVehicleStartEnter", getRootElement(), enterVehicle )

Aquele wrapper (assim que também é conhecido) no outro script não vai mais mudar nada nesse que o cancelEvent está local.

Interessante! Confesso que estava tentando pensar em algo do tipo... mas no final das contas não daria no mesmo https://i.imgur.com/x0FE5Xq.png ?

 

Share this post


Link to post

Pois é... Uma função local se sobrepõe a uma global com mesmo nome?

 

Share this post


Link to post
13 minutes ago, Lord Henry said:

E existe alguma forma de cancelar a utilização delas? Da mesma forma que fizeram pra cancelar a função cancelEvent?

Edit: Na real não se trata de cancelar as funções e sim torná-las inutilizáveis.

Imagino eu, que um debug = nil funcione.

Mas se o cara salvar em outra variável antes de você definir nil, acredito que conseguirá utilizar do mesmo modo kkk

teste = debug
debug = nil
print(teste) -- lib ok

 

Share this post


Link to post
Posted (edited)
10 hours ago, DNL291 said:

a variável que armazena a chave de proteção está vulnerável

Mesmo se ela for local? Pois teoricamente não daria pra lê-la fora de seu escopo, em outro script.

Edited by Lord Henry
Esqueça aquela ideia anterior, é fácil burlar.

Share this post


Link to post
19 minutes ago, Lord Henry said:

Esqueça aquela ideia anterior, é fácil burlar.

O principal mesmo é buscar manter sigilo total de como foi feito o sistema de proteção, ninguém burla nada sem antes saber como funciona. Você analisando o código, "facilmente" vê um jeito de burla-lo, agora um script criptografado, teria que ralar muito para descobrir um jeito.

Share this post


Link to post
Posted (edited)

A ideia que eu apaguei, era de verificar o número de caracteres no meta.xml. Se for diferente do número de caracteres que o desenvolvedor deixou programado, impede a ativação do resource pois detecta que "houve alteração no meta". Mas é fácil burlar, só o cara substituir os nomes e depois fazer as alterações de modo que fique com exatamente o mesmo número de caracteres, incluindo a modificação. Dai burlaria o sistema de novo.

Edited by Lord Henry
Esqueci de 1 vírgula.

Share this post


Link to post
2 hours ago, Lord Henry said:

Mesmo se ela for local? Pois teoricamente não daria pra lê-la fora de seu escopo, em outro script.

Realmente quando trabalha com funções/variáveis locais, complica 100%, teria que usar setfenv (função desabilitada no MTA por questões de segurança). Mas tem que ser ambos locais, pois se uma função global utilizar uma variável local, daria para pegar com getupvalue.

-- script A
local teste = "oie"
function testeFunc()
  if (teste) then end
end

-- script B
local i = 1
while true do
  local nome, val = debug.getupvalue(testeFunc, i)
  if not nome then break end
  print(nome, val) -- teste  oie
  i = i + 1
end

 

Share this post


Link to post
Posted (edited)
3 hours ago, MaligNos said:

Interessante! Confesso que estava tentando pensar em algo do tipo... mas no final das contas não daria no mesmo https://i.imgur.com/x0FE5Xq.png ?

 

Não sei se entendi bem, mas no memento em que eu crio aquela função local, isso vai tornar impossível modifica-lá por outro script sobrescrevendo, ela estará no mesmo escopo, no caso, no próprio script, será como uma função cancelEvent que não tem relação com das outras.

3 hours ago, Lord Henry said:

Mesmo se ela for local? Pois teoricamente não daria pra lê-la fora de seu escopo, em outro script.

Também dá, estando local ela só vai estar disponível no mesmo código mas ainda dá pra obtê-la com uma função Lua.

4 hours ago, Lord Henry said:

E existe alguma forma de cancelar a utilização delas? Da mesma forma que fizeram pra cancelar a função cancelEvent?

Proteger desses métodos que mostramos aqui sim, nunca fiz algo do tipo mas você pode tentar fazendo uma versão que abrange todas funções do código e que tornam elas inacessíveis por funções sobrescritas (anulando variável/função na tabela Lua _G por exemplo), Ou utilizar loadstring + pcall para executar o trecho do código a ser protegido.

Você também pode tentar fazer o código em seu próprio "ambiente", será mais fácil se você já tem uma noção de metatables + setfenv e outras demais funções.

Obs: Também tem esta função do MTA que também pode vazar informações do código: https://wiki.multitheftauto.com/wiki/AddDebugHook (eu nunca testei então não sei dizer o quanto ela é eficaz).

 

Edit

3 hours ago, MaligNos said:

Imagino eu, que um debug = nil funcione.

Mas se o cara salvar em outra variável antes de você definir nil, acredito que conseguirá utilizar do mesmo modo kkk


teste = debug
debug = nil
print(teste) -- lib ok

 

Será que ainda dá pra acessar debug pela tabela Lua _G? Aí está algo a se testar...

Edit²

1 hour ago, MaligNos said:

teria que usar setfenv (função desabilitada no MTA por questões de segurança)

Na verdade essa função pode ser utilizada no MTA (isso até onde eu sei).

--

Desculpem o excesso de quotes 9_9

Edited by DNL291
  • Haha 1

Share this post


Link to post

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.