EXE base immer 0x400000 ?
-
im ToolHelpshot steht die Adresse drin.
greetz KN4CK3R
-
Hi Leute,
oder einfach mit Debug Flag starten und die Events ueberpruefen!?
Gruessle
-
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.
#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; }
-
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:
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)&buf[0]; PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)&buf[pidh->e_lfanew];
-
konkret1 schrieb:
Wie könnte ich sonst die Basisadresse der eben gestarteten .exe holen?
Via VirtualQueryEx
-
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.
-
Wieso patchst du nicht einfach das .exe file?
-
Weils eine Option sein soll.
-
Mann kann die BaseAddress mit GetModulHandle() bekommen.
#include <windows.h> int main() { HMODULE hm; hm = GetModuleHandle(NULL); return 0; }
http://msdn.microsoft.com/en-us/library/windows/desktop/ms683199(v=vs.85).aspx
-
Desweitern zeigt doch der EIP des erzeugten Threads auf den Entrypoint wenn man nen Prozess mit diesem Flag started oder ned`?
-
ASLR ist bei jedem Systemstart für jeden Prozess gleich.
Hol dir die ImageBase von deinem Prozess, dann hast du auch die des anderen.
-
-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?
-
konkret1 schrieb:
Ist ASLR ohne reloc. Table der .exe überhaupt möglich?
ist es nicht.
-
sorry ich habe wohl Müll erzählt, aber auf die kernel32 trifft es zu. Die ist in jedem Prozess trotz ASLR gleich.
-
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.
-
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