Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   XE2 Bios Daten auslesen (https://www.delphipraxis.net/162881-xe2-bios-daten-auslesen.html)

bernhard_LA 8. Sep 2011 13:25

XE2 Bios Daten auslesen
 
Anbei ein Code Fragment zum Auslesen der Biosdaten, unter D7 alles prima, nur Delphi XE2 mault jetzt

a) N : DWORD scheint falsch zu sein
b) array of Char nach Array of AnsiChar war nicht hilfreich



procedure BiosDaten(var Name, Copyright, Datum, SN : string);
var
Buffer : Array[0..8] Of Char;
N : DWORD; ------->>>> [DCC Fehler] E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
begin

ReadProcessMemory( GetCurrentProcess,Ptr( $FE061),@Buffer,8,N);
Buffer[8]:=#0; ----->>>>> [DCC Fehler]Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Name:=StrPas(Buffer);

........

end;

Union 8. Sep 2011 13:36

AW: XE2 Bios Daten auslesen
 
Jetzt ist die Frage: Welches ReadProcessMemory wird denn da verwendet? Schau Dir mal die Deklaration an.

Uwe Raabe 8. Sep 2011 13:41

AW: XE2 Bios Daten auslesen
 
Mach aus dem N ein NativeUInt.

DeddyH 8. Sep 2011 14:06

AW: XE2 Bios Daten auslesen
 
Und m.E.n muss es dann
Delphi-Quellcode:
ReadProcessMemory( GetCurrentProcess,Ptr( $FE061),@Buffer,8 * SizeOf(Char),N);
heißen.

Neutral General 8. Sep 2011 14:08

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von DeddyH (Beitrag 1122672)
Und m.E.n muss es dann
Delphi-Quellcode:
ReadProcessMemory( GetCurrentProcess,Ptr( $FE061),@Buffer,8 * SizeOf(Char),N);
heißen.

Davon abgesehen, dass
Delphi-Quellcode:
Buffer : Array[0..8] Of Char;

9 Chars sind und nicht 8.

Uwe Raabe 8. Sep 2011 14:11

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von DeddyH (Beitrag 1122672)
Und m.E.n muss es dann
Delphi-Quellcode:
ReadProcessMemory( GetCurrentProcess,Ptr( $FE061),@Buffer,8 * SizeOf(Char),N);
heißen.

Das hängt allerdings davon ab, ob die Daten im BIOS als Ansi- oder WideString abgelegt sind. Ich bin davon ausgegangen, daß die Änderung des Arrays auf AnsiChar sowieso schon erfolgt ist.

Uwe Raabe 8. Sep 2011 14:11

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von Neutral General (Beitrag 1122673)
Zitat:

Zitat von DeddyH (Beitrag 1122672)
Und m.E.n muss es dann
Delphi-Quellcode:
ReadProcessMemory( GetCurrentProcess,Ptr( $FE061),@Buffer,8 * SizeOf(Char),N);
heißen.

Davon abgesehen, dass
Delphi-Quellcode:
Buffer : Array[0..8] Of Char;

9 Chars sind und nicht 8.

In Buffer[8] steht am Ende ja auch #0!

Neutral General 8. Sep 2011 14:15

AW: XE2 Bios Daten auslesen
 
Naja, nicht wenn er nur 8 Chars liest... Sonst steht in Buffer[8] ein zufälliger Stack-Inhalt.
Quatsch! Jetzt weiß ich was du meinst :wall:

PS: Sind die BIOS-Infos wirklich WideStrings? Ich schätze mal man muss da AnsiChars nehmen.
(Es sei denn ich irre mich)

Uwe Raabe 8. Sep 2011 14:21

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von Neutral General (Beitrag 1122676)
Naja, nicht wenn er nur 8 Chars liest... Sonst steht in Buffer[8] ein zufälliger Stack-Inhalt.
Quatsch! Jetzt weiß ich was du meinst :wall:

PS: Sind die BIOS-Infos wirklich WideStrings? Ich schätze mal man muss da AnsiChars nehmen.
(Es sei denn ich irre mich)

Das werden wohl AnsiStrings sein, sonst hätte es in D7 nicht mit
Delphi-Quellcode:
array of char
funktioniert.

