PDA

Просмотр полной версии : [Помогите!] Walk Inject


DAcorp
09.09.2011, 15:13
Начал разбираться с инжектом ходьбы и встал столбом из-за того, что не знаю ASM. Подскажите, пожалуйста, на данном примере, в чём я ошибся и как сделать так чтобы работало?:eek: Вопросы в сносках в коде:

procedure WalkCall(aPParams:PParams);Stdcall;
var CallAddress1,CallAddress2,CallAddress3:Pointer;
x,y,z:single;
flying:DWORD;
begin
CallAddress1:=Pointer($0043AF60); //правильный ли я нашёл поинтер
CallAddress2:=Pointer($00431FB0); //правильный ли я нашёл поинтер
CallAddress3:=Pointer($00470b6c); //правильный ли я нашёл поинтер
x:=aPParams^.Param4;
y:=aPParams^.Param5;
z:=aPParams^.Param6;
flying:=aPParams^.Param1;
asm
pushad
mov eax, dword ptr [$A5BFCC]
mov esi, dword ptr [eax+$20]
mov ecx, dword ptr [esi+$FE0] //Это оффсет чего?
push 1
call CallAddress1
mov edi, eax
lea eax, dword ptr [esp+$0C]
push eax
push flying
mov ecx, edi
call CallAddress2
mov ecx, dword ptr [esi+$FE0]
push 0
push 1
push edi
push 1
call CallAddress3
mov eax, dword ptr [$A5BFCC]
mov eax, dword ptr [eax+$20]
mov eax, dword ptr [eax+$FE0]
mov eax, dword ptr [eax+$30]
mov ecx, dword ptr [eax+$4]
mov eax, x
mov dword ptr[ecx+$3C], eax
mov eax, z
mov dword ptr[ecx+$40], eax
mov eax, y
mov dword ptr[ecx+$44], eax
popad
end;
end;

gurin
10.09.2011, 05:05
type
PWalkParams = ^TWalkParams;
TWalkParams = packed record
Packet: array [0..100] of byte;
BaseAddr, GameAddr, CallAddress1,CallAddress2,CallAddress3: Pointer;
x,y,z: single;
flying: DWORD;
Param4: array [1..88] of widechar;
end;

procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer; aParamsSize: DWord);
var
hThread: THandle;
lpNumberOfBytes: DWord;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID <> 0 then
begin
// ---- Выделяем место в памяти процесса, и записываем туда нашу функцию
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);

// ---- Также запишем параметры к ней
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);

// ---- Создаем поток, в котором все это будет выполняться.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);

// ---- Ожидаем завершения функции
WaitForSingleObject(hThread, INFINITE);

// ---- подчищаем за собой
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end
end;

procedure WalkCall(aPParams: PWalkParams);Stdcall;
var
GameAddr, CallAddress1,CallAddress2,CallAddress3: Pointer;
x,y,z: single;
flying: DWORD;
begin
GameAddr := aPParams.GameAddr;
CallAddress1:=aPParams.CallAddress1; // Pointer($00469F00);
CallAddress2:=aPParams.CallAddress2; // Pointer($0046E090);
CallAddress3:=aPParams.CallAddress3 // Pointer($0046A340);
x:=aPParams.x;
y:=aPParams.y;
z:=aPParams.z;
flying:=aPParams.flying;
asm
pushad
mov eax, GameAddr
mov eax, dword ptr [eax]
mov esi, dword ptr [eax+$20]
mov ecx, dword ptr [esi+$FF4]
push 1
call CallAddress1
mov edi, eax
lea eax, dword ptr [esp+$0C]
push eax
push flying
mov ecx, edi
call CallAddress2
mov ecx, dword ptr [esi+$FF4]
push 0
push 1
push edi
push 1
call CallAddress3
mov eax, GameAddr
mov eax, dword ptr [eax]
mov eax, dword ptr [eax+$20]
mov eax, dword ptr [eax+$FF4]
mov eax, dword ptr [eax+$30]
mov ecx, dword ptr [eax+$4]
mov eax, x
mov dword ptr[ecx+$20], eax
mov eax, z
mov dword ptr[ecx+$24], eax
mov eax, y
mov dword ptr[ecx+$28], eax
popad
end;
end;


