Falsche Calling Convention?
-
Hallo Forum,
ich möchte die Funktion GetComputerNameExA in einem Projekt benutzen das auch auf Win95 laufen soll. Da die Api dort nicht direkt läuft muß ich sie dynamisch über LoadLibrary ansteuern.
Dieser Source dunktioniert aber nicht, weil der ESP nicht gesichert wurde. Die anderen beiden calls sind aber auch nicht richtig.
In dem Source gibt es zwei Aufrufe von GetComputerNameExA. Wenn ich einen auskommentiere gibt es den Absturz nicht mehr, der Buffer ist aber mit Müll beschrieben. Wenn der zweite Aufruf aktiv ist, wird hier der Buffer zwar gefüllt, ich erhalte aber den ESP Fehler. Was mache ich falsch?Vielen Dank
Peter
#include <windows.h> #include <stdio.h> #include <malloc.h> #define BUFFER_SIZE 1000 typedef enum _COMPUTER_NAME_FORMAT { ComputerNameNetBIOS, ComputerNameDnsHostname, ComputerNameDnsDomain, ComputerNameDnsFullyQualified, ComputerNamePhysicalNetBIOS, ComputerNamePhysicalDnsHostname, ComputerNamePhysicalDnsDomain, ComputerNamePhysicalDnsFullyQualified, ComputerNameMax } COMPUTER_NAME_FORMAT; // GetComputerNameExA() typedef int (__stdcall *MyFunc) ( int, char *, unsigned long * ); // typedef int (__cdecl *MyFunc) ( int, char *, unsigned long * ); // typedef int (__stdcall *MyFunc) ( int, char *, unsigned long * ); int ReadDomainWinXP() { char name[MAX_COMPUTERNAME_LENGTH + 1]; unsigned long size = MAX_COMPUTERNAME_LENGTH + 1; MyFunc GetComputerNameExA; HINSTANCE hInst; hInst = LoadLibrary("kernel32.dll"); if(hInst != NULL) { GetComputerNameExA = (MyFunc)GetProcAddress(hInst, "GetComputerNameExA"); GetComputerNameExA(ComputerNamePhysicalDnsFullyQualified, name, &size); printf("WinXP full domain: %s\n", name); GetComputerNameExA(ComputerNameDnsDomain, name, &size); printf("WinXP domain: %s\n", name); } return 0; } int main(void) { ReadDomainWinXP(); }
-
Ich kann keinen Fehler feststellen.
Du musst abersize = MAX_COMPUTERNAME_LENGTH+1;Vor jeder Abfrage neu setzen!
-
Hallo Martin,
es lag daran das MAX_COMPUTERNAME_LENGTH nicht die richtige Buffergröße war. Bei dem Aufruf wird die Domain auch noch zurückgegeben. Durch das falsche setzen der Size kam es dann zum Bufferoverflow...
Vielen Grüße
Peter