Sunday 15 April 2018

0x77 binary options


Alguém tem uma idéia de como compilar estaticamente qualquer arquivo de recurso para o arquivo executável ou o arquivo de biblioteca compartilhada usando o GCC Por exemplo Id como adicionar arquivos de imagem que nunca mudam (e se o fizerem, Id tem que substituir o arquivo de qualquer maneira) e não iria querer Eles para mentir em torno do sistema de arquivos. Se isso é possível (e eu acho que é porque o Visual C para Windows pode fazer isso, também), como posso carregar os arquivos que são armazenados no próprio binário O executável analisar-se, encontrar o arquivo e extrair os dados de Talvez haja uma opção para o GCC que ainda não vi. Usando os motores de busca didnt realmente cuspir as coisas certas. Eu precisaria disso para trabalhar em bibliotecas compartilhadas e executáveis ​​ELF normais. Qualquer ajuda é apreciada Dá algo como: Para compatibilidade com outro código, você pode usar fmemopen para obter um objeto FILE regular, ou, em alternativa std :: stringstream para fazer um iostream. Std :: stringstream não é ótimo para isso e você pode naturalmente usar um ponteiro em qualquer lugar você pode usar um iterador. Se você está usando isso com automake não se esqueça de configurar BUILTSOURCES adequadamente. A coisa agradável sobre fazê-lo desta maneira é: Você começa o texto para fora, assim que pode estar no controle de versão e em remendos sensivelmente É portátil e bem definido em cada plataforma respondida Feb 1 11 em 16:04 Update Eu cresci preferir o controle John Ripleys assembly. incbin solução baseada oferece e agora usar uma variante sobre isso. Eu usei objcopy (GNU binutils) para vincular os dados binários de um arquivo foo-data. bin na seção de dados do executável: Isto dá-lhe um arquivo de objeto foo-data. o que você pode vincular em seu executável. A interface C parece algo assim, você pode fazer coisas como Se sua arquitetura de destino tem restrições especiais a respeito de onde os dados constantes e variáveis ​​são armazenados, ou você deseja armazenar esses dados no segmento. text para torná-lo se encaixar no mesmo tipo de memória Como seu código de programa, você pode jogar com os parâmetros objcopy um pouco mais. Respondeu Feb 1 11 at 16:36 good idea No meu caso não é muito útil. Mas isso é algo que eu realmente vou colocar na minha coleta de trechos. Obrigado por compartilhar este ndash Atmocreations Feb 1 11 at 18:04 It39s um pouco mais fácil de usar ld como o formato de saída está implícito lá, veja stackoverflow / a / 4158997/201725. Ndash Jan Hudec Mar 11 14 às 18:40 Você pode incorporar arquivos binários no executável usando ld linker. Por exemplo, se você tiver arquivo foo. bar, então você pode incorporá-lo no executável adicionando os seguintes comandos para ld Se você está invocando ld através de gcc, então você precisará adicionar - Wl Aqui --formatbinary informa o vinculador que o seguinte arquivo é Binário e --formatdefault retorna ao formato de entrada padrão (isso é útil se você especificar outros arquivos de entrada após o foo. bar). Então você pode acessar o conteúdo do seu arquivo de código: Há também um símbolo chamado binaryfoobarsize. Eu acho que é do tipo uintptrt, mas eu não o verifiquei. Recentemente tive a necessidade de incorporar um arquivo em um executável. Desde que eu estou trabalhando na linha de comando com gcc, et al e não com uma ferramenta RAD fantasia que faz tudo acontecer magicamente não era óbvio para mim como fazer isso acontecer. Um pouco de pesquisa na rede encontrou um hack para essencialmente cat para o final do executável e, em seguida, decifrar onde ele foi baseado em um monte de informações que eu não queria saber sobre. Parecia que deveria haver uma maneira melhor. E há, seu objcopy ao salvamento. Objcopy converte arquivos de objeto ou executáveis ​​de um formato para outro. Um dos formatos que entende é binário, que é basicamente qualquer arquivo thats não em um dos outros formatos que entende. Então, você provavelmente previu a idéia: converter o arquivo que queremos incorporar em um arquivo de objeto, então ele pode simplesmente ser vinculado com o resto do nosso código. Vamos dizer que temos um nome de arquivo data. txt que queremos incorporar no nosso executável: Para converter isso em um arquivo de objeto que podemos vincular com o nosso programa que acabamos de usar objcopy para produzir um arquivo. O: Isto diz objcopy que a nossa entrada Arquivo está no formato binário, que nosso arquivo de saída deve estar no formato elf32-i386 (arquivos de objeto no x86). A opção --binary-architecture diz ao objcopy que o arquivo de saída deve ser executado em um x86. Isso é necessário para que ld aceite o arquivo para vinculação com outros arquivos para o x86. Alguém poderia pensar que especificando o formato de saída como elf32-i386 iria implicar isso, mas não. Agora que temos um arquivo de objeto, só precisamos incluí-lo quando executarmos o vinculador: Quando executamos o resultado, obtemos a oração para a saída: Claro, eu ainda não contei a história inteira, nem mostrei o main. c. Quando objcopy faz a conversão acima, adiciona alguns símbolos de vinculador ao arquivo de objeto convertido: Após a vinculação, esses símbolos especificam o início eo fim do arquivo incorporado. Os nomes dos símbolos são formados pelo prefixo binário e acrescentando início ou fim ao nome do arquivo. Se o nome do arquivo contiver quaisquer caracteres que seriam inválidos em um nome de símbolo, eles serão convertidos em sublinhados (por exemplo, data. txt torna-se datatxt). Se você obter nomes não resolvidos ao vincular usando esses símbolos, faça um hexdump - C no arquivo de objeto e olhe para o final do despejo para os nomes que objcopy escolheu. O código para realmente usar o arquivo incorporado agora deve ser razoavelmente óbvio: Uma coisa importante e sutil a ser observada é que os símbolos adicionados ao objeto são variáveis ​​arent. Eles não contêm quaisquer dados, em vez disso, seu endereço é o seu valor. Eu declará-los como tipo char porque é conveniente para este exemplo: os dados incorporados são dados de caracteres. No entanto, você pode declará-los como qualquer coisa, como int se os dados são uma matriz de inteiros, ou como struct foobart se os dados foram qualquer matriz de foo bares. Se os dados incorporados não são uniformes, então char é provavelmente o mais conveniente: pegue seu endereço e lance o ponteiro para o tipo apropriado à medida que percorrer os dados. Respondeu Abr 1 11 em 20:39

No comments:

Post a Comment