Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   GetUsernameEx (https://www.delphipraxis.net/181394-getusernameex.html)

Uwe Raabe 25. Nov 2014 14:15

AW: GetUsernameEx
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1281036)
Also beim ersten Aufruf geht du mit größe 0 rein

Das ist aber bei einer lokalen Variable eher Zufall. Steht auf dem Stack an der Position von nWord irgendein gültiger Wert, kann das auch mal zu einem Bufferoverflow führen.

hathor 25. Nov 2014 14:48

AW: GetUsernameEx
 
Delphi-Quellcode:
function GetUser: String;
const
   MAX_USERNAME_LENGTH = 256;
var
    Buffer: Array[0..MAX_USERNAME_LENGTH] of WIDEChar;
    Size: DWord;
begin
    Size := Pred(SizeOf(Buffer));
    Winapi.Windows.GetUserName(Buffer, Size);
    Result := StrPas(Buffer);
end;

Uwe Raabe 25. Nov 2014 15:09

AW: GetUsernameEx
 
Zitat:

Zitat von hathor (Beitrag 1281040)
Wozu Platz verschwenden: MAX_COMPUTERNAME_LENGTH = 15 !

Wobei es hier ja nicht um den Computernamen sondern um den Usernamen geht - der kann bis zu 256 Zeichen lang sein!

Bernhard Geyer 25. Nov 2014 15:25

AW: GetUsernameEx
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1281037)
Das ist aber bei einer lokalen Variable eher Zufall.

Wobei wir schon fast wieder hier wären: http://www.delphipraxis.net/182840-w...reeandnil.html

DeddyH 25. Nov 2014 15:38

AW: GetUsernameEx
 
Ich mach da einfach 2 Aufrufe wie von Bernhard schon angedeutet, siehe hier: http://forum.delphi-treff.de/index.p...tzer-auslesen/

hathor 25. Nov 2014 15:40

AW: GetUsernameEx
 
@Uwe Raabe:
Du hast recht.
Ich habe mich bei den Constanten vergriffen...
Was mein DELPHI nicht kennt, muss ich dann eben selbst definieren:

const
MAX_USERNAME_LENGTH = 256;

himitsu 25. Nov 2014 16:07

AW: GetUsernameEx
 
@hator: SizeOf .... Length ... Du mußt aufpassen, ob die API die Größe in Byte oder Chars haben will und ob die Größenangabe inklusive oder exclusive der abschließenden #0 ist.

hathor 25. Nov 2014 16:33

AW: GetUsernameEx
 
Bei
const
MAX_USERNAME_LENGTH = 256;
var
Buffer: Array[0..MAX_USERNAME_LENGTH] of WIDEChar;


ist alles ALL INCLUSIVE.

Aber sooo lange UserNames hat wohl keiner...
da würde auch Buffer: Array[0..10] of WIDEChar; reichen..:-D

hathor 25. Nov 2014 16:36

AW: GetUsernameEx
 
OFFTOPIC:

Was ist das eigentlich für ein seltsamer Absturz?
Gerade ist mein WIN 8.1 abgestürzt.
Nach dem Booten war FIREFOX wieder vollständig da, incl. dem Edit-Fenster von der DP.:!::!::!:

himitsu 25. Nov 2014 16:55

AW: GetUsernameEx
 
Zitat:

Delphi-Quellcode:
MAX_USERNAME_LENGTH = 256;
var
Buffer: Array[0..MAX_USERNAME_LENGTH] of WIDEChar;

Das Array ist 257 Zeichen lang, der API wird SizeOf übergeben, also 257*2 aka 514 Byte, was die API aber als Char interpretiert und somit ein Bufferoverrun vorprogrammiert ist. (bei Unicode)
Dann erwartet die API die Größe exkl. der #0, womit sie mochmal weitere 2 Byte überschreiben könnte.

Die API würde zwar nicht außerhalb des Puffers schreiben, aber wenn man ihr eine falsche Größe nennt, dann kann sie natürlich nichts dafür.
0..10 ... bei 11 bis 22 Chars würde es also Spaß machen. :roll:


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:33 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz