[Help!!!] Delphi + Readprocessmemory

11/02/2008 00:38 redskull010101#1
I cant seem to get read process memory working in delphi i dont know why at all either, ive googled it for like 2 hours the other night and know luck. so i figured ima try here

this is my source currently
thanks in advance for help

PHP Code:
unit Unit1;

interface

uses
  Windows
MessagesSysUtilsVariantsClassesGraphicsControlsForms,
  
DialogsRegistrytlhelp32StdCtrls;

type
  TForm1 
= class(TForm)
    
Label1TLabel;
    
procedure FormCreate(SenderTObject);
  private
    { Private 
declarations }
  public
    { Public 
declarations }
  
end;

var
  
Form1TForm1;
  
cFolderstring;
  
PidPidhandleNewValueDataInteger;
  
AddressWrittenCardinal;

Const
  
process 'conquer.exe';

implementation

{$R *.dfm}

// Get Process ID
//  Example
// Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
function GetID(Const ExeFileNamestring; var ProcessIdinteger): boolean;
var
  
ContinueLoopBOOL;
    
FSnapshotHandleTHandle;
  
FProcessEntry32TProcessEntry32;
begin
  result 
:= false;
    
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS0);
    
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  
ContinueLoop := Process32First(FSnapshotHandleFProcessEntry32);
  while 
integer(ContinueLoop) <> do begin
    
if (StrIComp(PChar(ExtractFileName(FProcessEntry32.szExeFile)), PChar(ExeFileName)) = 0)
       or (
StrIComp(FProcessEntry32.szExeFilePChar(ExeFileName)) = 0)  then begin
        ProcessId
:= FProcessEntry32.th32ProcessID;
         
result := true;
       break;
    
end;
      
ContinueLoop := Process32Next(FSnapshotHandleFProcessEntry32);
  
end;
    
CloseHandle(FSnapshotHandle);
end;

// Example
//  cFolder:=(GetRegistryData(HKEY_LOCAL_MACHINE,'\software\valve\steam\', 'InstallPath'));
// ShowMessage(sFolder+'\steamapps\'+Edit1.text+'\insurgency\insurgency\')
function GetRegistryData(RootKeyHKEYKeyValuestring): variant;
var
  
RegTRegistry;
    
RegDataTypeTRegDataType;
  
DataSizeLeninteger;
  
sstring;
label cantread;
begin
  Reg 
:= nil;
  try
    
Reg := TRegistry.Create(KEY_QUERY_VALUE);
    
Reg.RootKey := RootKey;
    if 
Reg.OpenKeyReadOnly(Keythen begin
      
try
        
RegDataType := Reg.GetDataType(Value);
        if (
RegDataType rdString) or
           (
RegDataType rdExpandStringthen
          Result 
:= Reg.ReadString(Value)
        else if 
RegDataType rdInteger then
          Result 
:= Reg.ReadInteger(Value)
        else if 
RegDataType rdBinary then begin
          DataSize 
:= Reg.GetDataSize(Value);
          if 
DataSize = -1 then goto cantread;
          
SetLength(sDataSize);
          
Len := Reg.ReadBinaryData(ValuePChar(s)^, DataSize);
          if 
Len <> DataSize then goto cantread;
          
Result := s;
        
end else
cantread:
          
raise Exception.Create(SysErrorMessage(ERROR_CANTREAD));
      
except
        s 
:= ''// Deallocates memory if allocated
        
Reg.CloseKey;
        
raise;
      
end;
      
Reg.CloseKey;
    
end else
      
raise Exception.Create(SysErrorMessage(GetLastError));
  
except
    Reg
.Free;
    
raise;
  
end;
  
Reg.Free;
end;



procedure TForm1.FormCreate(SenderTObject);
begin
Address 
:= $038506C0//
    
NewValue := 1;    //
      
Data := 4;      //
      
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
    
ReadProcessMemory(PidhandlePointer(Address), @NewValueDatanil);
closehandle(Pidhandle);

label1.Caption:=
end;
end
11/02/2008 00:51 link#2
Quote:
Pidhandle := OpenProcess(PROCESS_ALL_ACCESS,False,Pid);
Pid is not initialized.
At first you have to call the GetID-Function to obtain the PID of the Process elsewise you will not get a correct Handle when calling OpenProcess.

Quote:
GetID(OFFSET process, OFFSET Pid)
Or whatever in Delphi...