DeddyH 8. Sep 2011 14:27

AW: XE2 Bios Daten auslesen
 
Ich hätte ja gedacht, dass es dann so gehen müsste:
Delphi-Quellcode:
procedure BiosDaten(var Name, Copyright, Datum, SN: AnsiString);
const
  BUFDATASIZE = 8;
var
  Buffer: Array[0..BUFDATASIZE] Of AnsiChar;
  N: DWORD {bzw. NativeUInt};
begin
  ReadProcessMemory(GetCurrentProcess, Ptr($FE061), @Buffer, BUFDATASIZE, N);
  Buffer[BUFDATASIZE] := #0;
  Name := AnsiString(Buffer);
  //...
end;
Allerdings bekomme ich da auch kein gescheites Ergebnis (XE auf Vista 32).

Neutral General 8. Sep 2011 14:36

AW: XE2 Bios Daten auslesen
 
Ja habs eben auch probiert aber nix rausbekommen.

Stimmt die Adresse denn überhaupt?
Hab jetzt im Internet beim groben Googlen nichts gefunden.

Uwe Raabe 8. Sep 2011 14:51

AW: XE2 Bios Daten auslesen
 
Schon mal den Rückgabewert von ReadProcessMemory überprüft?

DeddyH 8. Sep 2011 14:56

AW: XE2 Bios Daten auslesen
 
*Pff* wozu, wir lieben das Risiko :lol:

Nee, im Ernst, das geht schon in die Hose.
Zitat:

Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen

Neutral General 8. Sep 2011 14:58

AW: XE2 Bios Daten auslesen
 
Ja, hab ich auch grad rausbekommen :mrgreen:

Aber was sagt uns das? Hat er mal so bisschen gelesen, dann aber keine Lust mehr gehabt oder was? -.-
Finde die Fehlermeldung komisch...

Uwe Raabe 8. Sep 2011 15:03

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von Neutral General (Beitrag 1122689)
Ja, hab ich auch grad rausbekommen :mrgreen:

Aber was sagt uns das? Hat er mal so bisschen gelesen, dann aber keine Lust mehr gehabt oder was? -.-
Finde die Fehlermeldung komisch...

Zitat:

The function fails if the requested read operation crosses into an area of the process that is inaccessible.
Wundert mich sowieso, daß in einem System mit virtuellem Prozess-Speicher überhaupt eine absolute Speicheradresse gelesen werden kann.

Neutral General 8. Sep 2011 15:07

AW: XE2 Bios Daten auslesen
 
Da hätte ich aber eher eine Meldung "Zugriff verweigert" o.ä. erwartet. Finde die Meldung etwas.. komisch.

Zitat:

Wundert mich sowieso, daß in einem System mit virtuellem Prozess-Speicher überhaupt eine absolute Speicheradresse gelesen werden kann.
Das hat doch damit nichts zu tun. Du kannst sowohl für den virtuellen als auch für den physischen Speichern absolute Adressen angeben.

Horst0815 8. Sep 2011 16:11

AW: XE2 Bios Daten auslesen
 
http://www.delphipraxis.net/789161-post3.html sollte der Grund sein

himitsu 8. Sep 2011 16:28

AW: XE2 Bios Daten auslesen
 
Jupp, der erste Speicherbereich ($00000000..$0000FFFF) ist nicht verfügbar.

Und wenn es das wäre, dann könnte man wohl auch direkt auf seinen eigenen Speicher zugreifen.

Delphi-Quellcode:
procedure TForm6.FormCreate(Sender: TObject);
type
  TBIOSString8 = array[0..7] of AnsiChar;
  PBIOSString8 = ^TBIOSString8;
begin
  Caption := PBIOSString8($FE061)^;
end;

bernhard_LA 15. Sep 2011 13:03

AW: XE2 Bios Daten auslesen
 
OK der Ansatz zum Auslesen der BIOS Daten spielt nur bis Win 2K ....

