Доброго времени суток! Подскажите пожалуйста почему крашится клиент при отправке пакета? Код взял другой темы, оффсеты вроде верные, если +$30 это HostPlayerStruct. Делфи XE7.
Код:
type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1,WID: DWord;
end;
procedure InjectFunc(ProcessID: Cardinal; Func, aParams: Pointer;
aParamsSize: DWord);
var
hThread: THandle;
lpNumberOfBytes:size_t; lpNumberOfBytes2: 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, lpNumberOfBytes2);
// ---- Ожидаем завершения функции
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($7A3BD0); //адрес был устаревший
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [$D6F0AC]
mov ecx, dword ptr [ecx+$30] //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 1 do
aParams.Packet[i]:=strtoint('$'+Packet[i*2+1]+Packet[i*2+2]);
end;
procedure Packet(Packet: string);
var
aParams: TParams;
PID, hProcess: DWord;
wnd: THandle;
begin
wnd:=FindWindow(nil,'Perfect World');
GetWindowThreadProcessId(wnd, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
StrToByte(Packet,aParams);
InjectFunc(hProcess,@PacketCall,@aParams,sizeof(aParams));
CloseHandle(hProcess); //забыл дописать
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
Packet('2300DC1B5086');
end;
оффсеты вроде верные, если +$30 это HostPlayerStruct
Там не HostPlayer нужен, а GameSession. Методом проб и ошибок проверь $1C, $20, $24, $28, $2C, $34, $38
Дельфи не знаю, остальные ошибки не могу указать
Update: по подсказке N00bSa1b0t'а: +$20
________________
Больше не занимаюсь читами, ушёл в серверную часть. Новый ник - int 3.
P.S. Но я всё такой же добрый модератор раздела PW.
Последний раз редактировалось Smertig; 20.01.2016 в 00:41.