Pergunta

Alguém conhece um bom obsfucador de código para Perl?Estou sendo solicitado a analisar a opção de ofuscar o código antes de liberá-lo para um cliente.Eu sei que o código obsfucado ainda pode sofrer engenharia reversa, mas essa não é nossa principal preocupação.

Alguns clientes estão fazendo pequenas alterações no código-fonte que fornecemos a eles e isso nos dá pesadelos quando algo dá errado e temos que consertar, ou quando lançamos um patch que não funciona com o que eles mudaram.Portanto, a intenção é apenas fazer com que seja difícil para eles fazerem suas próprias alterações no código (eles não deveriam estar fazendo isso de qualquer maneira).

Foi útil?

Solução

Já passei por esse caminho antes e é um pesadelo absoluto quando você tem que trabalhar em código "ofuscado", porque isso aumenta tremendamente os custos ao tentar depurar um problema no servidor do cliente quando você, o desenvolvedor, não consegue ler o código .Você acaba com "desofuscadores", copiando o "código real" para o servidor do cliente ou qualquer um dos vários outros problemas que se tornam um verdadeiro incômodo de manter.

Entendo de onde você vem, mas parece que a gerência tem um problema e está esperando que você implemente uma solução escolhida, em vez de descobrir qual é a solução correta.

Nesse caso, parece que é realmente uma questão de licenciamento ou contratual.Deixe que eles tenham o código-fonte aberto, mas faça parte da licença que quaisquer alterações enviadas devem retornar para você e ser aprovadas.Ao enviar patches, verifique as somas md5 de todo o código e, se não corresponder ao esperado, eles violam a licença e serão cobrados de acordo (e deve ser uma taxa muito, muito mais alta).(Lembro-me de uma empresa que nos permitiu ter o código de código aberto, mas deixou claro que, se mudássemos alguma coisa, "comprávamos" o código por US$ 25.000 e eles não eram mais responsáveis ​​por quaisquer correções de bugs ou atualizações, a menos que comprássemos um Nova Licença).

Outras dicas

Não.Apenas não faça isso.

Escreva no contrato (ou revise o contrato se for necessário) que você não é responsável pelas alterações feitas no software.Se eles estão estragando seu código e esperando que você o conserte, você tem problemas de cliente que não serão resolvidos ofuscando o código.E se você ofuscá-lo e eles encontrarem um problema real, boa sorte em fazer com que eles relatem com precisão o número da linha, etc., no relatório de bug.

Por favor, não faça isso.Se você não deseja que as pessoas alterem seu código Perl, coloque-o sob uma licença apropriada e aplique essa licença.Se as pessoas alterarem seu código quando você licenciar e disserem que não deveriam fazer isso, então não será problema seu quando suas atualizações não funcionarem mais com a instalação.

Ver A resposta do perlfaq3 para "Como posso ocultar a fonte dos meus programas Perl? para mais detalhes.

Parece que seu principal problema são os clientes modificando o código, o que dificulta seu suporte.Eu sugiro que você solicite somas de verificação (md5, sha, etc) de seus arquivos quando eles vierem até você para obter suporte e, da mesma forma, verifique as somas de verificação dos arquivos durante a correção.Por exemplo, você pode pedir ao cliente para fornecer a saída de um programa fornecido que passa pela instalação e faz a soma de verificação de todos os arquivos.

Em última análise, eles têm o código, então podem fazer o que quiserem com ele.O melhor que você pode fazer é aplicar suas licenças e garantir que você ofereça suporte apenas a códigos não modificados.

Neste caso, ofuscar é a abordagem errada.

Ao liberar o código para o cliente, você deve manter uma cópia do código enviado (em disco ou preferencialmente em seu controle de versão como uma tag/branch).

Então, se o seu cliente fizer alterações, você poderá comparar o código que ele possui com o código que você enviou e identificar facilmente as alterações.Afinal, se eles sentirem necessidade de fazer alterações, há um problema em algum lugar e você deve corrigi-lo na base de código mestre.

Outra alternativa para converter seu programa em binário é o programa gratuito PAR-Packer ferramenta ligada CPAN.Existem até filtros para ofuscação de código, embora, como outros já disseram, isso seja possivelmente mais problemático do que vale a pena.

