none
Encontrar EntryPoint em arquivos RRS feed

  • Pergunta

  • Ola

    Eu estou com um projeto onde preciso extrair a assinatura de um arquivo, ou seja o codigo hexadecimal apartir do EntryPoint.

    Uso o código a baixo para extrair o hexadecimal.

      Dim bytes As Byte() = File.ReadAllBytes(Argumento1)
            Dim hex As String() = Array.ConvertAll(bytes, Function(b) b.ToString("X2"))
            Dim AA = String.Join(" ", hex)

    Como posso encontrar o EntryPoint de um arquivo e extrair o código hexadecimal a partir dele, informando o comprimento desejado?

    Desde já agradeço.


    • Editado Eliseu5 quarta-feira, 26 de agosto de 2015 23:35
    terça-feira, 25 de agosto de 2015 17:16

Respostas

  • Imports System.IO
    Imports System.Runtime.InteropServices
    
    Module Module1
    
        Sub Main()
            Demo.GetEntryPoint("C:\Dev\Fun\bin\Debug\Demo.exe")
            Demo.GetEntryPoint("C:\windows\system32\calc.exe")
            Console.Read()
        End Sub
    
    End Module
    
    
    <StructLayout(LayoutKind.Explicit)> _
    Friend Structure DOSHEADER
        ' quando informa LayoutKind.Explicit deve informar a posição exata do campo
        <FieldOffset(60)> _
        Public offset_ntheader As Integer
        ' o posição do campo é 60 e retorna 4 bytes (int)
    End Structure
    
    <StructLayout(LayoutKind.Explicit)> _
    Friend Structure NTHEADER
        <FieldOffset(24)> _
        Public OptionalHeader As OPTIONALHEADER
    End Structure
    
    <StructLayout(LayoutKind.Explicit)> _
    Friend Structure OPTIONALHEADER
        <FieldOffset(16)> _
        Public AddressOfEntryPoint As UInteger
        ' aqui está o EP
    End Structure
    
    
    Friend NotInheritable Class Demo
    
        Private Sub New()
        End Sub
    
        Public Shared Sub GetEntryPoint(ByVal fileName As String)
            Using stream = File.OpenRead(fileName)
                Dim dosHeader = GetDosHeader(stream)
                Console.WriteLine("{0:X8}", GetNtHeader32(stream, dosHeader).OptionalHeader.AddressOfEntryPoint)
            End Using
        End Sub
    
        Private Shared Function GetDosHeader(ByVal stream As Stream) As DOSHEADER
            stream.Seek(0, SeekOrigin.Begin)
            Return GetStruct(Of DOSHEADER)(stream) 'PointerToStruct<DOSHEADER>(stream);
        End Function
    
        Private Shared Function GetNtHeader32(ByVal stream As Stream, ByVal dosHeader As DOSHEADER) As NTHEADER
            stream.Seek(dosHeader.offset_ntheader, SeekOrigin.Begin) ' <- começa no offset passado no dos header
            Return GetStruct(Of NTHEADER)(stream)
        End Function
    
        Private Shared Function GetStruct(Of T)(ByVal stream As Stream) As T
            Dim handle As New GCHandle()
            Try
                Dim size As Integer = Marshal.SizeOf(GetType(T))
                Dim buffer(size - 1) As Byte
                stream.Read(buffer, 0, size)
                handle = GCHandle.Alloc(buffer, GCHandleType.Pinned) ' <- previne que a GC colete seu objeto
                Return CType(Marshal.PtrToStructure(handle.AddrOfPinnedObject(), GetType(T)), T) ' <- converte para struct usando o endereço do handle
            Finally
                If handle.IsAllocated Then
                    handle.Free() ' <- você deve limpar o handle
                End If
            End Try
        End Function
    End Class


    ROBERTOSLJUNIOR


    • Editado robertosljunior terça-feira, 1 de setembro de 2015 00:30
    • Sugerido como Resposta Bruno Maestro quarta-feira, 2 de setembro de 2015 20:14
    • Marcado como Resposta Eliseu5 quarta-feira, 2 de setembro de 2015 22:50
    terça-feira, 1 de setembro de 2015 00:29
  • Bom, depois de 3 dias estudando esse assunto e graças a dica do Bruno Maestro consegui entender como funciona um PE e sua estrutura.

    Os materiais de referência foram:

    https://upload.wikimedia.org/wikipedia/commons/7/70/Portable_Executable_32_bit_Structure_in_SVG.svg

    A documentação da CLI 

    Partition II.25 File format extensions to PE

    http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf

    https://www.simple-talk.com/blogs/2011/03/15/anatomy-of-a-net-assembly-pe-headers/

    Basicamente você precisa de 3 estruturas:

    DOSHEADER, NTHEADER e OPTIONALHEADER

    [StructLayout(LayoutKind.Explicit)] 
    // quando informa LayoutKind.Explicit deve informar a posição exata do campo
    struct DOSHEADER
    {
        [FieldOffset(60)]     // <- o posição do campo é 60 e retorna 4 bytes (int)
        public int offset_ntheader;
    }
    
    [StructLayout(LayoutKind.Explicit)]
    struct NTHEADER
    {
        [FieldOffset(24)]
        public OPTIONALHEADER OptionalHeader;
    }
    
    [StructLayout(LayoutKind.Explicit)]
    struct OPTIONALHEADER
    {
        [FieldOffset(16)]
        public uint AddressOfEntryPoint;    // <- aqui está o EP
    }

    Crie um método para facilitar seu trabalho. Esse método pega um stream, lê x bytes e usa o método PtrToStructure da classe Marshal para retornar uma struct.

    static T GetStruct<T>(Stream stream)
    {
        GCHandle handle = new GCHandle();
        try
        {
            int size = Marshal.SizeOf(typeof(T)); 
            byte[] buffer = new byte[size]; 
            stream.Read(buffer, 0, size);
             handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); // <- previne que a GC colete seu objeto
            return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); // <- converte para struct usando o endereço do handle 
        }
        finally
        {
            if (handle.IsAllocated)
                handle.Free(); // <- você deve limpar o handle
        }
    }

    A primeira struct que você deve ler é a DOSHEADER

    static DOSHEADER GetDosHeader(Stream stream)
    {
        stream.Seek(0, SeekOrigin.Begin); //<- começa em 0
        return GetStruct<DOSHEADER>(stream); // <- retorna minha struct
    }

    Com os dados de DOSHEADER em mão,  é só recuperar a struct NTHEADER:

    static NTHEADER GetNtHeader(Stream stream, DOSHEADER dosHeader)
    {
        stream.Seek(dosHeader.offset_ntheader, SeekOrigin.Begin); // <- começa no offset ntheader da struct dosheader
        return GetStruct<NTHEADER>(stream); 
    }

    E exibir o EP:

    static void GetEntryPoint(string fileName)
    {
        using (var stream = File.OpenRead(fileName))
        {
            var dosHeader = GetDosHeader(stream);
            Console.WriteLine("{0:X8}", GetNtHeader(stream, dosHeader).OptionalHeader.AddressOfEntryPoint);
        }
    }

    Exemplo de uso:

    GetEntryPoint(@"C:\projeto\Demo.exe");
    GetEntryPoint(@"C:\windows\system32\calc.exe");

    O link para o código que foi passado anteriormente Link também funciona, e é bem mais completo que esse. Sei que o código está em C#, e o fórum é de VB.NET, se alguém puder converter o código para VB.NET eu agradeço.

    Como o Bruno falou, acho melhor você entender como funciona a estrutura do PE primeiro porque vai facilitar muito suas futuras necessidades.


    ROBERTOSLJUNIOR

    • Sugerido como Resposta robertosljunior segunda-feira, 31 de agosto de 2015 04:23
    • Marcado como Resposta Marcos SJ segunda-feira, 31 de agosto de 2015 11:42
    • Não Marcado como Resposta Eliseu5 quarta-feira, 2 de setembro de 2015 18:16
    • Marcado como Resposta Marcos SJ quarta-feira, 2 de setembro de 2015 20:25
    segunda-feira, 31 de agosto de 2015 04:21
  • Modifique o método GetEntryPoint para retornar uma string ou qualquer outro tipo

      Public Shared Function GetEntryPoint(ByVal fileName As String) As String
            Using stream = File.OpenRead(fileName)
                Dim dosHeader = GetDosHeader(stream)
                Return GetNtHeader32(stream, dosHeader).OptionalHeader.AddressOfEntryPoint.ToString("X8")
            End Using
        End Function

    Dim dados As String = Demo.GetEntryPoint("c:\windows\system32\calc.exe")
    Console.WriteLine(dados)


    ROBERTOSLJUNIOR

    • Marcado como Resposta Marcos SJ sexta-feira, 4 de setembro de 2015 11:22
    quinta-feira, 3 de setembro de 2015 20:16