function Walk(x,y,z: single; flying: byte): Boolean; // flying 0-на земле 1- в полёте
var
aParams: TWalkParams;
begin
aParams.flying:=flying;
aParams.BaseAddr := Pointer($A5B90C);
aParams.GameAddr := Pointer($A5BFCC);
aParams.CallAddress1 := Pointer($00469F00);
aParams.CallAddress2 := Pointer($0046E090);
aParams.CallAddress3 := Pointer($0046A340);
aParams.x:=x;
aParams.y:=y;
aParams.z:=z;
InjectFunc(hProcess, @WalkCall, @aParams, SizeOf(aParams));
end;

DAcorp
14.09.2011, 02:01
Спасибо, на днях, как лапки дойдут протестирую и посмотрю, в чём ошибся :)

Добавлено через 22 часа 4 минуты
Хм... Полностью скопировал код... Не работает...

mov dword ptr[ecx+$20], eax
mov eax, z
mov dword ptr[ecx+$24], eax
mov eax, y
mov dword ptr[ecx+$28], eax

А здесь что значат $20 $24 и $28?

Может эт я что-то накосячил? Выкладываю PAS, только, пожалуйста, объясните что и как там, а не просто выкладывайте готовое решение :) Я разобраться хочу максимально по возможности :)


unit Unit1;

interface

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

type
TForm1 = class(TForm)
eClient: TEdit;
Label1: TLabel;
Label2: TLabel;
eTarget: TEdit;
Button1: TButton;
Button2: TButton;
Label3: TLabel;
eXYZ: TEdit;
Button3: TButton;
Button4: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure eClientClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
Function GetCharInt(Adress: Integer): Integer;
end;

type
PWalkParams = ^TWalkParams;
TWalkParams = packed record
Packet: array [0..100] of byte;
BaseAddr, GameAddr, CallAddress1,CallAddress2,CallAddress3: Pointer;
x,y,z: single;
flying: DWORD;
Param4: array [1..88] of widechar;
end;

var
Form1: TForm1;
BaseAdress: Integer;

implementation

{$R *.dfm}

procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer; aParamsSize: DWord);
var
hThread: THandle;
lpNumberOfBytes: DWord;
ThreadAddr, ParamAddr: Pointer;
begin
if ProcessID <> 0 then
begin
// ---- Выделяем место в памяти процесса, и записываем туда нашу функцию
ThreadAddr := VirtualAllocEx(ProcessID, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ThreadAddr, Func, 256, lpNumberOfBytes);

