<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[ImageBase aus exe auslesen]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich würde gerne die ImageBase, die ja an der 180. Stelle in der exe ist und 4 bytes lang ist, auslesen.</p>
<p>Bis jetzt sieht mein Programm so aus. Es gibt aber die Adresse im ASCII zeichensatz aus und nicht im hex format:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;

using namespace std;

void getImageBase(ifstream&amp; istream);

int main()
{
    ifstream f1;
    f1.open(&quot;test.exe&quot;,ios::in | ios::binary);

    if( f1.is_open() != true )
    {
        cerr &lt;&lt; &quot;Konnte Datei nicht oeffnen!&quot; &lt;&lt; endl;
    }

    getImageBase(f1);

    f1.close();
    return 0;
}

void getImageBase(ifstream&amp; istream)
{
    /*
    size_t size;
    istream.seekg(0, ios::end);
    size = istream.tellg();
    istream.seekg(0, ios::beg);
    */

    istream.seekg(180, ios::beg);

    vector &lt; BYTE &gt; bytes;
    bytes.resize(4);

    istream.read((char* )&amp;bytes[ 0 ], 4);

    for(int i=0;i&lt;bytes.size();i++)
    {
        cout &lt;&lt; hex &lt;&lt; bytes[i];
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/287403/imagebase-aus-exe-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 11:23:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/287403.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 27 May 2011 16:40:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 16:40:15 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich würde gerne die ImageBase, die ja an der 180. Stelle in der exe ist und 4 bytes lang ist, auslesen.</p>
<p>Bis jetzt sieht mein Programm so aus. Es gibt aber die Adresse im ASCII zeichensatz aus und nicht im hex format:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;windows.h&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;

using namespace std;

void getImageBase(ifstream&amp; istream);

int main()
{
    ifstream f1;
    f1.open(&quot;test.exe&quot;,ios::in | ios::binary);

    if( f1.is_open() != true )
    {
        cerr &lt;&lt; &quot;Konnte Datei nicht oeffnen!&quot; &lt;&lt; endl;
    }

    getImageBase(f1);

    f1.close();
    return 0;
}

void getImageBase(ifstream&amp; istream)
{
    /*
    size_t size;
    istream.seekg(0, ios::end);
    size = istream.tellg();
    istream.seekg(0, ios::beg);
    */

    istream.seekg(180, ios::beg);

    vector &lt; BYTE &gt; bytes;
    bytes.resize(4);

    istream.read((char* )&amp;bytes[ 0 ], 4);

    for(int i=0;i&lt;bytes.size();i++)
    {
        cout &lt;&lt; hex &lt;&lt; bytes[i];
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2069852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069852</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Fri, 27 May 2011 16:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 17:11:36 GMT]]></title><description><![CDATA[<p>Einfach noch &quot; <code>std::cout &lt;&lt; std::hex</code> &quot; vor der ersten Ausgabe hinschreiben und alle darauffolgenden Zahlen sind Hexadezimal.</p>
<p>EDIT: So sieht dein Programm ein wenig aufgeräumter aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ios&gt;
#include &lt;fstream&gt; 
#include &lt;vector&gt; 

bool GetImageBase(std::ifstream&amp;); 

int main() 
{ 
    std::ifstream f1(&quot;test.exe&quot;, std::ios::in | std::ios::binary); 
    if(!f1.is_open()) 
        std::cerr &lt;&lt; &quot;Konnte Datei nicht oeffnen!&quot;; 

    if(!GetImageBase(f1))
        std::cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;
} 

bool getImageBase(std::ifstream&amp; File) 
{ 
    std::vector&lt;char&gt; Bytes(4); 
    File.seekg(180, std::ios::beg);
    File.read(&amp;Bytes[0], 4); 
    if(!File.good())
        return false;

    std::cout &lt;&lt; std::hex;
    for(unsigned i = 0; i &lt; Bytes.size(); i++) 
        std::cout &lt;&lt; int(Bytes[i]); 

    return true;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2069859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069859</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 27 May 2011 17:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 17:07:49 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort, aber bei mir siehts immer noch so aus:<br />
<a href="http://www.abload.de/image.php?img=bild8neo.jpg" rel="nofollow">http://www.abload.de/image.php?img=bild8neo.jpg</a></p>
<p>Also es funktioniert nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069873</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Fri, 27 May 2011 17:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Sat, 28 May 2011 08:35:23 GMT]]></title><description><![CDATA[<p>Nein, der Fehler ist, daß 'char' als Zeichen ausgegeben werden, nicht als Zahlenwerte. Daher fehlt noch die Konvertierung nach 'int':</p>
<pre><code class="language-cpp">cout &lt;&lt; hex &lt;&lt; setw(2) &lt;&lt; fill('0') &lt;&lt; static_cast&lt;int&gt;(bytes[i]);
</code></pre>
<p>(P.S. Dies wird auf Little-Endian-Systemen die Adresse 'verkehrt herum' ausgeben).</p>
<p>Edit:<br />
Einfacher wäre jedoch, gleich die ImageBase als Zahl auszulesen, d.h.</p>
<pre><code class="language-cpp">int imagebase;
istream.read(reinterpret_cast&lt;char*&gt;(&amp;imagebase), sizeof(int)); // Edit: Klammern hinzugefügt ;-)

cout &lt;&lt; hex &lt;&lt; imagebase;
</code></pre>
<p>Nun ist auch die Endianess kein Problem mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069874</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 28 May 2011 08:35:23 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 17:12:05 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Nein, der Fehler ist, daß 'char' als Zeichen ausgegeben werden, nicht als Zahlenwerte.</p>
</blockquote>
<p>Oh, das habe ich übersehen. In meinem Code ist es nun gefixt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069876</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 27 May 2011 17:12:05 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 17:19:07 GMT]]></title><description><![CDATA[<p>Jo danke jetzt funktioniert. Ich hab mir auch schon gedacht, dass es am (char*) lag, aber ich habs irgendwie nicht anders hinbekommen.<br />
Jetzt kann ich mir auch ne komplette Klasse um den PE-Header auszulesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069883</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Fri, 27 May 2011 17:19:07 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 19:34:27 GMT]]></title><description><![CDATA[<p>Th69 schrieb:</p>
<blockquote>
<p>Einfacher wäre jedoch, gleich die ImageBase als Zahl auszulesen, d.h.</p>
<pre><code class="language-cpp">int imagebase;
istream.read(reinterpret_cast&lt;char*&gt;&amp;imagebase, sizeof(int));

cout &lt;&lt; hex &lt;&lt; imagebase;
</code></pre>
</blockquote>
<p>Also das funktioniert nicht. Ich hab jetzt meine funktion so wie EOutOfResources es gemacht hat, jedoch weiß ich nicht wie ich den vector in eine einzele Variable kopieren soll. Ich hab schon es schon über stringstreams probiert, wobei das auch nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069936</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Fri, 27 May 2011 19:34:27 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 19:40:13 GMT]]></title><description><![CDATA[<p>So:</p>
<pre><code class="language-cpp">unsigned long int Foo = *reinterpret_cast&lt;unsigned long int*&gt;(&amp;Bytes[0]);
</code></pre>
<p>Wenn es einen komischen Wert ergibt, entfernst du das &quot; <code>unsigned</code> &quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069939</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 27 May 2011 19:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 19:41:15 GMT]]></title><description><![CDATA[<p>Also der Compiler sagt da:<br />
error: invalid cast from type 'char' to type 'long unsigned int'</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069941</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Fri, 27 May 2011 19:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 19:42:27 GMT]]></title><description><![CDATA[<p>Versuchs nochmals. Ich habe es editiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069943</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Fri, 27 May 2011 19:42:27 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Fri, 27 May 2011 19:45:47 GMT]]></title><description><![CDATA[<p>Jo perfekt, jetzt funktioniert es. musste wie du gesagt hasst aber die unsigned wegnehmen.<br />
dankeschön</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2069945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2069945</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Fri, 27 May 2011 19:45:47 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Sat, 28 May 2011 08:40:15 GMT]]></title><description><![CDATA[<p>Bei meiner Version oben fehlten nur die Klammern (habe ich nacheditiert).<br />
Ansonsten macht die Version von EOutOfResources jetzt auch nichts anderes als meine, nur daß meine eleganter ist (weil &quot;kürzer und direkter&quot;) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070030</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070030</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Sat, 28 May 2011 08:40:15 GMT</pubDate></item><item><title><![CDATA[Reply to ImageBase aus exe auslesen on Sat, 28 May 2011 11:27:14 GMT]]></title><description><![CDATA[<p>Jetzt wo mein Code funktioniert hab ich das Problem, dass das Programm teilweise Werte falsch ausliest<br />
Hier erstmal mein Programm:<br />
main.cpp</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ios&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;String&gt;
#include &lt;sstream&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &quot;PE_Header.h&quot;

using namespace std;

int main()
{
    PE_Header Header(&quot;test.exe&quot;);

    Header.getEXE();

    Header.print();
}
</code></pre>
<p>PE_Header.cpp</p>
<pre><code class="language-cpp">#include &quot;PE_Header.h&quot;
#include &lt;iostream&gt;
#include &lt;ios&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;sstream&gt;
#include &lt;String&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

PE_Header::PE_Header(const char* s)
{
    File.open(&quot;test.exe&quot;, ios::in | ios::binary);
    if(!File.is_open())
    {
        cerr &lt;&lt; &quot;Fehler beim oeffnen der Datei&quot; &lt;&lt; endl;
    }
    if(!getGlobal(180, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(168, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(172, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(176, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(224, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(228, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(256, 4))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;

    if(!getGlobal(150, 2))
        cerr &lt;&lt; &quot;Fehler beim Auslesen!&quot;;
}

PE_Header::~PE_Header()
{
    File.close();

}

void PE_Header::getEXE()
{
    size_t size;
    File.seekg(0, ios::end);
    size = File.tellg();
    File.seekg(0, ios::beg);

    datei.resize(size);

    File.read(&amp;datei[0], size);
}

bool PE_Header::getGlobal(int position, int size)
{
    vector&lt;char&gt; Bytes(size);
    File.seekg(position, ios::beg);
    File.read(&amp;Bytes[0], size);

    if(!File.good())
        return false;

    if(position == 180)
    {
        Info.ImageBase = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 168)
    {
        Info.EntryPoint = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 172)
    {
        Info.Base_of_Code = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 176)
    {
        Info.Base_of_Data = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 224)
    {
        Info.Size_of_Image = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 228)
    {
        Info.Size_of_Headers = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 256)
    {
        Info.LoaderFlags = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    else if(position == 150)
    {
        Info.Sections = *reinterpret_cast&lt;long int*&gt;(&amp;Bytes[0]);
    }
    return true;
}

void PE_Header::print()
{
    cout &lt;&lt; &quot;Entry Point:     &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.EntryPoint &lt;&lt; endl;
    cout &lt;&lt; &quot;ImageBase:       &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.ImageBase &lt;&lt; endl;
    cout &lt;&lt; &quot;Base of Code:    &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.Base_of_Code &lt;&lt; endl;
    cout &lt;&lt; &quot;Base of Data:    &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.Base_of_Data &lt;&lt; endl;
    cout &lt;&lt; &quot;Size of Image:   &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.Size_of_Image &lt;&lt; endl;
    cout &lt;&lt; &quot;Size of Headers: &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.Size_of_Headers &lt;&lt; endl;
    cout &lt;&lt; &quot;LoaderFlags:     &quot; &lt;&lt; hex &lt;&lt; showbase &lt;&lt; Info.LoaderFlags &lt;&lt; endl;
    //cout.unsetf(ios::hex);
    cout &lt;&lt; &quot;Sections:        &quot; &lt;&lt; Info.Sections &lt;&lt; endl;
}
</code></pre>
<p>PE_Header.h</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ios&gt;
#include &lt;fstream&gt;
#include &lt;vector&gt;
#include &lt;String&gt;
#include &lt;sstream&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

#ifndef PE_HEADER_H
#define PE_HEADER_H

using namespace std;

class PE_Header
{
    public:
        PE_Header(const char* s);
        virtual ~PE_Header();
        bool getImageBase();
        bool getEntryPoint();
        bool getBase_of_Code();
        bool getBase_of_Data();
        bool getSize_of_Image();
        bool getSize_of_Headers();
        bool getLoaderFlags();
        bool getSections();
        bool getGlobal(int position, int size);
        void getEXE();
        void print();

    private:

        ifstream File;

        struct Header {
            long EntryPoint;
            long ImageBase;
            long Base_of_Code;
            long Base_of_Data;
            long Size_of_Image;
            long Size_of_Headers;
            long LoaderFlags;
            long Sections;
        }Info;

        vector&lt;char&gt;datei;
};

#endif // PE_HEADER_H
</code></pre>
<p>Hier ist dann das Ergebniss:<br />
<a href="http://www.abload.de/image.php?img=test073h.jpg" rel="nofollow">http://www.abload.de/image.php?img=test073h.jpg</a></p>
<p>Man sieht ja, dass das Programm ab &quot;Size of Image&quot; falsch ausliest, obwohl die Stellen die ich im Code angegeben hab z.B. 150 für die Sections auch richtig sind. Ich hab sie auch im Hex-Editor kontrolliert. Also die müssten stimmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2070087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2070087</guid><dc:creator><![CDATA[HKEY]]></dc:creator><pubDate>Sat, 28 May 2011 11:27:14 GMT</pubDate></item></channel></rss>