Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi werte in speicher schreiben (Trainer) (https://www.delphipraxis.net/86732-werte-speicher-schreiben-trainer.html)

chris1983 18. Feb 2007 20:37


werte in speicher schreiben (Trainer)
 
hey zusamm :hi: ich bin es mal wieder...:)
Ich hab jetzt ein zweites problem ich kann nicht in den speicher schreiben :/


hier mal der komplete source bis auf die NFO die hab ich raus genommen ^^

Delphi-Quellcode:
program GEngine;

{$define Win32App}

uses
  windows,messages,MiniFMOD,sysutils,
  win2k in 'Win2k.pas';

const

LOGO              = 113;        
ABOUT_DIALOG      = 103;        
ABOUT_CLOSE_BUTTON = 105;        
INFO_EDIT         =  14;        
info              =
..............

hier kommt die NFO rein also nicht wundern :)

......

var
Msg                : TMSG;
Win                : HWND;
Inst               : Integer;
MusicPlayer        : HMUSICMODULE;

const
WS_EX_LAYERED      = $80000;
LWA_COLORKEY       = 1;
LWA_ALPHA          = 2;

const
WindowName         = 'biohazard 4';
GAddress1           = $A0A274;
GAddress2           = $A0A27F;
GAddress3           = $63CDB2;
Gbuf1               : array[1..11] of byte = ($B9,$38,$1F,$00,$00,$09,$C1,$66,$89,$4F,$08);
Gbuf2               : array[1..5] of byte = ($E9,$34,$2B,$C3,$FF);
Gbuf3               : array[1..6] of byte = ($E9,$BD,$D4,$3C,$00,$90);

{$R res\trainer.res} 
procedure trans(Handle_:hWnd;Trans:byte);
begin
SetWindowLong(Handle_, GWL_EXSTYLE, GetWindowLong(Handle_, GWL_EXSTYLE) or WS_EX_LAYERED);
Win2k.SetLayeredWindowAttributes(Handle_, 0, Trans, LWA_ALPHA);
end;

procedure RunGame;
   var sti:tstartupinfo;
       lpPi:tprocessinformation;
begin
   ZeroMemory(@sti, SizeOf(sti));
   ZeroMemory(@lpPi, SizeOf(lpPi));

   If not CreateProcess(nil,'game.exe',nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,sti,lppi) then begin
      MessageBox(Win,'Game EXE not found','Error',mb_ok+mb_iconinformation);
   end else
      if CreateProcess(nil,'game.exe',nil,nil,false,CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil,nil,sti,lppi) then begin
         FSOUND_Close;
      end;
end;


function PatchMem(WindowName:pchar;BaseAddress:dword;buffer:pointer;LengthOfBuffer:dword):boolean;
var
   hwnd,id,ph:dword;
   written:cardinal;
   successful:longbool;
begin
  asm
  xchg eax,written
  mov eax,0
  end;
   hwnd:=findwindowexa(0,0,nil,WindowName);
   asm
   xchg edx,hwnd
   end;
      asm
      cmp hwnd,0
      end;
     
     getwindowthreadprocessid(hwnd,@id);
     ph:=openprocess(generic_read or generic_write,false,id);
     asm
     cmp ph,0
     end;
     begin
          patchmem:=false;
          exit;
     end;
     asm
        push written
        push LengthOfBuffer
        push buffer
        push BaseAddress
        push ph
        call WriteProcessMemory
        mov successful, eax
     end;
     patchmem:=successful;
     closehandle(0);
end;

procedure Quit;
begin
  EndDialog(win,0);
  FMUSIC_FreeSong(MusicPlayer);
  FSOUND_Close;
  halt;
end;

function AboutDlgProc(hWin, uMsg, wParam, lParam : Integer) : Integer; stdcall;
var
  OldInfo : array[0..65534] of Char;
  hIcon, hFont, Color, I : Integer;
begin
  if uMsg = WM_INITDIALOG then
begin
  trans(hWin,245);
  GetDlgItemText(hWin, INFO_EDIT, PChar(@OldInfo), 65535);
  SetDlgItemText(hWin, INFO_EDIT, PChar(String(OldInfo) + info));
  hFont := CreateFont(10, 0, 0, 0, 400, 0, 0, 0,
                      DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
                      DEFAULT_QUALITY, DEFAULT_PITCH, 'Terminal');
  if hFont <> 0 then SendDlgItemMessage(hWin, INFO_EDIT, WM_SETFONT, hFont, 0);
  SendDlgItemMessage(hWin, 14, 1096, 0, $0);
end;
  if uMsg = WM_LBUTTONDOWN then
