Delphi Hack

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
dpcmsx
Üye
Mesajlar: 22
Kayıt: 06 Eyl 2011 04:25

Re: Delphi Hack

Mesaj gönderen dpcmsx »

Oyunların adam sayısı, güç, puan, istatistik gibi kısımları değiştirmek için önce nerede olduğunu bulmanız gerek. Örneğin bir oyunda 3 hakkınız ve ölünce 2 hakka düştü. İşte bunu oyun içinde hafızada bir yerde de bu düşme işlemi (genelde) sayısal olarak olur (Eğer programcı kendisi özel bir yöntem geliştirmediyse)

Bu işi en iyi yapan program Cheat Engine (v6.0) isimli bir programdı. Önce oyunda iken güncel bilgiyi (kaç adam hakkı, yüzde kaç güç gibi) girip aratıyorsunuz. Program konuyla ilgili bütün yerleri (girdiğiniz bilgiye uyan) buluyor. Sonra ikinci aşamaya geçiyorsunuz örneğin vuruluyor ve adam hakkınız 2'ye düşüyor. Aynı program ile güncel bu durumu aratınca size nelerin değiştiğini gösteriyor. Freeze (dondurma) yaparak bulduğunuz noktanın doğru olup olmadığına emin oluyorsunuz. Eğer doğru ise o zaman elinizde hafıza adresleri (yama - patch ) adresleri oluyor. Delphi ile Virtual Memory protection'ı açıp (kaldırıp) buraya istediğiniz değeri yazıyorsunuz. İsterseniz bir tuş ayırıp bu işi tuşa basınca yapmasını sağlayabilirsiniz.

Tabi bu normal oyunlar için bir yöntem. Zamanında Assembler ile birçok oyuna böyle ""cheat" yapmıştım. Ancak yeni oyunlar (özellikle büyük oyunlar) genelde aynı tip 3d motorları kullanıyorlar. Bunlarda bu kısımları bulmak daha kolay zira script encoding yaptıkları için genelde hep aynı bölgelerde aynı işlemler oluyor.

Verdiğiniz kodun bir anlamı yok. Zira $02D1E2FC sayısı hangi oyuna yada hangi module göre yazılmış belli değil. Zaten bu kadar kolayda değil. İnternette "game + trainer+delphi" diye aratınca gerçek örneklerine ulaşabilirsiniz. Özellikle ilk çıkan sonuç oldukça tatminkar bir şekilde anlatmaktadır.
dpcmsx
Üye
Mesajlar: 22
Kayıt: 06 Eyl 2011 04:25

Re: Delphi Hack

Mesaj gönderen dpcmsx »

Çok fazla kod var ancak Delphi ile yapılmış örnek : (3D Pinball for Windows - Space Cadet)

Kod: Tümünü seç

unit a; 

interface 

uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, StdCtrls, ShellApi; 

type 
  TForm1 = class(TForm) 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    procedure Button1Click(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
  end; 

var 
  Form1: TForm1; 
  WindowName : integer; 
  ProcessId : integer; 
  ThreadId : integer; 
  buf : PChar; 
  HandleWindow : Integer; 
  write : cardinal; 
    
Const WindowTitle = '3D Pinball for Windows - Space Cadet'; 
      Address = $00A80C62; 
      PokeValue = $00003039; 
      NumberOfBytes = 4; 

implementation 

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject); 
begin 
// 
end; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
  WindowName := FindWindow(nil,WindowTitle); 
  If WindowName = 0 then 
  begin 
    MessageDlg('The game must be running in the background.Run it now, and then try again.', mtwarning,[mbOK],0); 
  end; 

  ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId); 
  HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId); 

  GetMem(buf,1); 
  buf^ := Chr(PokeValue); 
  WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write); 
  FreeMem(buf); 
  closehandle(HandleWindow); 
end; 


end.
Kaynak : http://www.cheatengine.org/forum/viewto ... 56298f8c26

Burada doğru bilgilerin yerleştirilmesi gereken yer :

Kod: Tümünü seç

Const WindowTitle = '3D Pinball for Windows - Space Cadet'; 
      Address = $00A80C62; 
      PokeValue = $00003039; 
      NumberOfBytes = 4; 
$00a80c62 adresine $00003039 değerini, 4 byte olarak yazılacak. Fakat bu sadece bu oyun için (hatta bu sürüm için) geçerli. Kendi oyunlarınızda ise bu adresi yine dediğim gibi Cheat Engine 6 gibi bir program yardımıyla bulmanız gerekiyor.


Not : Bu kısmı çalıştırmadan önce oyunu çalıştırmış olmanız gerekiyor. Yoksa program hedefi (FindWindow ile) bulamaz.

Selamlar.
Cevapla