Pergunta

Eu estou tentando escrever um programa em conjunto e fazer o executável resultante como menor possível . Algumas das coisas que eu estou fazendo requer chamadas API do Windows para funções como WriteProcessMemory. Eu tive algum sucesso com chamando essas funções, mas depois de compilar e ligar, o meu programa sai na faixa de 14-15 KB. (De uma fonte de menos de 1 KB) eu estava esperando muito, muito menos do que isso.

Eu sou muito novo para fazer as coisas de baixo nível como este, então eu realmente não sei o que precisaria ser feito para tornar o programa mais pequeno. Eu entendo que o formato exe em si leva-se um pouco de espaço. Nada pode ser feito para minimizar isso?

Eu devo mencionar que eu estou usando NASM e GCC, mas eu posso facilmente mudar se isso iria ajudar.

Foi útil?

Solução

PE minúsculos por um monte de dicas e truques que você pode usar para reduzir o tamanho final do seu executável. Esteja avisado que algumas das técnicas mais tarde nesse artigo são extremamente frágeis.

Outras dicas

O alinhamento seção padrão para a maioria dos arquivos de PE é 4K para se alinhar com o layout de memória do sistema natural. Se você tem uma seção .data, .text e .resource - que é 12K já. A maior parte dele será 0 e um desperdício de espaço.

Existem algumas coisas que podem fazer para minimizar este desperdício. Em primeiro lugar, reduzir o alinhamento seção para 512 bytes (não sei as opções necessárias para nasm / gcc). Em segundo lugar, fundir as seções para que você só tem uma única seção .text. Isso pode ser um problema embora para máquinas modernas com o NX bit ligado. Esse recurso de segurança impede a modificação das seções executáveis ??de código a partir de coisas como vírus.

Há também uma série de ferramentas de compressão PE lá fora, que irá compactar o PE e descompactá-lo quando executado.

Eu sugiro usar o Dumpbin utilidade (ou objdump do GNU) para determinar o que leva mais espaço. Pode ser arquivos de recursos, enormes variáveis ??globais ou algo parecido.

FWIW, os mais pequenos programas que eu posso montar usando ML ou ML64 são da ordem de 3kb. (Isso é apenas dizendo Olá mundo e sair.)

Dê-me um pequeno programa C (não C ++), e eu vou lhe mostrar como fazer um ko .exe 1 com ele. O menor tamanho do executável que eu recomendo é 1K, porque ele vai deixar de funcionar em algumas janelas se não é, pelo menos deste tamanho.

Você simplesmente tem que jogar com vinculador alterna para fazer isso acontecer! Um bom vinculador de fazer isso é Polink.

E se você fizer tudo na Assembléia, é ainda mais fácil. Basta ir ao fórum masm32 e você verá uma abundância de programas como este.

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