Salamandra .NET Linker - Como funciona?
-
29-09-2020 - |
Pergunta
Eu gostaria de um passo a passo através de como a Salamandra faz o que faz?Vou incluir alguns pontos im particularmente interessado em
-
Link Demanda
O vinculador começa com a entrada de métodos (que você pode configurar), e passa recursivamente o gráfico de chamadas para ligar apenas o necessário bits de código MSIL.O código não utilizado não serão vinculadas para a montagem final.Portanto, o código torna-se mais eficiente e o tamanho do arquivo passa a ser menor.
-
Link para o Quadro de APIs
O linker é tão poderosa que até mesmo a Microsoft .NET Framework assemblies, como System.Windows.Forms.dll podem ser ligados em seu próprio país .NET assembléias.Desde que os links on demand, só a parte requerida será vinculada.Isto é muito útil para proteger o seu código, de aplicação simples de implantação e solução de problemas por depuração para o quadro próprio código.
-
Nativo Compliation
O compilador nativo converte todos os assemblies gerenciados, incluindo o sistema de assembléias, em x86 código nativo.Nenhuma instrução MSIL será enviado, sem a compilação JIT em tempo de execução.Isso fornece a melhor proteção contra desmontagem e descompilação, e ele também melhora o desempenho e o tempo de inicialização.
-
Simples e Rápido de Implantação sem completo da Microsoft .NET Framework de Instalação
O mini-implantação de ferramenta reúne o conjunto mínimo de CLR arquivos de tempo de execução e assemblagens dependentes que podem ser simplesmente copiadas para uma pasta em uma máquina de destino, e seu aplicativo é executado como se todo o framework é instalado.Desde a instalação é isolado em uma única pasta, não haverá conflitos com o futuro .Instalação de rede.Quando a ligação é utilizada para a assemblagens dependentes, que irá reduzir ainda mais o tamanho do arquivo.
-
Código De Proteção Não é um problema que nenhum dos atuais obfuscators endereço, isto é, não importa o quão boa a incompreensão é, não são chamadas de biblioteca do sistema e outras referências externas espalhadas em seu código (ver em vermelho abaixo).Uma vez que estas são chamadas de referências externas, obfuscators terá de mantê-las inalteradas.No entanto, estas referências ajudar muito a entender o código descompilado, porque eles estão bem documentados e APIs públicas.O vinculador remove ou reduz tais APIs públicas, vinculando o quadro de APIs em seu próprio código, e, portanto, torna o seu código mais difícil de se decompor depois de ofuscamento.Abaixo mostra o exemplo de código MSIL antes e depois do linker é usado.
antes:(nenhum obfuscators são capazes de mudar o código a seguir, uma vez que eles são externos APIs públicas)
IL_0000: ldarg.0
IL_0001: call instance void [System.Windows.Forms]System.Windows.Forms.Form::.ctor()
IL_0006: ldarg.0
IL_0007: newobj instance void [System.Windows.Forms]System.Windows.Forms.TextBox::.ctor()
IL_000c: stfld class [System.Windows.Forms]System.Windows.Forms.TextBox A.A::A
IL_0011: ldarg.0
IL_0012: ldfld class [System.Windows.Forms]System.Windows.Forms.TextBox A.A::A
IL_0017: call valuetype [System.Drawing]System.Drawing.Color [System.Drawing]System.Drawing.Color::get_Cyan()
IL_001c: callvirt instance void [System.Windows.Forms]System.Windows.Forms.TextBoxBase::set_BackColor(valuetype [System.Drawing]System.Drawing.Color)
IL_0021: ldarg.0
depois:(absolutamente nenhuma pista do Windows.Formas APIs são utilizadas, uma alta obstáculo para um hacker para entender isso publicitário não solicitado)
IL_0000: ldarg.0
IL_0001: call instance void a.A::.ctor()
IL_0006: ldarg.0
IL_0007: newobj instance void D.c::.ctor()
IL_000c: stfld class D.c A.A::A
IL_0011: ldarg.0
IL_0012: ldfld class f.aA.A::A
IL_0017: call valuetype a.B()
IL_001c: callvirt instance void D.c(valuetype g.e)
IL_0021: ldarg.0
Algumas dessas coisas defletor de mim, e eu estava me perguntando se alguém sabia como as coisas funcionavam?
Solução
Nativo Compliation, Simples e Rápido de Implantação sem completo da Microsoft .NET Framework de Instalação, Código De Proteção:
Eles são a compilação "YourApp" + ".NetFramework' em uma dll nativa.Isso não tem IL e sem símbolos, de modo que é muito mais difícil de engenharia reversa.
Link Demanda, Link para o Quadro de APIs:
Para manter .dll de um razoável tamanho, eles têm de deixar de fora o código morto (o código que nunca vai ser chamado) da dll.Para fazer isso eles andam a chamada árvore a partir da raiz, geralmente Main(), e apenas incluir esses métodos.Pode haver problemas com o código que está sendo chamado através de reflexão, então eu acho que eles permitem que mais de 1 raiz.