none
Encontrar Original EntryPoint (OEP) em arquivos RRS feed

  • Pergunta

  • Olá

    Consegui obter o código EntryPoint de arquivos (.exe) no fórum (aqui) .

    E agora preciso encontrar o OEP (Original Entry Point) de arquivos.

    Sei que nem todos tem OEP, geralmente apenas os comprimidos/protegidos etc. Li alguns artigos de engenharia reversa, vb.net mas não consegui encontrar nada.

    Será que é possível pelo vb.net? Alguem pode me ajudar?

    segunda-feira, 7 de setembro de 2015 19:20

Respostas

  • Cada packer tem o seu próprio método de compressão e/ou ofuscamento, alguns compartilham de quase a mesma forma, ou seja, terá que fazer um método para cada packer.

    Pelo que vejo que está querendo fazer, é algo que somente com anos de estudos na área de pack/unpack, er e asm para conseguir concluir seus objetivos. Entendendo sobre isso, você será capaz de desenvolver sua solução em qualquer linguagem.

    Trabalhar com essa estrutura não será algo que terá facilmente em respostas de fóruns.


    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    • Marcado como Resposta Eliseu5 sexta-feira, 11 de setembro de 2015 11:06
    sexta-feira, 11 de setembro de 2015 05:21

Todas as Respostas

  • Olá Eliseu5,

    Tudo bem?

    Poderia falar um pouco mais do propósito e contexto de você precisar fazer isso?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    terça-feira, 8 de setembro de 2015 17:18
  • Olá Marcos...

    Estou em um projeto em vb.net para analisar arquivos exe/dll, onde muitos estão comprimidos/protegidos por packers.

    Cada exe/dll possui um endereço EP (EntryPoint) e quando comprimido/protegido por um packer/protector geralmente se EP muda. No entanto fica em algum lugar o OEP (Original Entry Point). Para descomprimir/desproteger muitos precisam do endereço OEP, que geralmente é encontrado manualmente (ou por ferramentas unpackers).

    Então eu preciso encontrar nos arquivo e exibir este endereço para que possa ocorrer a descompressão por algum método especifico.

    Estou lendo e entendendo mais sobre os arquivos, mas até agora só com ajuda.


    terça-feira, 8 de setembro de 2015 22:05
  • Opa, tudo bom Eliseu5?

    Cara, vou ser sincero com você, não sei como obter essa informação de um executável ou assembly, mas encontrei estes dois links que eu acredito estarem relacionados ao assunto e podem te ajudar:

    Assembly Manipulation and C# / VB.NET Code Injection

    Calling Assembly to get Application Name VB.NET

    Dá uma olhada nesses dois links que pode ter conteúdo relevante para fazer o que você está querendo.

    Espero que isso possa te ajudar.

    quinta-feira, 10 de setembro de 2015 13:58
  • Eliseu,

    Sobre estes arquivos "protegidos", você tem autorização para fazer este tipo de operação que está tentando fazer?

    Não está parecendo um procedimento comum de uma aplicação.

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 10 de setembro de 2015 14:04
  • Segue abaixo função simples para ler o OEP:

    Imports System.IO
    
    Public Class Form1
    
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            MsgBox("0x" & Hex(RetornaOEP("C:\Users\andre.furtado\Desktop\cpicker.exe").ToString()))
            'Exibe o OEP do aplicativo cpicker em base hexadecimal, no caso 0x1000
        End Sub
    
        Private Function RetornaOEP(ByVal szArquivo As String) As UInt32
            Dim PEHeaderOffset As UInt32
            Using br As New BinaryReader(File.Open(szArquivo, FileMode.Open))
                br.BaseStream.Seek(&H3C, SeekOrigin.Begin) 'Retorna offset da estrutura IMAGE_NT_HEADERS
                PEHeaderOffset = br.ReadUInt32() 'Lê offset da estrutura IMAGE_NT_HEADERS
                br.BaseStream.Seek(PEHeaderOffset + &H28, SeekOrigin.Begin) 'Aponta para offset da estrutura IMAGE_NT_HEADERS + 40(&H28) que remete ao OEP do executável
                RetornaOEP = br.ReadUInt32 'Lê OEP
            End Using
        End Function
    
    End Class


    quinta-feira, 10 de setembro de 2015 15:56
  • Olá

    São testes onde eu comprimo meus próprios projetos, e avalio a eficácia na proteção, então é totalmente legal.


    • Editado Eliseu5 quinta-feira, 10 de setembro de 2015 16:37
    quinta-feira, 10 de setembro de 2015 16:25
  • Olá Maniaxe

    Agradeço pela sua ajuda... testei o código mas

    retorna 0x154 (correto: 004657DC)

    retona 0x23BF0 (correto: 0040A037)

    Estaria correto? 004657DC seria 0x154?

    quinta-feira, 10 de setembro de 2015 16:36
  • Os executáveis que você testou estão comprimidos em UPX, por exemplo?

    Onde você visualizou os endereços 0x004657DC e 0x0040A037?

    Para estes casos é necessário fazer um cálculo para extrair o Entry Point que seria Base Address + EP armazenado na estrutura IMAGE_OPTIONAL_HEADER(conforme código que postei). Mas, se você ler os dados do aplicativo como stream para análise, por exemplo, não precisa desta conversão, basta o exemplo que informei.

    O valor Base Address por padrão é 0x00400000 e também fica armazenado na estrutura IMAGE_OPTIONAL_HEADER.

    Nos casos que você postou seria:

    Base Address(0x00400000) + Entry Point(0x000657DC) = 0x004657DC

    Base Address(0x00400000) + Entry Point(0x0000A037) = 0x0040A037

    Em alguns casos é necessário ler o Virtual Address gravado na seção específica de cada compressor, no UPX este valor é armazenado no header da seção UPX1.

    Espero ter sido claro.

    Referências:

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms680341(v=vs.85).aspx

    https://msdn.microsoft.com/en-us/library/windows/desktop/ms680341(v=vs.85).aspx


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

    Sim, um era UPX...

    Se cada compressor pode variar para encontrar o OEP então será que é possível montar um código genérico que funcione com qualquer compressor? E se tiver sido comprimido com dois os mais packers então pode haver mais de um OEP? 

    quinta-feira, 10 de setembro de 2015 17:42
  • Cada packer tem o seu próprio método de compressão e/ou ofuscamento, alguns compartilham de quase a mesma forma, ou seja, terá que fazer um método para cada packer.

    Pelo que vejo que está querendo fazer, é algo que somente com anos de estudos na área de pack/unpack, er e asm para conseguir concluir seus objetivos. Entendendo sobre isso, você será capaz de desenvolver sua solução em qualquer linguagem.

    Trabalhar com essa estrutura não será algo que terá facilmente em respostas de fóruns.


    Bruno Ferreira de Souza
    MVP - Microsoft Valuable Professional
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    www.maestrodotnet.com.br
    @BrunoMaestro

    • Marcado como Resposta Eliseu5 sexta-feira, 11 de setembro de 2015 11:06
    sexta-feira, 11 de setembro de 2015 05:21
  • Olá Bruno

    Agradeço pela ajuda, e creio que você tenha razão.


    • Editado Eliseu5 sexta-feira, 11 de setembro de 2015 11:07
    sexta-feira, 11 de setembro de 2015 11:07