Concordo com as sugestões anteriores.

No entanto, se você realmente quiser, você pode pesquisar PAR e/ou Filtro::Cripto Módulos CPAN.Você também pode usá-los juntos.

Usei o último (Filter::Crypto) como uma forma realmente leve de "proteção" quando enviamos nosso produto em mídia óptica.Isso não "protege" você, mas impedirá 90% das pessoas que desejam modificar seus arquivos de origem.

Esta não é uma sugestão séria, no entanto, dê uma olhada em Acme::Buffy.

Pelo menos vai iluminar o seu dia!

Uma alternativa à ofuscação é converter seu script em binário usando algo como Kit de desenvolvimento Perl do ActiveState.

Estou executando um sistema operacional Windows e uso perl2exe da IndigoSTAR.É improvável que o arquivo .EXE resultante seja alterado no local.

Como outros já disseram, "como faço para ofuscá-lo" é a pergunta errada."Como faço para impedir que o cliente altere o código" é o correto.

A soma de verificação e as ideias de contrato são boas para evitar os "problemas" que você descreve, mas se o custo para você é a dificuldade de implementar atualizações e correções de bugs, como seus clientes estão fazendo alterações que não passam no teste? conjunto de testes abrangente?Se eles são capazes de fazer essas alterações (ou pelo menos fazer uma alteração que expresse o que desejam que o código faça), por que não simplesmente facilitar/automatizar a abertura de um ticket de suporte e o upload do patch?O cliente está sempre certo sobre o que o cliente deseja (eles podem não ter ideia de como fazer isso "da maneira certa", mas é por isso que estão pagando você.)

Um motivo melhor para querer um ofuscador seria a implantação de desktops no mercado de massa, onde você não tem todos os clientes com um contrato permanente.Nesse caso, algo como PAR - qualquer coisa que empacote a lógica de criptografia/ofuscação em um binário compilado é o caminho a seguir.

Como várias pessoas já disseram:não.

É praticamente implícito, dada a natureza do intérprete Perl, que qualquer coisa que você faça para ofuscar o Perl deve ser desfazível antes que o Perl coloque as mãos nele, o que significa que você precisa deixar o script/binário de desofuscação onde o intérprete (e, portanto, seu cliente) pode encontrá-lo :)

Resolva o problema real:somas de verificação e/ou uma licença devidamente redigida.E a equipe de suporte foi treinada para dizer 'você mudou?estamos invocando a cláusula 34b de nossa licença, e isso custará US$ X.000 antes de tocá-la'....

Além disso, leia por que-devo-usar-ofuscação para uma resposta mais geral.

Gostaria apenas de convidá-los para minha árvore SVN em seu próprio branch para que eles possam fornecer alterações e eu possa vê-las e integrar suas alterações em minha árvore de desenvolvimento.

Não lute contra isso, abrace-o.

Como diz Ovídio, é um problema contratual e social.Se alterarem o código, invalidam a garantia.Cobrar muito para consertar isso, mas ao mesmo tempo, dê-lhes um canal onde possam sugerir mudanças.Além disso, veja o que eles desejam alterar e inclua isso na configuração, se puder.Eles têm algo que querem fazer e, até que você satisfaça isso, continuarão tentando contorná-lo.

Em Dominando Perl, falo um pouco sobre derrotar obfucadores.Mesmo se você fizer coisas como criar nomes de variáveis ​​sem sentido e coisas do gênero, módulos como B::Departar e B::Desofuscar, junto com ferramentas Perl como Perl::Arrumado, torna muito fácil para uma pessoa qualificada e motivada obter sua fonte.Você não precisa se preocupar tanto com os incompreensíveis e desmotivados porque eles não sabem o que fazer com o código de qualquer maneira.

Quando converso com os gestores sobre isso, passamos pela análise normal de custo-benefício.Há todo tipo de coisa que você poderia fazer, mas não muito disso custa menos do que o benefício que você obtém.

Boa sorte,

Outra sugestão não séria é usar Acme::Bleach, isso deixará seu código muito limpo ;-)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top