Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: WinAPI ::  EXE base immer 0x400000 ?     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
konkret1
Unregistrierter




Beitrag konkret1 Unregistrierter 19:33:18 02.02.2012   Titel:   EXE base immer 0x400000 ?            Zitieren

Hallo!

Eine kurze Frage: Befindet sich die Basisadresse der .exe, wenn man sie startet, immer an 0x400000? Kann man das auch für zukünftige Windowsversionen garantieren?
Kann die .exe überhaupt "relocated" werden so wie eine .dll?

Ich habe nämlich ein Problem: Ich möchte ein Programm mit einem Memorypatch starten (das gehört nicht mir, ich habe also keinen Source).
Dazu verwende ich CreateProcess(CREATE_SUSPENDED) und dann WriteProcessMemory in 0x400000 + X (Ich möchte etwas Code verändern, der gleich zu Beginn läuft).
Das Problem ist nun, dass ich mit zB. CreateToolhelp32Snapshot(TH32CS_SNAPMODULE) die Basisadresse der eben gestarteten .exe noch nicht holen kann, da bei CREATE_SUSPENDED scheinbar keine Module enumeriert werden (Solange ich eben nicht ResumeThread() aufrufe).
Wie könnte ich sonst die Basisadresse der eben gestarteten .exe holen?

Danke schon mal!
MfG
Martin Richter
Moderator

Benutzerprofil
Anmeldungsdatum: 18.04.2006
Beiträge: 13522
Beitrag Martin Richter Moderator 21:01:54 02.02.2012   Titel:              Zitieren

Nö das kan keiner garantieren.
Jeder kann mit Linker Optionen selbst festlegen wohin was geladen wird.
Zudem gibt es ASLR.

_________________
Martin Richter (MVP für C++) WWJD http://blog.m-ri.de
"A well-written program is its own heaven; a poorly written program is its own hell!" The Tao of Programming
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
Beitrag hustbaer Mitglied 21:05:54 02.02.2012   Titel:              Zitieren

Zitat:
Kann die .exe überhaupt "relocated" werden so wie eine .dll?

Wenn sie nen relocation Table hat, dann schon.

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Gast13377777
Unregistrierter




Beitrag Gast13377777 Unregistrierter 22:18:26 02.02.2012   Titel:              Zitieren

Hat zwar einen anderen Zweck, aber müsste dir trotzdem helfen

http://pastebin.com/Nje57LXx
konkret1
Unregistrierter




Beitrag konkret1 Unregistrierter 22:51:24 02.02.2012   Titel:              Zitieren

Martin Richter schrieb:
Jeder kann mit Linker Optionen selbst festlegen wohin was geladen wird.

Die .exe wird jedenfalls nicht mehr verändert.

Martin Richter schrieb:
Zudem gibt es ASLR.

Dachte das pssiert nur bei .dlls (Hab bis jetzt auch noch nie was anderes als 0x400000 beobachtet).

hustbaer schrieb:
Wenn sie nen relocation Table hat, dann schon.

Hat keine.


@Gast13377777
Nt* Funktionen möchte ich nicht verwenden. Wer weiß, wie lange das noch so funktioniert...
KN4CK3R
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.05.2007
Beiträge: 585
Beitrag KN4CK3R Mitglied 10:40:21 03.02.2012   Titel:              Zitieren

im ToolHelpshot steht die Adresse drin.

greetz KN4CK3R

_________________
http://www.oldschoolhack.de
C0de4Fun
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.03.2009
Beiträge: 182
Beitrag C0de4Fun Mitglied 13:02:34 03.02.2012   Titel:              Zitieren

Hi Leute,

oder einfach mit Debug Flag starten und die Events ueberpruefen!?

Gruessle
Bassmaster
Mitglied

Benutzerprofil
Anmeldungsdatum: 19.09.2007
Beiträge: 318
Beitrag Bassmaster Mitglied 13:50:16 03.02.2012   Titel:              Zitieren

Hallo, schau mal hier: http://msdn.microsoft.com/en-us/windows/hardware/gg463119.aspx


Das Programm hier hab ich irgendwann mal geschrieben, aber nie weiter was dran gemacht vielleicht kannst du davon ja was gebrauchen.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
#include
<fstream>
#include
<vector>
#include
<iomanip>
using namespace std;

void PrintAndReadImageBase( vector<unsigned char> & data );
void PrintAndReadAddressOfEntryPoint_NO_PE_Loader( vector<unsigned char> & data );