// ---- Также запишем параметры к ней
ParamAddr := VirtualAllocEx(ProcessID, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(ProcessID, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);

// ---- Создаем поток, в котором все это будет выполняться.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);

// ---- Ожидаем завершения функции
WaitForSingleObject(hThread, INFINITE);

// ---- подчищаем за собой
CloseHandle(hThread);
VirtualFreeEx(ProcessID, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(ProcessID, ThreadAddr, 0, MEM_RELEASE);
end
end;

procedure WalkCall(aPParams: PWalkParams);Stdcall;
var
GameAddr, CallAddress1,CallAddress2,CallAddress3: Pointer;
x,y,z: single;
flying: DWORD;
begin
GameAddr := aPParams.GameAddr;
CallAddress1:=aPParams.CallAddress1; // Pointer($00469F00);
CallAddress2:=aPParams.CallAddress2; // Pointer($0046E090);
CallAddress3:=aPParams.CallAddress3; // Pointer($0046A340);
x:=aPParams.x;
y:=aPParams.y;
z:=aPParams.z;
flying:=aPParams.flying;
asm
pushad
mov eax, GameAddr
mov eax, dword ptr [eax]
mov esi, dword ptr [eax+$20]
mov ecx, dword ptr [esi+$FF4]
push 1
call CallAddress1
mov edi, eax
lea eax, dword ptr [esp+$0C]
push eax
push flying
mov ecx, edi
call CallAddress2
mov ecx, dword ptr [esi+$FF4]
push 0
push 1
push edi
push 1
call CallAddress3
mov eax, GameAddr
mov eax, dword ptr [eax]
mov eax, dword ptr [eax+$20]
mov eax, dword ptr [eax+$FF4]
mov eax, dword ptr [eax+$30]
mov ecx, dword ptr [eax+$4]
mov eax, x
mov dword ptr[ecx+$20], eax
mov eax, z
mov dword ptr[ecx+$24], eax
mov eax, y
mov dword ptr[ecx+$28], eax
popad
end;
end;

function Walk(x,y,z: single; flying: byte; hProcess: HWND): Boolean; // flying 0-на земле 1- в полёте
var
aParams: TWalkParams;
begin
aParams.flying:=flying;
aParams.BaseAddr := Pointer($A5B90C);
aParams.GameAddr := Pointer($A5BFCC);
aParams.CallAddress1 := Pointer($00469F00);
aParams.CallAddress2 := Pointer($0046E090);
aParams.CallAddress3 := Pointer($0046A340);
aParams.x:=x;
aParams.y:=y;
aParams.z:=z;
InjectFunc(hProcess, @WalkCall, @aParams, SizeOf(aParams));
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
eTarget.Text:=IntToStr(GetCharInt(2828));
end;

procedure TForm1.Button3Click(Sender: TObject);
var
Buf, Process: integer;
wr: cardinal;
PID: Cardinal;
X,Y,Z: Single;
begin
GetWindowThreadProcessId(FindWindow(nil,pChar(eCli ent.Text)), @PId);
process:=OpenProcess(PROCESS_ALL_ACCESS, false, PId);
if process<>0 then begin
readprocessmemory(process, ptr(BaseAdress), @Buf, sizeof(Buf), wr);
readprocessmemory(process, ptr(Buf+$1c), @Buf, sizeof(Buf), wr);
readprocessmemory(process, ptr(Buf+$20), @Buf, sizeof(Buf), wr);
readprocessmemory(process, ptr(Buf+$3C), @X, sizeof(X), wr);
readprocessmemory(process, ptr(Buf+$44), @Y, sizeof(Y), wr);
readprocessmemory(process, ptr(Buf+$40), @Z, sizeof(Z), wr);
eXYZ.Text:=FloatToStr(X)+':'+FloatToStr(Y)+':'+Flo atToStr(Z);
CloseHandle(process);
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Walk(1,1,700,1,FindWindow(nil,pChar(eClient.Text)) );
end;

procedure TForm1.eClientClick(Sender: TObject);
begin
ShowMessage(IntToStr(FindWindow(nil,pChar(eClient. Text))));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
BaseAdress:=$A5B90C;
end;


Function TForm1.GetCharInt(Adress: Integer): Integer;
var
Buf, Process: integer;
wr: cardinal;
PID: Cardinal;
begin
GetWindowThreadProcessId(FindWindow(nil,pChar(eCli ent.Text)), @PId);
process:=OpenProcess(PROCESS_ALL_ACCESS, false, PId);
if process<>0 then begin
readprocessmemory(process, ptr(BaseAdress), @Buf, sizeof(Buf), wr);
readprocessmemory(process, ptr(Buf+$1c), @Buf, sizeof(Buf), wr);
readprocessmemory(process, ptr(Buf+$20), @Buf, sizeof(Buf), wr);
readprocessmemory(process, ptr(Buf+Adress), @buf, sizeof(Buf), wr);
Result:=Buf;
CloseHandle(process);
end;
end;



end.