muss diese Funktion wohl entsorgen :-(

s3rh47 13. Dez 2011 08:34

AW: XE2 Bios Daten auslesen
 
ReadProcessMemory und WriteProcessMemory funktoniert beim Delphi sieben einwandfrei. Aber beim xe2 immer diese trottole fehler bekomme ich. Ich kann kein mehr lösung finden

[DCC Fehler] Unit1.pas(59): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen

bitte hilfe :S

Code:
uses
Windows, Messages;

{$R Loader.RES}

var
  si : Startupinfo;
  pi : Process_Information;
  NewData : array[0..1] of byte = ($90,$90);
  NewDataSize : DWORD;
  Bytesread : DWORD;
  Olddata : array[0..1] of byte;

begin
   NewDataSize := sizeof(newdata);
  IF CreateProcess(nil,'Example.exe',nil,nil,FALSE,
                              Create_Suspended,nil,nil,si,pi) = true then

  begin
    ReadProcessMemory(pi.hprocess,Pointer($403CEA),@olddata,2,bytesread);
    if (olddata[0] = $75) and (olddata[1] = $19) then
    begin
      WriteProcessMemory(pi.hProcess, Pointer($403CEA), @NewData, NewDataSize, bytesread);
      ResumeThread(pi.hThread);
    end else
  begin
    Messagebox(0,pchar('Bytes not found! Wrong version?...'),pchar('Error'),mb_iconinformation);
    TerminateProcess(PI.hProcess,0);
  end;
  CloseHandle(PI.hProcess);
  CloseHandle(PI.hThread);
end;
end.

himitsu 13. Dez 2011 09:10

AW: XE2 Bios Daten auslesen
 
Schau was die Funktion für Parametertypen haben will und dann paß' deine Variablen daran an.

s3rh47 13. Dez 2011 09:30

AW: XE2 Bios Daten auslesen
 
function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: SIZE_T; var lpNumberOfBytesRead: SIZE_T): BOOL; stdcall;

1. Parameter = Thandle
2. Parameter = Pointer
3. Parameter = Pointer
4. Parameter = SIZE_T
5. Parameter = SIZE_T

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);

var
 FileName : String;
 StartInfo : TStartUpInfo;
 ProcInfo : TProcessInformation;
 AllGood : Boolean;
 ReadByte : SIZE_T;
 OrjinalBytes : byte;
begin

  OrjinalBytes:=($90);
  FileName := 'Beispiel.exe';
  //Fill the PRocinfo and Startinfo with a buffer
  FillChar(StartInfo,SizeOf(TStartupInfo),#0);
  FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
  //Lets "Try" to create the paltalk process in a suspended state
  AllGood := CreateProcess(Pchar(Dosya),nil,nil,nil,False,CREATE_SUSPENDED,nil,nil,StartInfo,ProcInfo);

  if Allgood then
  begin

  ShowMessage('Geht Schon');

   ReadProcessMemory(PRocInfo.hProcess,Pointer($00146565),@OrjinalBytes,1,1,ReadByte);

  end;

   ResumeThread(ProcInfo.hThread);

   CloseHandle(ProcInfo.hProcess);

end;

Ist wieder gleich :S

Luckie 13. Dez 2011 09:32

AW: XE2 Bios Daten auslesen
 
Da stimmt wohl der Aufruf mit der Deklaration nicht über ein, was die Datentypen angeht. Und was ist hier Zeile 59?

s3rh47 13. Dez 2011 09:40

AW: XE2 Bios Daten auslesen
 
Und Warum bei Delphi7 kein problem ?

Ich habe alle Varible probiert geht nicht ! byte , word,dword, integer , Char , PChar , AnsiChar , WideChar, Pointer ,real, Extended ,string,ShorString trotzdem immer wieder gleiche Fehler...

Kann auch Assemblye !

himitsu 13. Dez 2011 12:37

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von s3rh47 (Beitrag 1141091)
Und Warum bei Delphi7 kein problem ?

Ich habe alle Varible probiert geht nicht ! byte , word,dword, integer , Char , PChar , AnsiChar , WideChar, Pointer ,real, Extended ,string,ShorString trotzdem immer wieder gleiche Fehler...

Kann auch Assemblye !

Nicht probieren .... NACHSEHN und dann machen :)
Und da über VAR gemeckert wird, kann es nur lpNumberOfBytesRead sein.

PS: zähle mal deine Parameter

s3rh47 13. Dez 2011 13:04

AW: XE2 Bios Daten auslesen
 
Also wenn ich keine Seh probleme hab , ich sehe dort 5 parameter :-D

