|
Walk Inject - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
09.09.2011, 15:13
|
#1
|
|
|
|
Пехотинец
|
Регистрация: 27.02.2010
Сообщений: 72
Популярность: 71
Сказал(а) спасибо: 27
Поблагодарили 35 раз(а) в 16 сообщениях
|
Walk Inject
Начал разбираться с инжектом ходьбы и встал столбом из-за того, что не знаю ASM. Подскажите, пожалуйста, на данном примере, в чём я ошибся и как сделать так чтобы работало? Вопросы в сносках в коде:
Код:
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;
Последний раз редактировалось DAcorp; 09.09.2011 в 15:20.
|
|
|
10.09.2011, 05:05
|
#2
|
|
|
|
Сержант
|
Регистрация: 18.12.2009
Сообщений: 152
Популярность: 1075
Сказал(а) спасибо: 45
Поблагодарили 204 раз(а) в 67 сообщениях
|
Re: Walk Inject
Код:
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;
Последний раз редактировалось gurin; 10.09.2011 в 05:11.
|
|
|
Пользователь сказал cпасибо:
|
|
14.09.2011, 02:01
|
#3
|
|
|
|
Пехотинец
|
Регистрация: 27.02.2010
Сообщений: 72
Популярность: 71
Сказал(а) спасибо: 27
Поблагодарили 35 раз(а) в 16 сообщениях
|
Re: Walk Inject
Спасибо, на днях, как лапки дойдут протестирую и посмотрю, в чём ошибся
Добавлено через 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(eClient.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)+':'+FloatToStr(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(eClient.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.
Последний раз редактировалось DAcorp; 15.09.2011 в 00:05.
Причина: Добавлено сообщение
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
[Программа] Inject
|
Карикатуро |
Общение и обсуждение S4 League |
4 |
02.08.2011 14:34 |
[Продам] Inject ВХ
|
nokia03 |
Point Blank |
1 |
23.01.2011 05:29 |
Inject DLL in CS 1.6
|
yg-400 |
Общение и обсуждение Counter-Strike |
2 |
14.09.2010 21:42 |
[Обсуждение] inject
|
horderbord |
Общение и обсуждение Aion |
3 |
26.05.2010 19:42 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 00:09.
|
|