int main( )
{
int file_size;
int count = 0;
int n=15;


char AddressOfEntryPoint_NO_PE_Loader[9];  // Entry Point Adresse wenn der PE Loader die Datei nocht nicht geladen hat.



// Entrypoint + Imagebase = Entrypoint wenn die Datei vom PE Loader geladen wurde



ifstream file ("size.exe",ios::binary);

file.seekg(0,ios::end);
file_size = file.tellg();
file.seekg(0,ios::beg);

if ( !file.good() ) {
cout<<"Datei existiert nicht"<<endl;
}



//cout<<"file size: " << file_size << endl;

vector <unsigned char> data ( file_size );
file.read( reinterpret_cast<char*> ( &data[0] )  ,file_size );


for (int i=0;i<file_size;i++)
{

       if ( i == n )
        {
        n+=15;
       // cout<<endl;
        }

     // cout<<  hex << setfill('0') << setw(2) << static_cast<int> ( data[i] ) << " ";




        if ( i == 0xA8 )
        {
          //   PrintAndReadAddressOfEntryPoint_NO_PE_Loader ( data );
        }


        if ( i == 0xB4 )
        {
             PrintAndReadImageBase ( data );
        }


}


cout<<endl<<endl;
system("PAUSE");




file.close();
return 0;
}


//##############################################################################



void PrintAndReadImageBase ( vector<unsigned char> &data  )
{


//    for (int j=0xA8 ; j <= 0xAF ; j++){


       cout<<"Address of image base in little endian format       : 0x";

      for (int j=0xB4 ; j<0xB8 ; j++){
                 cout<< hex  <<setfill('0')<<setw(2) << static_cast<unsigned int> ( data[j] );
      }


        cout<<endl;
        cout<<"Addresse of image base in big endian address format  : 0x";
        // Wandelt die Little Endian Adresse in eine Big Endian Adresse um

         for (int j=0xB8-1 ; j > 0xB3; j--)
        {
                        if ( data[j] != '\x00' )  // verhindert das z.b. solche adress formate ausgeben werden: 001280
                                                  //  00 <-- Die ersten beiden nullen brauchen nicht mit angeben zu werden


                        {
                               for ( j=j ; j> 0xB3 ; j--  )
                               {
                                cout<< hex << static_cast<unsigned int> ( data[j] ) ;
                               }
                        }
        }


        cout<<endl;
        cout<<"Start of image base at offset [File ist not loaded]:  0xB4"<<endl;
        cout<<"End of image base at offset  [File ist not loaded] :  0xB7"<<endl;


              cout<<endl;

        cout<<"*****************************************************************"<<endl;

}





void PrintAndReadAddressOfEntryPoint_NO_PE_Loader( vector<unsigned char> & data )
{
int count = 0;


       cout<<"Addresse of entry point in little endian format       : 0x";
       for (int j=0xA8 ; j < 0xAC; j++){
                //AddressOfEntryPoint_NO_PE_Loader[ count ] = data[j];  // 00
                cout<< hex << static_cast<unsigned int> ( data[j] );
                count++;
        }

       cout<<endl;

         cout<<"Addresse of entry point in big endian address format  : 0x";
        // Wandelt die Little Endian Adresse in eine Big Endian Adresse um
        for (int j=0xAC-1 ; j > 0xA7; j--)
        {
                        if ( data[j] != '\x00' )  // verhindert das z.b. solche adress formate ausgeben werden: 001280
                                                  //  00 <-- Die ersten beiden nullen brauchen nicht mit angeben zu werden


                        {
                               for ( j=j ; j> 0xA7 ; j--  )
                               {
                                cout<< hex << static_cast<unsigned int> ( data[j] ) ;
                               }
                        }
        }

        cout<<endl;
        cout<<"Start of entry point address [File ist not loaded]    : " << "0xA8" <<endl;
        cout<<"End of entry point address [File ist not loaded]      : " << "0xAF" <<endl;


         cout<<endl;

        cout<<"*****************************************************************"<<endl;

}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
#include
<fstream>
#include
<vector>
#include
<iomanip>
using namespace std;

void PrintAndReadImageBase( vector<unsigned char> & data );
void PrintAndReadAddressOfEntryPoint_NO_PE_Loader( vector<unsigned char> & data );

