Подготовленные функции для инжекта в память клиента (руоф)
Адреса Устарели
Большей частью тема скопирована с форума [Ссылки могут видеть только зарегистрированные пользователи. ]
Я добавил несколько своих инжектов, а также "тел пакетов", кроме того все инжекты, которые могут быть удобно заменены на инжект отсылки пакетов - не описаны.
Код представлен на Delphi.
Все значения в дампах приведены в шестнадцатиричной кодировке.
Код:
type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1,Param2,Param3: DWord;
Param4: array [1..100] of widechar;
end;
const
PW_BASE_ADDRESS = $009C0E6C;
PW_GAMERUN_ADDR = $009C1514;
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 PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
Len:DWord;
begin
CallAddress:=Pointer($0060E310); // Старый адрес - $005D7C30
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [PW_BASE_ADDRESS]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure StrToByte(Packet:string; var aParams:TParams);
var
i:integer;
begin
i:=(length(Packet) div 2)-1;
aParams.Param1:=i+1;
for i:=0 to i do
aParams.Packet[i]:=strtoint('$'+bytecode[i*2+1]+bytecode[i*2+2]);
end;
procedure Packet(Packet: string);
var
aParams: TParams
begin
StrToByte(Packet,aParams);
InjectFunc(ProcessID,@PacketCall,@aParams,sizeof(aParams));
end;
Песочный - номер ячейки инвентаря. Оранжевый - id предмета.
28 00 00 01 1F 00 A9 21 00 00 - Использование итема.
Песочный - номер ячейки из которой требуется переместить предмет.
Оранжевый - номер целевой ячейки.
Если в целевой ячейке есть предмет - предметы поменяются местами.
0C 00 01 02 - Перемешение итема в инвентаре.
Песочный - номер ячейки инвентаря, в которой лежит предмет.
Оранжевый - номер целевой ячейки на "кукле".
11 00 01 05 - Одеть предмет.
WID - как я понимаю это место кирки в инвентаре. Последняя ячейка в нерасширенном инвентаре это 31 или 32?
_type - Совсем не понимаю что это.. Тип ресурса? В каком виде он должен быть?
Вызывал функцию такими способами:
AutoDrop_Mining(hProcess,31,0);
AutoDrop_Mining(hProcess,31,1);
AutoDrop_Mining(hProcess,31,2);
AutoDrop_Mining(hProcess,31,3);
AutoDrop_Mining(hProcess,31,4);
AutoDrop_Mining(hProcess,32,0) и тп.
даже: AutoDrop_Mining(hProcess,31,3075);
Не копает =\ В чём может быть проблема?
Уважаемый Dinmaite прошу вас помогите найти ошибку.
Я перепробовал все инжекты но почемуто работает только джамп, остальные выбивают клиент. Вот мой код
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
PParams = ^TParams;
TParams = packed record
Param1: DWORD;
Param2: DWORD;
Param3: single;
Param4: single;
Param5: single;
Param6: byte;
end;
type
TForm1 = class(TForm)
btnAttach: TButton;
btnToggleFly: TButton;
mInfo: TMemo;
btnTownPortal: TButton;
procedure btnAttachClick(Sender: TObject);
procedure btnTownPortalClick(Sender: TObject);
procedure btnToggleFlyClick(Sender: TObject);
private
public
end;
var
Form1: TForm1;
hWindow: HWND;
gamePID, hProcess: cardinal;
implementation
{$R *.dfm}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~ Инжектор
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure InjectFunc(hProcess: Cardinal; Func: Pointer; aParams: Pointer; aParamsSize: DWORD);
var
hThread: THandle;
lpNumberOfBytes: DWORD;
ThreadAddr, ParamAddr: Pointer;
begin
if hProcess<>0 then
begin
// ---- Выделим место в памяти процесса и запишем туда нашу функцию
ThreadAddr := VirtualAllocEx(hProcess, nil, 256, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, ThreadAddr, Func, 256, lpNumberOfBytes);
// ---- Также запишем параметры к ней
ParamAddr := VirtualAllocEx(hProcess, nil, aParamsSize, MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hProcess, ParamAddr, aParams, aParamsSize, lpNumberOfBytes);
// ---- Создадим поток, в котором это всё будет выполняться
hThread := CreateRemoteThread(hProcess, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Ожидаем, пока функция отработает
WaitForSingleObject(hThread, INFINITE);
// ---- Подчищаем за собой
CloseHandle(hThread);
VirtualFreeEx(hProcess, ParamAddr, 0, MEM_RELEASE);
VirtualFreeEx(hProcess, ThreadAddr, 0, MEM_RELEASE);
end
end;
procedure TForm1.btnAttachClick(Sender: TObject);
begin
hWindow := FindWindow('ElementClient Window',nil);
if hWindow <> 0 then begin
GetWindowThreadProcessId(hWindow, @gamePID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, gamePID);
mInfo.Lines.Add('Нашёл клиента PW. PID='+IntToStr(gamePID)+' hProcess='+IntToStr(hProcess));
btnTownPortal.Enabled := true;
btnToggleFly.Enabled := true;
end else begin
mInfo.Lines.Add('Клиент PW не найден');
end;
end;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Команда использования скилла
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
procedure UseSkillCall(aPParams:PParams); Stdcall;
var
Address: pointer;
begin
Address := Pointer($004B0CE0);
asm
pushad
mov ecx, dword ptr [$009C1514]
mov ecx, dword ptr [ecx + $20]
mov ecx, dword ptr [ecx + $3A8]
push $FFFFFF00
push $00
mov ecx, [$1]
push ecx
mov ecx, edi
call Address
popad
end;
end;
procedure TForm1.btnTownPortalClick(Sender: TObject);
var
aParams : TParams;
begin
InjectFunc(hProcess, @UseSkillCall, @aParams, SizeOf(aParams));
end;
procedure JumpCall(aPParams:PParams);Stdcall;
var CallAddress:pointer;
begin
CallAddress:=pointer($00476970);
asm
pushad
push $0
push $C8
push $1
push $3F800000
push $4
mov ecx, dword ptr [$009C1514]
mov ecx, dword ptr [ecx+$20]
mov eax, $41200000
mov dword ptr[ecx+$B80], $0
mov dword ptr[ecx+$B94], $0
mov dword ptr[ecx+$B98], $0
mov dword ptr[ecx+$B9C], $0
mov dword ptr[ecx+$BA4], eax
mov dword ptr[ecx+$BF4], $1
mov dword ptr[ecx+$BFC], eax
call CallAddress
popad
end;
end;
procedure TForm1.btnToggleFlyClick(Sender: TObject);
var aParams:TParams;
begin
InjectFunc(hProcess,@JumpCall,@aParams,SizeOf(aParams));
end;
end.
Помогите разобраться
Добавлено через 2 минуты
Почему-то инжект на использование скила 1 выбивает клиент, и я немогу понять почему.
Последний раз редактировалось Njkzy80; 31.01.2011 в 19:00.
Причина: Добавлено сообщение