begin
  ReleaseCapture;
  SendMessage(hWin,WM_NCLBUTTONDOWN,HTCAPTION,0);
end;
  Result := 0;
 if (uMsg = WM_DESTROY) or (uMsg  = WM_CLOSE) or
    ((uMsg = WM_COMMAND) and (wParam = ABOUT_CLOSE_BUTTON))
    then EndDialog(hWin,0);
end;

function SettingsDlgProc(Window : hWnd; Msg,WParam,LParam : Integer): Integer; StdCall;
var
  OldInfo : array[0..65534] of Char;
begin
case Msg of
  wm_InitDialog : begin
  trans(window,205);

  FSOUND_File_SetCallbacks(@XMFile_OpenCallback, @XMFile_CloseCallback,
     @XMFile_ReadCallback, @XMFile_SeekCallback, @XMFile_TellCallback);
  FSOUND_Init(44100, 0);
  MusicPlayer := FMUSIC_LoadSong('XMMUSIC', nil);
  FMUSIC_PlaySong(MusicPlayer);
  end;
  WM_LBUTTONDOWN : begin
  ReleaseCapture;
  SendMessage(Window,WM_NCLBUTTONDOWN,HTCAPTION,0);
  end;
  wm_Close  : DestroyWindow(Win);
  wm_Destroy : PostQuitMessage(0);
end;
  Result := 0;
   case Msg of
     WM_COMMAND : begin
   end;
 end;
end;

Procedure RunSettings;
begin
  Win := CreateDialog(hInstance,PCHar(100),0,@SettingsDlgProc);
  Showwindow(Win,SW_SHOW);
  Updatewindow(Win);
 end;

begin
  RunSettings;
while GetMessage(Msg,0,0,0) do
begin
  TranslateMessage(Msg);
  DispatchMessage(Msg);
//end;
  if (GetAsyncKeyState(VK_END) <> 0) then quit;
  if (GetAsyncKeyState($52)   <> 0) then RunGame;
  if (GetAsyncKeyState($49)   <> 0) then DialogBoxParam(hInstance, PChar(ABOUT_DIALOG), Win,@AboutDlgProc, 0);
  if (GetAsyncKeyState(VK_F1) <> 0) then patchmem(WindowName,GAddress1,@Gbuf1,sizeof(Gbuf1));
                                          patchmem(WindowName,GAddress2,@Gbuf2,sizeof(Gbuf2));
                                          patchmem(WindowName,GAddress3,@Gbuf3,sizeof(Gbuf3));

end;
end.

f.siebler 19. Feb 2007 09:37

Re: werte in speicher schreiben (Trainer)
 
hi,
es gibt seit windows xp sp2 eine funktion mit dem namen "Datenausführungsverhinderung", dieses kann aber auch von der cpu hardware seitig erledigt, bzw. unterstützt werden. diese super funktion verhindert den direkten speicherzugriff auf andere anwendungen.... ich glaube google etc. sollten dir da ein wenig weiterhelfen... :-)

chris1983 20. Feb 2007 06:09

Re: werte in speicher schreiben (Trainer)
 
weis den keiner eine antwort :|

turboPASCAL 20. Feb 2007 08:34

Re: werte in speicher schreiben (Trainer)
 
Das Teil funktioniert schon, aber deine Adressen für's Game stimmen wohl nicht.

sirius 20. Feb 2007 10:42

Re: werte in speicher schreiben (Trainer)
 
Delphi-Quellcode:
asm
  cmp ph,0 
end;
begin
  patchmem:=false;
  exit;
end;
Was ist denn das? Soll das eine If-Abfrage werden? Dann mach sie doch besser in reinem Pascal. So wird es auf jeden Fall nix. Exit wird immer ausgeführt. Dein Programm kommt nie bis writeprocessmemory.
Du solltest generell mal das ASM rausschmeißen. Es ist nicht wirklich sinnvoll (also ich kann keinen Sinn erkennen) und es gibt noch andere Probleme (nur als Beipsiel):
Delphi-Quellcode:
hwnd:=findwindowexa(0,0,nil,WindowName);
asm
  xchg edx,hwnd
  //in hwnd steht jetzt edx. Und in edx stand vorher entweder BaseAddress oder irgendein (meist nicht verwertbares)Zwischenergebnis von FindWindowEx
end;
asm //ziemlich sinnlos ASM zu beenden und gleich wieder zu "starten"
  cmp hwnd,0 //hier vergleichst du definitv nicht das hwnd aus FindwindowEx
end;
PS: Ich kann mich auch stark irren, aber es sieht alles etwas eigenartig aus.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:42 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