int main( )
{
int file_size;
int count = 0;
int n=15;


char AddressOfEntryPoint_NO_PE_Loader[9]; // Entry Point Adresse wenn der PE Loader die Datei nocht nicht geladen hat.



// Entrypoint + Imagebase = Entrypoint wenn die Datei vom PE Loader geladen wurde



ifstream file ("size.exe",ios::binary);

file.seekg(0,ios::end);
file_size = file.tellg();
file.seekg(0,ios::beg);

if ( !file.good() ) {
cout<<"Datei existiert nicht"<<endl;
}



//cout<<"file size: " << file_size << endl;

vector <unsigned char> data ( file_size );
file.read( reinterpret_cast<char*> ( &data[0] ) ,file_size );


for (int i=0;i<file_size;i++)
{

if ( i == n )
{
n+=15;
// cout<<endl;
}

// cout<< hex << setfill('0') << setw(2) << static_cast<int> ( data[i] ) << " ";




if ( i == 0xA8 )
{
// PrintAndReadAddressOfEntryPoint_NO_PE_Loader ( data );
}


if ( i == 0xB4 )
{
PrintAndReadImageBase ( data );
}


}


cout<<endl<<endl;
system("PAUSE");




file.close();
return 0;
}


//##############################################################################



void PrintAndReadImageBase ( vector<unsigned char> &data )
{


// for (int j=0xA8 ; j <= 0xAF ; j++){


cout<<"Address of image base in little endian format : 0x";

for (int j=0xB4 ; j<0xB8 ; j++){
cout<< hex <<setfill('0')<<setw(2) << static_cast<unsigned int> ( data[j] );
}


cout<<endl;
cout<<"Addresse of image base in big endian address format : 0x";
// Wandelt die Little Endian Adresse in eine Big Endian Adresse um

for (int j=0xB8-1 ; j > 0xB3; j--)
{
if ( data[j] != '\x00' ) // verhindert das z.b. solche adress formate ausgeben werden: 001280
// 00 <-- Die ersten beiden nullen brauchen nicht mit angeben zu werden


{
for ( j=j ; j> 0xB3 ; j-- )
{
cout<< hex << static_cast<unsigned int> ( data[j] ) ;
}
}
}


cout<<endl;
cout<<"Start of image base at offset [File ist not loaded]: 0xB4"<<endl;
cout<<"End of image base at offset [File ist not loaded] : 0xB7"<<endl;


cout<<endl;

cout<<"*****************************************************************"<<endl;

}





void PrintAndReadAddressOfEntryPoint_NO_PE_Loader( vector<unsigned char> & data )
{
int count = 0;


cout<<"Addresse of entry point in little endian format : 0x";
for (int j=0xA8 ; j < 0xAC; j++){
//AddressOfEntryPoint_NO_PE_Loader[ count ] = data[j]; // 00
cout<< hex << static_cast<unsigned int> ( data[j] );
count++;
}

cout<<endl;

cout<<"Addresse of entry point in big endian address format : 0x";
// Wandelt die Little Endian Adresse in eine Big Endian Adresse um
for (int j=0xAC-1 ; j > 0xA7; j--)
{
if ( data[j] != '\x00' ) // verhindert das z.b. solche adress formate ausgeben werden: 001280
// 00 <-- Die ersten beiden nullen brauchen nicht mit angeben zu werden


{
for ( j=j ; j> 0xA7 ; j-- )
{
cout<< hex << static_cast<unsigned int> ( data[j] ) ;
}
}
}

cout<<endl;
cout<<"Start of entry point address [File ist not loaded] : " << "0xA8" <<endl;
cout<<"End of entry point address [File ist not loaded] : " << "0xAF" <<endl;


cout<<endl;

cout<<"*****************************************************************"<<endl;

}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#include <iostream>
#include
<fstream>
#include
<vector>
#include
<iomanip>
using namespace std;

void PrintAndReadImageBase( vector<unsigned char> & data );
void PrintAndReadAddressOfEntryPoint_NO_PE_Loader( vector<unsigned char> & data );

int main( )
{
int file_size;
int count = 0;
int n=15;


char AddressOfEntryPoint_NO_PE_Loader[9];  // Entry Point Adresse wenn der PE Loader die Datei nocht nicht geladen hat.



// Entrypoint + Imagebase = Entrypoint wenn die Datei vom PE Loader geladen wurde



ifstream file ("size.exe",ios::binary);

file.seekg(0,ios::end);
file_size = file.tellg();
file.seekg(0,ios::beg);

if ( !file.good() ) {
cout<<"Datei existiert nicht"<<endl;
}



//cout<<"file size: " << file_size << endl;

vector <unsigned char> data ( file_size );
file.read( reinterpret_cast<char*> ( &data[0] )  ,file_size );


for (int i=0;i<file_size;i++)
{

       if ( i == n )
        {
        n+=15;
       // cout<<endl;
        }

     // cout<<  hex << setfill('0') << setw(2) << static_cast<int> ( data[i] ) << " ";




        if ( i == 0xA8 )
        {
          //   PrintAndReadAddressOfEntryPoint_NO_PE_Loader ( data );
        }


        if ( i == 0xB4 )
        {
             PrintAndReadImageBase ( data );
        }


}


cout<<endl<<endl;
system("PAUSE");




file.close();
return 0;
}


