obfuscate / proteger alguns scripts

168 views
Skip to first unread message

Hamilton Lima (athanazio)

unread,
Aug 24, 2009, 9:58:25 AM8/24/09
to Lua BR
Olas,
andei investigando por alguns meses o framework Love 2D para a
construcao de jogos,
muitas features legais, etc etc =)

esbarrei na dificuldade de proteger parte do codigo, em especial
algumas que tratam de envio de pontuacao e coisas semelhantes.

alguma sugestao ?

abs

Luiz Henrique de Figueiredo

unread,
Aug 24, 2009, 10:52:55 AM8/24/09
to lua...@googlegroups.com
> esbarrei na dificuldade de proteger parte do codigo, em especial
> algumas que tratam de envio de pontuacao e coisas semelhantes.

O que você entende por "proteger"?

Hamilton Lima Jr

unread,
Aug 24, 2009, 11:30:44 AM8/24/09
to lua...@googlegroups.com
um script por exemplo que encripta os dados de pontuacao de jogo e salva em disco
ou outro script que contem um logica do jogo que se for identificada pelo jogador permite trapacear no jogo.

2009/8/24 Luiz Henrique de Figueiredo <l...@tecgraf.puc-rio.br>


> esbarrei na dificuldade de proteger parte do codigo, em especial
> algumas que tratam de envio de pontuacao e coisas semelhantes.

O que você entende por "proteger"?



--
....................
Hamilton Lima
athanazio.com
Nada é simples mas tudo é possível.

Alessandro Hecht

unread,
Aug 24, 2009, 9:16:42 PM8/24/09
to lua...@googlegroups.com
Proteger o código me parece simples, basta escolher alguma
criptografia e pronto!

-- Exemplo de leitura do seu código de pontuação.
local source_lua = decrypt("/caminho do arquivo lua")
loadstring(source_lua)()

É isso mesmo que você deseja?

2009/8/24 Hamilton Lima Jr <hamilt...@gmail.com>:

--
Abs.
Alessandro Cordeiro Hecht
----------------------------------------

Lucas Hermann Negri

unread,
Aug 24, 2009, 10:05:02 PM8/24/09
to lua...@googlegroups.com
E onde é armazenada a chave / procedimento utilizado? O que impede do
usuário refazer o mesmo processo, chamando decrypt ele mesmo? O que
impede que o usuário visualize / altere dinamicamente o programa?

É uma questão uma pouco mais complexa na minha opinião =(

2009/8/24 Alessandro Hecht <aless...@fabricadigital.com.br>:

--
http://oproj.tuxfamily.org

Alessandro Hecht

unread,
Aug 24, 2009, 10:18:15 PM8/24/09
to lua...@googlegroups.com
Não disse que escolher o algoritmo de criptografia é simples, hehehe ;)

Existem alguns módulos, basta escolher e seguir com um.


2009/8/24 Lucas Hermann Negri <kkn...@gmail.com>:

Lucas Hermann Negri

unread,
Aug 24, 2009, 10:23:37 PM8/24/09
to lua...@googlegroups.com
Sim, mas no seu exemplo a parte da aplicação que vai carregar o código
codificado precisa estar "executável" já, logo o usuário pode burlar
da mesma forma que iria burlar o script original.

2009/8/24 Alessandro Hecht <aless...@fabricadigital.com.br>:

--
http://oproj.tuxfamily.org

Andre Carregal

unread,
Aug 24, 2009, 10:24:15 PM8/24/09
to lua...@googlegroups.com
2009/8/24 Alessandro Hecht <aless...@fabricadigital.com.br>:

> Não disse que escolher o algoritmo de criptografia é simples, hehehe ;)
> Existem alguns módulos, basta escolher e seguir com um.

O problema é que não basta escolher o módulo. O Lucas tem razão em
perguntar a questão da chave... :o)

De maneira geral, você precisa garantir que a sua chave fique na parte
binária da aplicação e, utilizando esta chave, você pode então
carregar os arquivos encriptados (sejam de código ou de dados).

Note que mesmo isso não protegeria muito sua aplicação, só tornaria
ela menos aberta (o que pode ser suficiente para suas necessidades,
claro).

André

Alessandro Hecht

unread,
Aug 24, 2009, 10:37:19 PM8/24/09
to lua...@googlegroups.com
Com certeza!
Apenas escrevi um exemplo rápido de como usar o loadstring, ;)

Obs.: Não estava considerando manter seu código seguro, ou qual é a
melhor criptografia para o caso em especifico.

Hamilton Lima Jr

unread,
Aug 25, 2009, 7:05:06 AM8/25/09
to lua...@googlegroups.com
bem a chave poderia ser lida do servidor por exemplo,
talvez assim a solucao que o Alessandro propos serviria

2009/8/24 Alessandro Hecht <aless...@fabricadigital.com.br>

Alessandro Hecht

unread,
Aug 25, 2009, 8:44:01 AM8/25/09
to lua...@googlegroups.com
E quem garante a autenticação de acessar o servidor para ter acesso a chave?

Segurança é uma coisa bem séria, o meu pequeno exemplo de loadstring
não estava considerando isso...

2009/8/25 Hamilton Lima Jr <hamilt...@gmail.com>:

Luís Eduardo Jason Santos

unread,
Aug 25, 2009, 9:45:03 AM8/25/09
to lua...@googlegroups.com
Se você está usando o sistema de pacotes (via require) interceptar o
loadstring não vai adiantar muito.

