LucasMTA Posted April 23, 2019 Share Posted April 23, 2019 (edited) Como faço para proteger meus scripts para um servidor expecifico "ip" Edited April 23, 2019 by LucasMTA Link to comment
#DeltaSCR Posted April 23, 2019 Share Posted April 23, 2019 @Jonas^ Achei interessante essa proteção... Pode me explicar mais como ela funciona? Link to comment
Jonas^ Posted April 23, 2019 Share Posted April 23, 2019 (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 April 23, 2019 by Jonas^ 1 Link to comment
#DeltaSCR Posted April 23, 2019 Share Posted April 23, 2019 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... Link to comment
DNL291 Posted April 23, 2019 Share Posted April 23, 2019 (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 April 23, 2019 by DNL291 1 Link to comment
Other Languages Moderators Lord Henry Posted April 24, 2019 Other Languages Moderators Share Posted April 24, 2019 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. 1 Link to comment
DNL291 Posted April 24, 2019 Share Posted April 24, 2019 (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 April 24, 2019 by DNL291 Link to comment
[M]ister Posted April 24, 2019 Share Posted April 24, 2019 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 Link to comment
Other Languages Moderators Lord Henry Posted April 24, 2019 Other Languages Moderators Share Posted April 24, 2019 @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. 1 Link to comment
[M]ister Posted April 24, 2019 Share Posted April 24, 2019 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. Link to comment
Other Languages Moderators Lord Henry Posted April 24, 2019 Other Languages Moderators Share Posted April 24, 2019 (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 April 24, 2019 by Lord Henry 1 Link to comment
Jonas^ Posted April 24, 2019 Share Posted April 24, 2019 (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 April 24, 2019 by Jonas^ Link to comment
Other Languages Moderators Lord Henry Posted April 24, 2019 Other Languages Moderators Share Posted April 24, 2019 Cancelar a própria ativação não exige nenhuma permissão especial. Link to comment
[M]ister Posted April 25, 2019 Share Posted April 25, 2019 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!) 1 Link to comment
DNL291 Posted April 25, 2019 Share Posted April 25, 2019 @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. Edit Esse código acima na verdade não vai impedir nada pois a esse ponto já irá receber a função reescrita. -- 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). 1 Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2019 Other Languages Moderators Share Posted April 25, 2019 (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 April 25, 2019 by Lord Henry 1 Link to comment
[M]ister Posted April 25, 2019 Share Posted April 25, 2019 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 ? Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2019 Other Languages Moderators Share Posted April 25, 2019 Pois é... Uma função local se sobrepõe a uma global com mesmo nome? Link to comment
[M]ister Posted April 25, 2019 Share Posted April 25, 2019 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 Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2019 Other Languages Moderators Share Posted April 25, 2019 (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 April 25, 2019 by Lord Henry Esqueça aquela ideia anterior, é fácil burlar. Link to comment
[M]ister Posted April 25, 2019 Share Posted April 25, 2019 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. Link to comment
Other Languages Moderators Lord Henry Posted April 25, 2019 Other Languages Moderators Share Posted April 25, 2019 (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 April 25, 2019 by Lord Henry Esqueci de 1 vírgula. Link to comment
[M]ister Posted April 25, 2019 Share Posted April 25, 2019 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 Link to comment
DNL291 Posted April 25, 2019 Share Posted April 25, 2019 (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 Edited April 25, 2019 by DNL291 1 Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now