//##############################################################################



void PrintAndReadImageBase ( vector<unsigned char> &data  )
{


//    for (int j=0xA8 ; j <= 0xAF ; j++){


       cout<<"Address of image base in little endian format       : 0x";

      for (int j=0xB4 ; j<0xB8 ; j++){
                 cout<< hex  <<setfill('0')<<setw(2) << static_cast<unsigned int> ( data[j] );
      }


        cout<<endl;
        cout<<"Addresse of image base in big endian address format  : 0x";
        // Wandelt die Little Endian Adresse in eine Big Endian Adresse um

         for (int j=0xB8-1 ; j > 0xB3; j--)
        {
                        if ( data[j] != '\x00' )  // verhindert das z.b. solche adress formate ausgeben werden: 001280
                                                  //  00 <-- Die ersten beiden nullen brauchen nicht mit angeben zu werden


                        {
                               for ( j=j ; j> 0xB3 ; j--  )
                               {
                                cout<< hex << static_cast<unsigned int> ( data[j] ) ;
                               }
                        }
        }


        cout<<endl;
        cout<<"Start of image base at offset [File ist not loaded]:  0xB4"<<endl;
        cout<<"End of image base at offset  [File ist not loaded] :  0xB7"<<endl;


              cout<<endl;

        cout<<"*****************************************************************"<<endl;

}





void PrintAndReadAddressOfEntryPoint_NO_PE_Loader( vector<unsigned char> & data )
{
int count = 0;


       cout<<"Addresse of entry point in little endian format       : 0x";
       for (int j=0xA8 ; j < 0xAC; j++){
                //AddressOfEntryPoint_NO_PE_Loader[ count ] = data[j];  // 00
                cout<< hex << static_cast<unsigned int> ( data[j] );
                count++;
        }

       cout<<endl;

         cout<<"Addresse of entry point in big endian address format  : 0x";
        // Wandelt die Little Endian Adresse in eine Big Endian Adresse um
        for (int j=0xAC-1 ; j > 0xA7; j--)
        {
                        if ( data[j] != '\x00' )  // verhindert das z.b. solche adress formate ausgeben werden: 001280
                                                  //  00 <-- Die ersten beiden nullen brauchen nicht mit angeben zu werden


                        {
                               for ( j=j ; j> 0xA7 ; j--  )
                               {
                                cout<< hex << static_cast<unsigned int> ( data[j] ) ;
                               }
                        }
        }

        cout<<endl;
        cout<<"Start of entry point address [File ist not loaded]    : " << "0xA8" <<endl;
        cout<<"End of entry point address [File ist not loaded]      : " << "0xAF" <<endl;


         cout<<endl;

        cout<<"*****************************************************************"<<endl;

}
Gast13377777
Unregistrierter




Beitrag Gast13377777 Unregistrierter 17:44:37 03.02.2012   Titel:              Zitieren

konkret1 schrieb:
@Gast13377777
Nt* Funktionen möchte ich nicht verwenden. Wer weiß, wie lange das noch so funktioniert...


Doch nicht die NT Funktionen, sondern das hier:
C/C++ Code:
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)&buf[0];
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)&buf[pidh->e_lfanew];
C/C++ Code:
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)&buf[0];
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)&buf[pidh->e_lfanew];
C/C++ Code:
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)&buf[0];
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)&buf[pidh->e_lfanew];
konkret2
Unregistrierter




Beitrag konkret2 Unregistrierter 19:31:12 03.02.2012   Titel:              Zitieren

konkret1 schrieb:
Wie könnte ich sonst die Basisadresse der eben gestarteten .exe holen?

Via VirtualQueryEx
konkret1
Unregistrierter




Beitrag konkret1 Unregistrierter 21:10:45 03.02.2012   Titel:              Zitieren

KN4CK3R, Toolhelpshot geht ja nicht, weil CREATE_SUSPENDED und noch nicht resumed. Die CreateToolhelp... Funktion gibt 0 zurück.

Bassmaster, Gast13377777 ihr meint also die Info aus dem .exe header auslesen. Der ist doch statisch und dort steht soweit ich weiß nur die gewünschte bzw. voraussichtliche Basisadresse, der Loader könnte es noch versetzen.

konkret2, ich weiß nichts damit anzufangen...


