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.
Delphi Hack
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Re: Delphi Hack
Çok fazla kod var ancak Delphi ile yapılmış örnek : (3D Pinball for Windows - Space Cadet)
Kaynak : http://www.cheatengine.org/forum/viewto ... 56298f8c26
Burada doğru bilgilerin yerleştirilmesi gereken yer :
$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.
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.
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;
Not : Bu kısmı çalıştırmadan önce oyunu çalıştırmış olmanız gerekiyor. Yoksa program hedefi (FindWindow ile) bulamaz.
Selamlar.