none
Como exibir hexadecimal apenas após o EntryPoint RRS feed

  • Discussão Geral

  • Olá

    Após muito ajuda, consegui um código para encontrar o OP (EntryPoint) de um arquivo.

    Uso o código a baixo para exibir TODO o hexadecimal de um arquivo:

      Dim bytes As Byte() = File.ReadAllBytes(TextBox1.Text)
            Dim hex As String() = Array.ConvertAll(bytes, Function(b) b.ToString("X2"))
            RichTextBox1.Text = String.Join("", hex).Trim.Replace(" ", "")

    Como posso exibir o código apenas a partir do entrypoint, limitando por tamanho? Ex.: 50 caracteres (ou mais) após o entrypoint?

    Desde já agradeço.

    quinta-feira, 10 de setembro de 2015 16:43

Todas as Respostas

  • Utilize BinaryReader para apontar ao offset descrito no entry point conforme:

    br.BaseStream.Seek(Endereco_EntryPoint, SeekOrigin.Begin)

    Leia os bytes em um buffer conforme:

    Dim Buffer As String
    Buffer = Encoding.UTF8.GetString(br.ReadBytes(50))

    quinta-feira, 10 de setembro de 2015 17:38
  • Olá

    E como uso o BinaryReader? Ta me dando erro

    "O processo não pode acessar o arquivo 'C:\xxxx' porque ele está sendo usado por outro processo.".

    Ficou:

      Using br As BinaryReader = New BinaryReader(File.Open(TextBox1.Text, FileMode.Open))
                br.BaseStream.Seek(EntryPoint1, SeekOrigin.Begin)
                Dim Buffer As String
                Buffer = Encoding.UTF8.GetString(br.ReadBytes(50))
                RichTextBox1.Text = Buffer.Trim.Replace(" ", "")
            End Using



    • Editado Eliseu5 quinta-feira, 10 de setembro de 2015 18:05
    quinta-feira, 10 de setembro de 2015 17:54
  • Olá

    Maniaxe, alguém?

    sexta-feira, 11 de setembro de 2015 20:42
  • O erro é claro. O arquivo está sendo usado.  Qual sua dúvida?


    ROBERTOSLJUNIOR

    sexta-feira, 11 de setembro de 2015 21:24
  • Olá

    Minha duvida é, mesmo que esteja sendo usado, não posso acessá-lo como somente leitura?

    Testei com outro arquivo e resulta um erro:

    sexta-feira, 11 de setembro de 2015 21:51
  • Você deve usar notação hexadecimal conforme &H0000641A no VB.NET, "0000641A" é interpretado como string.

    Complementando o outro post sobre Entry Point que você encerrou sem meu retorno?!?!

    No caso do UPX, você pode calcular o Entry Point utilizando a fórmula:

    Variável 1 = AddressOfEntryPoint da estrutura IMAGE_OPTIONAL_HEADER(código que postei no outro post)
    Variável 2 = VirtualAddress da estrutura IMAGE_SECTION_HEADER da seção UPX1
    Variável 3 = PointerToRawData da estrutura IMAGE_SECTION_HEADER da seção UPX1

    Endereço Entry Point = (Variável 1 - Variável 2) + Variável 3

    Nos outros packers(não parei para analisar) não vai fugir muito desta regra, pois criam suas próprias seções e a única lógica que o "interpretador de PE do Windows" possui para executar o código inicial seria com este algoritmo, pois tudo se baseia nas características da seção, caso possuir a flag IMAGE_SCN_CNT_CODE indica que se trata de código para execução.
    sábado, 12 de setembro de 2015 03:53
  • Olá Maniaxe

    (1). Entendii :) ... mas e como passo " Buffer = Encoding.UTF8.GetString(br.ReadBytes(50))" para  RichTextBox? Tentei: "  RichTextBox1.Text = Buffer" mas não aparece nada.

    (2). Vou usar o método para encontrar o EntryPoint onde o arquivo será carregado (OpenRead), depois carrego o hexadecimal (BinaryReader), então ele pode dar erro dizendo que o arquivo está em uso. Não posso usar o BinaryReader como somente leitura ou sei lá para evitar este erro?

    (3). E quando ao OEP também agradeço, vou dar uma estudada.



    • Editado Eliseu5 domingo, 13 de setembro de 2015 21:21
    domingo, 13 de setembro de 2015 21:11
  • Oláaa

    Gentee.... Alguém? Ainda não consegui.


    • Editado Eliseu5 quinta-feira, 8 de outubro de 2015 13:01
    quinta-feira, 17 de setembro de 2015 11:33