Todas as Respostas

  • Olá Eliseu,

    Tudo bem?

    Poderia especificar um pouco mais sobre o que você precisa fazer e o propósito?

    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.

    quarta-feira, 26 de agosto de 2015 19:28
  • Olá

    Tudo bem obrigado!!

    Eu preciso comparar o código hexadecimal entre dois executáveis diferentes, mas comprimidos com o mesmo compressor (ex.: UPX).

    O codigo comparado sera a partir do ponto de entrada (EntryPoint), limitando por tamanho (Ex.: 50 caracteres apos o EntryPoint). 

    Ou seja eu pego o código hexadecimal do arquivo um: AAAAAAAAA e comparo com o arquivo dois: AAAAbAAAA. Então ira me gerar o código hexadecimal final:  AAAA?AAAA (onde o "?" seria as diferenças). Com isso eu sei que todo o arquivo que tiver o hexadecimal AAAA?AAAA é porque foi comprimido com UPX por exemplo.

    Eu ja consegui fazer as comparações e tudo, mas com o código inteiro. Eu preciso apenas apartir do EntryPoint.

    quarta-feira, 26 de agosto de 2015 23:25
  • Você consegue compactar um código .NET com upx? 

    Pra falar a verdade nem sabia que .net tinha entry point. Fui pesquisar sobre o assunto e acabei encontrando uma pergunta similar no StackOverflow (http://stackoverflow.com/questions/28512431/does-net-dll-have-an-entry-point-like-dll-in-c-dll).

    Se alguém tiver conhecimento eu agora também fiquei curioso para saber.

    Tem uma propriedade EntryPoint na classe Assembly que retorna MethodInfo, talvez te ajude.

    Assembly assembly = Assembly.LoadFile(@"c:\caminho\meu.exe");
    var entryPoint = assembly.EntryPoint;


    ROBERTOSLJUNIOR

    • Sugerido como Resposta Ricardo Barbosa Cortes quinta-feira, 27 de agosto de 2015 12:18
    • Não Sugerido como Resposta Marcos SJ quinta-feira, 27 de agosto de 2015 16:57
    quinta-feira, 27 de agosto de 2015 00:10
  • Olá

    Agradeço pela ajuda.

    Não, não consigo compactar .net com UPX, foi apenas um exemplo de packer.

    Eu não usaria apenas para obter o entrypoint de .net, mas sim de qualquer executável.

    Testei o codigo conforme sugerido:

    Dim assembly1 As Assembly = Assembly.LoadFile("c:\caminho\meu.exe")
    Dim entryPoint = assembly1.EntryPoint

    Mas retorna erro:

    Em um exe .net:

    Não é possível carregar este assembly, pois ele foi compilado em um tempo de execução mais recente que o carregado. (Exceção de HRESULT: 0x8013101B)


    Em um exe não .net:

    O módulo deveria conter um manifesto de assembly. (Exceção de HRESULT: 0x80131018)

    Programas como ExeInfoPE conseguem extrair o entrypoint.

    quinta-feira, 27 de agosto de 2015 14:21
  • Olá Eliseu,

    Tudo bem?

    O que você precisa fazer seria mais ou menos 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.

    quinta-feira, 27 de agosto de 2015 17:02
  • Olá, não, a sua sugestão é comparar dois códigos hexadecimais inteiros parecidos para ver as diferenças entre eles.

    Oque eu preciso é pegar o entrypoint de um arquivo exe/dll e a partir dele extrair parte de seu código hexadecimal.

    Tudo por visual basic, nada manual.

    quinta-feira, 27 de agosto de 2015 17:37
  • Aqui tem um exemplo em C#, basta converter. E Aqui como calcular o EP.


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


    sábado, 29 de agosto de 2015 07:08
  • Olá

    Agradeço pela ajuda Bruno, mas não encontrei nada útil para mim nos links. Tudo oque achei foi o código a baixo que não faço nem ideia onde colocar ou como usar:

    IMAGE_DOS_HEADER* dosHeader = (IMAGE_DOS_HEADER *)data;                       //cast it to DOS header (some calls it MZ header)
    IMAGE_NT_HEADERS* peHeader = (IMAGE_NT_HEADERS *)&data[dosHeader->e_lfanew];  //find NT header (PE header)
    DWORD ep = 0;
    if (peHeader->Magic == 0x10b)  //32-bit executable
        ep = ((IMAGE_NT_HEADERS32 *)peHeader)->OptionalHeader.AddressOfEntryPoint;  //Get EP
    else  //64-bit executable
        ep = ((IMAGE_NT_HEADERS64 *)peHeader)->OptionalHeader.AddressOfEntryPoint;  //Get EP

    Mas mesmo assim agradeço.

    domingo, 30 de agosto de 2015 22:26
  • Infelizmente para fazer isso acho você não vai encontrar um exemplo específico de cada situação, você vai ter que entender da estrutura primeiro de um PE, um pouco de assembly e C++ também ajuda, para fazer esses cálculos, RVA, EP.


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


    • Editado Bruno Maestro segunda-feira, 31 de agosto de 2015 00:57
    • Marcado como Resposta Marcos SJ segunda-feira, 31 de agosto de 2015 13:34
    • Não Marcado como Resposta Eliseu5 quarta-feira, 2 de setembro de 2015 18:16
    segunda-feira, 31 de agosto de 2015 00:57
  • Bom, depois de 3 dias estudando esse assunto e graças a dica do Bruno Maestro consegui entender como funciona um PE e sua estrutura.

    Os materiais de referência foram:

    https://upload.wikimedia.org/wikipedia/commons/7/70/Portable_Executable_32_bit_Structure_in_SVG.svg

    A documentação da CLI 

    Partition II.25 File format extensions to PE

    http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf

    https://www.simple-talk.com/blogs/2011/03/15/anatomy-of-a-net-assembly-pe-headers/

    Basicamente você precisa de 3 estruturas:

    DOSHEADER, NTHEADER e OPTIONALHEADER

    [StructLayout(LayoutKind.Explicit)] 
    // quando informa LayoutKind.Explicit deve informar a posição exata do campo
    struct DOSHEADER
    {
        [FieldOffset(60)]     // <- o posição do campo é 60 e retorna 4 bytes (int)
        public int offset_ntheader;
    }
    
    [StructLayout(LayoutKind.Explicit)]
    struct NTHEADER
    {
        [FieldOffset(24)]
        public OPTIONALHEADER OptionalHeader;
    }
    
    [StructLayout(LayoutKind.Explicit)]
    struct OPTIONALHEADER
    {
        [FieldOffset(16)]
        public uint AddressOfEntryPoint;    // <- aqui está o EP
    }

    Crie um método para facilitar seu trabalho. Esse método pega um stream, lê x bytes e usa o método PtrToStructure da classe Marshal para retornar uma struct.

    static T GetStruct<T>(Stream stream)
    {
        GCHandle handle = new GCHandle();
        try
        {
            int size = Marshal.SizeOf(typeof(T)); 
            byte[] buffer = new byte[size]; 
            stream.Read(buffer, 0, size);
             handle = GCHandle.Alloc(buffer, GCHandleType.Pinned); // <- previne que a GC colete seu objeto
            return (T)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(T)); // <- converte para struct usando o endereço do handle 
        }
        finally
        {
            if (handle.IsAllocated)
                handle.Free(); // <- você deve limpar o handle
        }
    }

    A primeira struct que você deve ler é a DOSHEADER

    static DOSHEADER GetDosHeader(Stream stream)
    {
        stream.Seek(0, SeekOrigin.Begin); //<- começa em 0
        return GetStruct<DOSHEADER>(stream); // <- retorna minha struct
    }

    Com os dados de DOSHEADER em mão,  é só recuperar a struct NTHEADER:

    static NTHEADER GetNtHeader(Stream stream, DOSHEADER dosHeader)
    {
        stream.Seek(dosHeader.offset_ntheader, SeekOrigin.Begin); // <- começa no offset ntheader da struct dosheader
        return GetStruct<NTHEADER>(stream); 
    }

    E exibir o EP:

    static void GetEntryPoint(string fileName)
    {
        using (var stream = File.OpenRead(fileName))
        {
            var dosHeader = GetDosHeader(stream);
            Console.WriteLine("{0:X8}", GetNtHeader(stream, dosHeader).OptionalHeader.AddressOfEntryPoint);
        }
    }

    Exemplo de uso:

    GetEntryPoint(@"C:\projeto\Demo.exe");
    GetEntryPoint(@"C:\windows\system32\calc.exe");

    O link para o código que foi passado anteriormente Link também funciona, e é bem mais completo que esse. Sei que o código está em C#, e o fórum é de VB.NET, se alguém puder converter o código para VB.NET eu agradeço.

    Como o Bruno falou, acho melhor você entender como funciona a estrutura do PE primeiro porque vai facilitar muito suas futuras necessidades.


    ROBERTOSLJUNIOR

    • Sugerido como Resposta robertosljunior segunda-feira, 31 de agosto de 2015 04:23
    • Marcado como Resposta Marcos SJ segunda-feira, 31 de agosto de 2015 11:42
    • Não Marcado como Resposta Eliseu5 quarta-feira, 2 de setembro de 2015 18:16
    • Marcado como Resposta Marcos SJ quarta-feira, 2 de setembro de 2015 20:25
    segunda-feira, 31 de agosto de 2015 04:21
  • Obrigado Bruno, se não fosse seu caminho eu não saberia nem por onde começar.


    ROBERTOSLJUNIOR

    segunda-feira, 31 de agosto de 2015 12:41
  • Ola

    Eu agradeço muito pela ajuda, creio que é por ai. 

    Converti os códigos para vb.net mas possui alguns erros, os mesmos quando tentei converte os que o Bruno sugeriu nos links, e não estou conseguindo corrigir:

    Type 'DOSHEADER' is not defined

    Type 'T' is not defined

    Type 'NTHEADER' is not defined

    Type 'var' is not defined

    Código convertido:

    Imports System.IO
    Imports System.Runtime.InteropServices
    
    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
        End Sub
        Private Shared Function GetStruct(ByVal stream As Stream) As T
            Dim handle As GCHandle = New GCHandle
            Try
                Dim size As Integer = Marshal.SizeOf(GetType(T))
                Dim buffer() As Byte = New Byte((size) - 1) {}
                stream.Read(buffer, 0, size)
                handle = GCHandle.Alloc(buffer, GCHandleType.Pinned)
                Return CType(Marshal.PtrToStructure(handle.AddrOfPinnedObject, GetType(T)), T)
            Finally
                If handle.IsAllocated Then
                    handle.Free
                End If
            End Try
        End Function
        Private Shared Function GetDosHeader(ByVal stream As Stream) As DOSHEADER
            stream.Seek(0, SeekOrigin.Begin)
            Return GetStruct(stream)
        End Function
        Private Shared Function GetNtHeader(ByVal stream As Stream, ByVal dosHeader As DOSHEADER) As NTHEADER
            stream.Seek(dosHeader.offset_ntheader, SeekOrigin.Begin)
            Return GetStruct(stream)
        End Function
        Private Shared Sub GetEntryPoint(ByVal fileName As String)
            Dim stream As var = File.OpenRead(fileName)
            Dim dosHeader As var = GetDosHeader(stream)
            Console.WriteLine("{0:X8}", GetNtHeader(stream, dosHeader).OptionalHeader.AddressOfEntryPoint)
        End Sub
    End Class



    • Editado Eliseu5 terça-feira, 1 de setembro de 2015 00:16
    terça-feira, 1 de setembro de 2015 00:14
  • Imports System.IO
    Imports System.Runtime.InteropServices
    
    Module Module1
    
        Sub Main()
            Demo.GetEntryPoint("C:\Dev\Fun\bin\Debug\Demo.exe")
            Demo.GetEntryPoint("C:\windows\system32\calc.exe")
            Console.Read()
        End Sub
    
    End Module
    
    
    <StructLayout(LayoutKind.Explicit)> _
    Friend Structure DOSHEADER
        ' quando informa LayoutKind.Explicit deve informar a posição exata do campo
        <FieldOffset(60)> _
        Public offset_ntheader As Integer
        ' o posição do campo é 60 e retorna 4 bytes (int)
    End Structure
    
    <StructLayout(LayoutKind.Explicit)> _
    Friend Structure NTHEADER
        <FieldOffset(24)> _
        Public OptionalHeader As OPTIONALHEADER
    End Structure
    
    <StructLayout(LayoutKind.Explicit)> _
    Friend Structure OPTIONALHEADER
        <FieldOffset(16)> _
        Public AddressOfEntryPoint As UInteger
        ' aqui está o EP
    End Structure
    
    
    Friend NotInheritable Class Demo
    
        Private Sub New()
        End Sub
    
        Public Shared Sub GetEntryPoint(ByVal fileName As String)
            Using stream = File.OpenRead(fileName)
                Dim dosHeader = GetDosHeader(stream)
                Console.WriteLine("{0:X8}", GetNtHeader32(stream, dosHeader).OptionalHeader.AddressOfEntryPoint)
            End Using
        End Sub
    
        Private Shared Function GetDosHeader(ByVal stream As Stream) As DOSHEADER
            stream.Seek(0, SeekOrigin.Begin)
            Return GetStruct(Of DOSHEADER)(stream) 'PointerToStruct<DOSHEADER>(stream);
        End Function
    
        Private Shared Function GetNtHeader32(ByVal stream As Stream, ByVal dosHeader As DOSHEADER) As NTHEADER
            stream.Seek(dosHeader.offset_ntheader, SeekOrigin.Begin) ' <- começa no offset passado no dos header
            Return GetStruct(Of NTHEADER)(stream)
        End Function
    
        Private Shared Function GetStruct(Of T)(ByVal stream As Stream) As T
            Dim handle As New GCHandle()
            Try
                Dim size As Integer = Marshal.SizeOf(GetType(T))
                Dim buffer(size - 1) As Byte
                stream.Read(buffer, 0, size)
                handle = GCHandle.Alloc(buffer, GCHandleType.Pinned) ' <- previne que a GC colete seu objeto
                Return CType(Marshal.PtrToStructure(handle.AddrOfPinnedObject(), GetType(T)), T) ' <- converte para struct usando o endereço do handle
            Finally
                If handle.IsAllocated Then
                    handle.Free() ' <- você deve limpar o handle
                End If
            End Try
        End Function
    End Class


    ROBERTOSLJUNIOR


    • Editado robertosljunior terça-feira, 1 de setembro de 2015 00:30
    • Sugerido como Resposta Bruno Maestro quarta-feira, 2 de setembro de 2015 20:14
    • Marcado como Resposta Eliseu5 quarta-feira, 2 de setembro de 2015 22:50
    terça-feira, 1 de setembro de 2015 00:29
  • Ok, té agora nada de erros, mas como vejo o resultado em msgbox? Porque té agora não consegui testar.
    • Editado Eliseu5 terça-feira, 1 de setembro de 2015 01:52
    terça-feira, 1 de setembro de 2015 01:11
  • Cara, só retornar uma string na função GetEntryPoint. Postei o projeto completo é só compilar.

    ROBERTOSLJUNIOR

    terça-feira, 1 de setembro de 2015 02:38
  • Olha, agradeço muito sua ajuda, mas ainda não consegui.

    Tentei:

       TextBox1.Text = Console.Read.ToString

    mas retorna "-1".

    Desculpa mas tenho pouca experiencia :/

    • Editado Eliseu5 terça-feira, 1 de setembro de 2015 03:30
    terça-feira, 1 de setembro de 2015 03:19
  • Eliseu, com todo o respeito. Se você não sabe o básico de programação, porque está interessado em um assunto tão complexo.

    Tenha em mente que atitudes como a sua fazem com que as pessoas de boa vontade parem de contribuir com o fórum.


    ROBERTOSLJUNIOR

    quarta-feira, 2 de setembro de 2015 19:30
  • Olá robertosljunior,

    Posso levar em consideração a sua opinião de que em a resposta já foi dada de maneira adequada?

    Se sim, indique por gentileza a resposta mais adequada para que eu possa fechar esta thread.

    Obrigado pela sua participação no fórum!

    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.

    quarta-feira, 2 de setembro de 2015 19:54
  • Eliseu sugiro ler introdução a programação com vb.net, tem muito conteúdo na internet gratuito. Tem umas dicas aqui do Macoratti.

    Para usar esse exemplo que o Roberto já deu pronto, basta conhecer a diferença de método entre sub e function para poder simplesmente alterar o método e retornar o valor que quer.


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

    quarta-feira, 2 de setembro de 2015 19:59
  • Marcos a resposta que você havia marcado é exatamente o que deseja a pergunta.

    Como recuperar o EntryPoint de um arquivo .exe.


    ROBERTOSLJUNIOR

    quarta-feira, 2 de setembro de 2015 20:15
  • Olá

    É lógico que eu sei o básico, tenho vários projetos.

    Acontece que nem tudo é do nosso conhecimento. Se eu perguntando ofende, então sinto muito. Apenas queria finalizar minha questão. :/

    quarta-feira, 2 de setembro de 2015 22:50
  • Olá Eliseu5,

    Tudo bem?

    Você está certo, perguntar não ofende, ou pelo menos não deveria. Porém é importante marcar a resposta quando ela é data. Caso você não consiga aplicar uma solução é uma outra questão. Você pode prosseguir pedindo um detalhe ou outro sobre a resposta dada, mas como eu disse, é importante marcar a resposta quando é reconhecido que o problema não está com a solução e sim com o modo como ela está sendo aplicada.

    Estamos todos aqui para compartilhar conhecimento e aprender uns com os outros, ninguém sabe de todas as coisas. Estamos aqui para auxiliar uns aos outros dentro do propósito ao qual o fórum é proposto.

    Sinta-se a vontade para fazer suas perguntas sempre que um problema aparecer. Todos são bem vindos aqui.

    Bruno Maestro, obrigado por sua participação no fórum de maneira geral, ela é muito importante e significativa também.

    robertosljunior, obrigado por sua colaboração. Sua participação no fórum tem tido um impacto positivo em cada momento.

    Obrigado a todos.

    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, 3 de setembro de 2015 17:31
  • Olá

    Ok, já marquei como resposta, no entanto não consegui alcançar ainda meu objetivo extraindo resultados de:

    GetEntryPoint(@"C:\windows\system32\calc.exe");

    Devo abrir uma nova pergunta? Já procurei bastante na net, ja tentei de todos os jeitos que eu pude e ainda não deu.

    quinta-feira, 3 de setembro de 2015 20:05
  • Modifique o método GetEntryPoint para retornar uma string ou qualquer outro tipo

      Public Shared Function GetEntryPoint(ByVal fileName As String) As String
            Using stream = File.OpenRead(fileName)
                Dim dosHeader = GetDosHeader(stream)
                Return GetNtHeader32(stream, dosHeader).OptionalHeader.AddressOfEntryPoint.ToString("X8")
            End Using
        End Function

    Dim dados As String = Demo.GetEntryPoint("c:\windows\system32\calc.exe")
    Console.WriteLine(dados)


    ROBERTOSLJUNIOR

    • Marcado como Resposta Marcos SJ sexta-feira, 4 de setembro de 2015 11:22
    quinta-feira, 3 de setembro de 2015 20:16
  • Cara, muuuuito obrigado.

    Funciono perfeitamente. Procurei tanto, obrigado.

    Obrigado mesmo, e a todos que me ajudaram. :)

    sexta-feira, 4 de setembro de 2015 02:05
  • Bom dia Eliseu5,

    Que bom!

    Sinta-se livre para fazer suas perguntas no Fórum, sua participação é muito importante. Obrigado por sua contribuição.

    Tenham todos um ótimo fim de semana.

    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.

    sexta-feira, 4 de setembro de 2015 11:25