Nesse caso você precisa trocar os 'loaders' -- funções que efetuam a
carga efetiva dos módulos -- por outros que possam carregar módulos
encriptados. Os loaders ficam na table package.loaders[1] e são
executados em ordem; se um loader não conseguir encontrar o módulo
desejado ele passa para o próximo.

Assim você pode encriptar todo o código ou só uma parte, sem precisar
se preocupar com o que está encriptado e o que não está em cada uso.

Por exemplo: suponha que você crie um loader que carregue arquivos lua
encriptados e o coloque na posição 2 (imediatamente depois do cache)
empurando os outros loaders para baixo. Você pode gravar seus arquivos
encriptados com a extensão .xlua e os não encriptados com a extensão
.lua

Quando você fizer [[ require 'core.logic' ]] o seu loader vai tentar
encontrar o arquivo '/core/logic.xlua' -- se não conseguir passará
para o próximo loader, que vai buscar o /core/logic.lua no caminho do
package.path

O único inconveniente desse método é que você tem que implementar
novamente a lógica de busca de arquivos do package.path, pois o Lua
não exporta essa função pra você usar do lado de fora. Tudo bem que é
uma lógica simples, mas redundância de código me dá 'coisas'.. :-)

[]s
Luís Eduardo Jason Santos

[1] http://www.lua.org/manual/5.1/pt/manual.html#pdf-package.loaders


2009/8/25 Alessandro Hecht <aless...@fabricadigital.com.br>:

Hamilton Lima (athanazio)

unread,
Aug 26, 2009, 9:05:59 AM8/26/09
to Lua BR
hummm,
o loader poderia buscar o codigo do servidor baseado na autenticacao
do usuario por exemplo,
fazendo em 2 etapas:
1. recebe chave da sessao atual do usuario, chave misturada com uma
chave conhecida no codigo binario
2. recebe codigo misturado com a chave recebida e desmistura o codigo
recebido e executa.

o que acham ?
eu acho que esta ficando complicado pra chuchu,
e poderia existir algo assim out of the box =)

On 25 ago, 10:45, Luís Eduardo Jason Santos <jasonsan...@gmail.com>
wrote:
> 2009/8/25 Alessandro Hecht <alessan...@fabricadigital.com.br>:
>
>
>
> > E quem garante a autenticação de acessar o servidor para ter acesso a chave?
>
> > Segurança é uma coisa bem séria, o meu pequeno exemplo de loadstring
> > não estava considerando isso...
>
> > 2009/8/25 Hamilton Lima Jr <hamilton.l...@gmail.com>:
> >> bem a chave poderia ser lida do servidor por exemplo,
> >> talvez assim a solucao que o Alessandro propos serviria
>
> >> 2009/8/24 Alessandro Hecht <alessan...@fabricadigital.com.br>
>
> >>> Com certeza!
> >>> Apenas escrevi um exemplo rápido de como usar o loadstring, ;)
>
> >>> Obs.: Não estava considerando manter seu código seguro, ou qual é a
> >>> melhor criptografia para o caso em especifico.
>
> >>> 2009/8/24 Lucas Hermann Negri <kknd...@gmail.com>:
>
> >>> > Sim, mas no seu exemplo a parte da aplicação que vai carregar o código
> >>> > codificado precisa estar "executável" já, logo o usuário pode burlar
> >>> > da mesma forma que iria burlar o script original.
>
> >>> > 2009/8/24 Alessandro Hecht <alessan...@fabricadigital.com.br>:
>
> >>> >> Não disse que escolher o algoritmo de criptografia é simples, hehehe ;)
>
> >>> >> Existem alguns módulos, basta escolher e seguir com um.
>
> >>> >> 2009/8/24 Lucas Hermann Negri <kknd...@gmail.com>:
>
> >>> >>> E onde é armazenada a chave / procedimento utilizado? O que impede do
> >>> >>> usuário refazer o mesmo processo, chamando decrypt ele mesmo? O que
> >>> >>> impede que o usuário visualize / altere dinamicamente o programa?
>
> >>> >>> É uma questão uma pouco mais complexa na minha opinião =(
>
> >>> >>> 2009/8/24 Alessandro Hecht <alessan...@fabricadigital.com.br>:
>
> >>> >>>> Proteger o código me parece simples, basta escolher alguma
> >>> >>>> criptografia e pronto!
>
> >>> >>>> -- Exemplo de leitura do seu código de pontuação.
> >>> >>>> local source_lua = decrypt("/caminho do arquivo lua")
> >>> >>>> loadstring(source_lua)()
>
> >>> >>>> É isso mesmo que você deseja?
>
> >>> >>>> 2009/8/24 Hamilton Lima Jr <hamilton.l...@gmail.com>:

Luiz Henrique de Figueiredo

unread,
Aug 26, 2009, 9:14:09 AM8/26/09
to lua...@googlegroups.com
> eu acho que esta ficando complicado pra chuchu,

Sim, o que voce quer fazer é complicado a menos que você saiba especificar
melhor o que quer...

Se você controla o programa que vai rodar os scripts então uma maneira
simples de ter uma boa proteção é pre-compilar os scripts que você quer
proteger usando um ldump.c modificado, que gera arquivos cuja estrutura
é diferente da atual. Você pode também mudar a ordem das instruções na
VM. Houve uma discussão sobre isso em lua-l não faz muito tempo, creio.

Reply all
Reply to author
Forward
0 new messages