Ah alles klar, das erklärts...
http://msdn.microsoft.com/en-us/library/w368ysh2.aspx
Ist default für .exen. Wird also wohl so sein bei dieser, die hat nämlich keine reloc. table.
Also kann ich mich bei dieser .exe wohl darauf verlassen.
ep
Unregistrierter




Beitrag ep Unregistrierter 21:37:57 03.02.2012   Titel:              Zitieren

Wieso patchst du nicht einfach das .exe file?
konkret1
Unregistrierter




Beitrag konkret1 Unregistrierter 01:04:59 04.02.2012   Titel:              Zitieren

Weils eine Option sein soll.
-lowbyte-
Mitglied

Benutzerprofil
Anmeldungsdatum: 12.10.2010
Beiträge: 233
Beitrag -lowbyte- Mitglied 04:07:37 04.02.2012   Titel:              Zitieren

Mann kann die BaseAddress mit GetModulHandle() bekommen.

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>

int main()
{

    HMODULE hm;

    hm = GetModuleHandle(NULL);

    return 0;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>

int main()
{

HMODULE hm;

hm = GetModuleHandle(NULL);

return 0;
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>

int main()
{

    HMODULE hm;

    hm = GetModuleHandle(NULL);

    return 0;
}


http://msdn.microsoft.com/en-us/library/windows/desktop/ms683199%28v=vs.85%29.aspx

_________________
XOR-BASE http://vpn23.homelinux.org
News: BaseX Encoding Library C/C++
C0de4Fun
Mitglied

Benutzerprofil
Anmeldungsdatum: 06.03.2009
Beiträge: 182
Beitrag C0de4Fun Mitglied 08:52:06 04.02.2012   Titel:              Zitieren

Desweitern zeigt doch der EIP des erzeugten Threads auf den Entrypoint wenn man nen Prozess mit diesem Flag started oder ned`?
Thereaver
Unregistrierter




Beitrag Thereaver Unregistrierter 12:03:51 04.02.2012   Titel:              Zitieren

ASLR ist bei jedem Systemstart für jeden Prozess gleich.
Hol dir die ImageBase von deinem Prozess, dann hast du auch die des anderen.
konkret1
Unregistrierter




Beitrag konkret1 Unregistrierter 19:06:56 04.02.2012   Titel:              Zitieren

-lowbyte-, aber ich will doch nicht die Base von meinem Prozess, sondern von einem anderen, der noch im SUSPENDED-State ist...

C0de4Fun, aber was tun mit dem Entrypoint?

Thereaver, das scheint so nicht zu stimmen. Dieses eine Programm ist scheinbar immer an 0x00400000, während ich bei anderen Programmen komplett zufällige .exe-Basen entdeckte (Win7 64bit).

Ist ASLR ohne reloc. Table der .exe überhaupt möglich?
distorm
Unregistrierter




Beitrag distorm Unregistrierter 21:50:33 04.02.2012   Titel:              Zitieren

konkret1 schrieb:
Ist ASLR ohne reloc. Table der .exe überhaupt möglich?

ist es nicht.
Thereaver
Unregistrierter




Beitrag Thereaver Unregistrierter 12:21:37 05.02.2012   Titel:              Zitieren

sorry ich habe wohl Müll erzählt, aber auf die kernel32 trifft es zu. Die ist in jedem Prozess trotz ASLR gleich.
Thereaver
Unregistrierter




Beitrag Thereaver Unregistrierter 12:32:43 05.02.2012   Titel:              Zitieren

die einzige Möglichkeit die ich persönlich noch sehe ist, dass du eine DLL in den suspended Prozess injectest und dir dadurch die base holst oder gleich patched.
stuxn
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.06.2011
Beiträge: 7
Beitrag stuxn Mitglied 15:57:47 05.02.2012   Titel:              Zitieren

konkret1 schrieb:
-lowbyte-, aber ich will doch nicht die Base von meinem Prozess, sondern von einem anderen, der noch im SUSPENDED-State ist...

C0de4Fun, aber was tun mit dem Entrypoint?

Thereaver, das scheint so nicht zu stimmen. Dieses eine Programm ist scheinbar immer an 0x00400000, während ich bei anderen Programmen komplett zufällige .exe-Basen entdeckte (Win7 64bit).

Ist ASLR ohne reloc. Table der .exe überhaupt möglich?


Entrypoint steht in der Exe als offset drin. Jetzt merkste dir das Offset. Bleibt ja gleich bis zu nem Update. Und da wo jetzt EIP hinzeigt - Entrypointoffset = Base
C/C++ Forum :: WinAPI ::  EXE base immer 0x400000 ?   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.