http://i40.tinypic.com/dmxnpy.jpg

Wo ist fehler jetzt ? Ich kann nicht mehr sehen :cry:

DeddyH 13. Dez 2011 13:45

AW: XE2 Bios Daten auslesen
 
Was denn nun, Read oder Write? Ich habe mal gezählt:
Zitat:

Delphi-Quellcode:
ReadProcessMemory(PRocInfo.hProcess (* 1 *),
                  Pointer($00146565)(* 2 *),
                  @OrjinalBytes    (* 3 *),
                  1                 (* 4 *),
                  1                 (* 5 *),
                  ReadByte         (* 6 *));

Passt nicht ganz, oder?

himitsu 13. Dez 2011 14:21

AW: XE2 Bios Daten auslesen
 
Wobei hier Delphi sogar hilft.

Schreib mal die öffnende Klammer "(" neu (k.A. aber vielleicht gibt's da auch eine Tastenkombi dafür) und schon sollte die Delphi den aktuellen Parameter nennen ... nun geht man nur noch alle Parameter durch und vergleicht den angebenen "Wert", mit den angezeigten Parameter-Informationen.

s3rh47 13. Dez 2011 14:28

AW: XE2 Bios Daten auslesen
 
Ich brauche beide Write und read .

Sorry die Parameter is 6 yes aber hab auch genau 6 parameter geschrieben


Es tut mir Leid ich kann eure nicht verstanden. Sie können ja einfach direkt fehler sagen , aber sagen sie nicht und dauert länger...

Hab funksion schon hier gescrieben..

1 :=

function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
nSize: SIZE_T; var lpNumberOfBytesRead: SIZE_T): BOOL; stdcall;


2 := Bild gezeigt ! http://i40.tinypic.com/dmxnpy.jpg

hab auch probiert

statt cardinal , dword und @ReadByte gemacht trotzdem gleich

DeddyH 13. Dez 2011 14:39

AW: XE2 Bios Daten auslesen
 
ReadProcessMemory erwartet 5 Parameter, Du übergibst 6.

s3rh47 13. Dez 2011 14:50

AW: XE2 Bios Daten auslesen
 
Zitat:

Zitat von DeddyH (Beitrag 1141190)
ReadProcessMemory erwartet 5 Parameter, Du übergibst 6.

Warum sagt das nicht zu viele parameter dann :-D

Also egal haben sie Xe2 oder Xe kannst du bitte eine bespiele.exe probieren (starten und sein bytes ändern ) in XE.

Wenn du dass kannst dann solved :thumb:

Ich habe es genau beim Delphi7 project kopiert und so lange kriege ich mit diese fehler..

Also ich muss zuerst mit read bytes lesen ob es korreckt ist dann muss mit write angegebene byte ändern.

Das heisst LOADER mit DELPHI ... PS: Nicht für illegal

himitsu 13. Dez 2011 15:21

AW: XE2 Bios Daten auslesen
 
Weil "zuviele Parameter komme, wenn alle vorherigen Parameter erfolgreich üvergeben werden konnten und am Ende noch Parameter gefunden werden, welche die Prozedur nicht mehr haben will.
Genauso umgekehrt: Möchte die Prozedur mehr Parameter, als angegeben wurden, wird auch gemeckert.

Aber hier trat eben zuerst ein Problem mit einem Parameter auf, weswegen der Compiler garnicht erst bis zum Ende der Parameterliste kam und erstmal sich über diesen einen Parameter beschwert hat. :zwinker:

bernhard_LA 14. Dez 2011 17:51

AW: XE2 Bios Daten auslesen
 
ich denke der erste Code war clean unter WIN 2000 - dann lange nicht verwendet und jetzt unter WIN 7 kam das böse Erwachen ...

Windows /Microssoft hat uns wohl hier erfolgreich ausgebremst

himitsu 14. Dez 2011 18:32

AW: XE2 Bios Daten auslesen
 
In Bezug auf die 64-Bit-Erweiterung wurden in/bis XE2 einige Typendeklarationen berichtig, welche eigentlich schon immer falsch waren und Andere wurden falsch, als sich irgendein I*hust* überlegte den Integer nicht mehr dynamisch zu belassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.

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