Jump to content

[M]ister

Members
  • Posts

    444
  • Joined

  • Last visited

  • Days Won

    3

Everything posted by [M]ister

  1. Sim, ele vai chamar o cancelEvent local, mas do que adianta se no corpo da função ele vai mandar ao cancelEvent externo ? Testando seu exemplo, eu consegui entrar no veículo e a função maliciosa foi executada. Testei aqui, ela some do _G também, mas apenas para o resource que efetuou a ação. Verdade, realmente pode ser utilizada! É que o uso do setfenv coincidiu com um trecho de fileRead+loadstring que acabou gerando: "Unsafe function was called".
  2. 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
  3. 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.
  4. 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
  5. 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 ?
  6. 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 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. 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!)
  7. 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.
  8. 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
  9. Você não precisa interagir com o db todo instante, você pode fazer isso apenas no start/stop do resource: start: carrega os dados do banco em uma variável/tabela/elementdata …. stop: salva no banco Utilizando o banco de dados do MTA (SQLite) ao invés do MySQL, seria bem mais eficaz também! Particularmente não acho interessante criar uma tabela para armazenar pouquíssimas informações, vai ser apenas o campo cofre consumindo uma única linha na tabela ? Eu optaria por salvar em um arquivo, ou então em uma conta “cobaia” responsável apenas por salvar informações relacionadas ao servidor, exemplo: -- Vamos supor que eu tenha uma conta "serverData" local accData = getAccount("serverData") local bancoElem = createElement("banco") addEventHandler("onResourceStart", resourceRoot, function() local cofre = getAccountData(accData, "banco.cofre") or 0 setElementData(bancoElem, "cofre", cofre) end ) addEventHandler("onResourceStop", resourceRoot, function() local cofre = getElementData(bancoElem, "cofre") setAccountData(accData, "banco.cofre", cofre ) end ) -- Para manipular o elementData em outros scripts, pode ser usado algo do tipo: print(getElementData(getElementsByType("banco")[1], "cofre")) -- obter setElementData(getElementsByType("banco")[1], "cofre", 500) -- alterar
  10. Aí está o erro, você está tentando utilizar um evento cliente: onClientResourceStart em um script do servidor. Troque por este trecho: addEventHandler("onResourceStart", resourceRoot, function() for _, player in ipairs(getElementsByType("player")) do aclpm(player) end end ) addEventHandler("onPlayerLogin", root, function() aclpm(source) end ) Aconselho dar uma olhada: https://wiki.multitheftauto.com/wiki/Scripting_Introduction#Clientside_and_Serverside_scripts https://wiki.multitheftauto.com/wiki/Depuração
  11. Na onde você está chamando a função aclpm ?
  12. Adicione aquela mesma verificação na linha 4 desse outro.
  13. Você habilitou o OOP no meta.xml ? <oop>true</oop> Não interfere (no seu caso), mas não recomendo ficar misturando trechos procedural com oop, opte por um e siga até o fim. Tente: function aclpm (thePlayer) if (thePlayer.type == "player") then local acc = thePlayer.account; if acc and not acc.guest then if ACLGroup.get("PM"):doesContainObject("user."..acc.name) then thePlayer:setData("Venda:Police.Job", true); acc:setData("Venda:Police.Job", true); end end end end addEventHandler("onElementDataChange", root, function (dataName, oldValue) if (source.type == "player" and dataName == "Venda:Police.Job") then if (source:getData(dataName)) then Boxs["Markers"]["Create"]["Skins"]:setVisibleTo(source, true); source:outputChat("Parabens! Você agora é um Policial, para saber tudo sobre a profissão(como prender, viaturas, muito mais), pressione o botão 'k'"); giveWeapon(source, 31, 5000); giveWeapon(source, 24, 5000); giveWeapon(source, 3); source:triggerEvent(getThisResource():getName()..": 3DText", root, "Seleção de Skins", Boxs["Markers"]["Create"]["Skins"]); else takeWeapon(source, 31); takeWeapon(source, 24); takeWeapon(source, 3); Boxs["Markers"]["Create"]["Skins"]:setVisibleTo(source, false); end end end )
  14. local function checkVehicleHandling() if not isElement(vehicle) then return end local flags = getVehicleHandling(vehicle)["handlingFlags"] if (bitAnd( flags, 32 ) == 32) or (bitAnd( flags, 64 ) == 64) then return true end end
  15. Observe que você colocou o timer dentro do loop (para os policiais), dessa forma você está definindo que o policial só possa receber uma denúncia a cada 10min, e não bloqueando um usuário de fazer consecutivas denúncias.
  16. @Jonas^, ele quer bloquear o usuário de fazer repetidas denúncias em tal tempo, e não o policial de recebê-las.
  17. Substitua a seguinte função no lado cliente: local tempo = false function DeltaSCR_Abrir () if tempo then return outputChatBox("*Aguarde para poder fazer outra denúncia!",255,0,0) end if DeltaSCR_Painel == false then DeltaSCR_Painel = true addEventHandler ("onClientRender", getRootElement(), DeltaSCR_DX) guiSetVisible (editDenuncia, true) guiSetVisible (editID, true) showCursor (true) tempo = true setTimer(function() tempo = false end,600000,1) end end addEvent ("DeltaSCR:Abrir", true) addEventHandler ("DeltaSCR:Abrir", getRootElement(), DeltaSCR_Abrir)
  18. Teste os dois: setFarClipDistance engineSetModelLODDistance
  19. Coloque DeltaSCR_Painel = true na função DeltaSCR_Abrir
  20. Rt function MarkerHit (hitElement) if (getElementType(hitElement) == "player" then triggerClientEvent(hitElement, "DeltaSCR:Abrir", getRootElement()) end end
  21. Porque trocou o onMarketHit pelo onPlayerMarketHit ? Assim não vai funcionar (veja aqui) Olhe na wiki quais parâmetros são passados e o que significa cada um deles.
  22. Aqui o exemplo da Wiki também não funciona, então provavelmente o erro não é com o fileCopy em si, e sim no exemplo que ele testou. Agora tá esclarecido.
  23. No exemplo do fileCopy na Wiki existe o fileCreate... É só mudar a linha ali.
  24. Use o mesmo da wiki, só que mude a linha 3: fileClose(fileCreate(filePath)) (adicionando o fileClose)
  25. Sim, já estava olhando aqui... Por isso mesmo ainda não consigo entender, só se o fileCopy dele também funciona agora.
×
×
  • Create New...