Проблема такова как выбрать квест в открытом диалоге с нпс? Пробовал делать так:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1: DWord;
end;
const
PW_BASE_ADDRESS = $00A571E0;
GA = $00A57ACC;
var
Form1: TForm1;
rw: cardinal;
hProcess: Dword;
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 PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
Len:DWord;
begin
CallAddress:=Pointer($0063DB70);
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('$'+Packet[i*2+1]+Packet[i*2+2]);
end;
procedure Packet(Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
InjectFunc(hProcess,@PacketCall,@aParams,sizeof(aParams));
end;
procedure ConnectClient;
var
PID: Dword;
WID: Thandle;
begin
WID := FindWindow(nil, 'Perfect World');
GetWindowThreadProcessId(WID, @PID);
hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID);
end;
function Read_32(Addr: Dword): Dword;
var value: Dword;
begin
ReadProcessMemory(hProcess, ptr(addr), @value, sizeof(value), rw);
result := value;
end;
function WinStruct(WinName: string): Dword;
var
arr, addr, next, res: Dword;
mass: array[1..20] of Char;
name: String;
i: integer;
begin
arr := Read_32(GA);
arr := Read_32(arr + $18);
arr := Read_32(arr + $08);
addr := Read_32(arr + $AC);
while (addr <> 0) do
begin
next := Read_32(addr);
addr := Read_32(addr + $08);
res := addr;
addr := Read_32(addr + $4C);
ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
i := 1;
name := '';
while (mass[i] <> '') do
begin
name := name + mass[i];
inc(i);
end;
if (name = WinName) then
begin
result := res;
exit;
end;
addr := next;
end;
addr := Read_32(arr + $8C);
while (addr <> 0) do
begin
next := Read_32(addr);
addr := Read_32(addr + $08);
res := addr;
addr := Read_32(addr + $4C);
ReadProcessMemory(hProcess, ptr(addr), @mass, sizeof(mass), rw);
i := 1;
name := '';
while (mass[i] <> '') do
begin
name := name + mass[i];
inc(i);
end;
if (name = WinName) then
begin
result := res;
exit;
end;
addr := next;
end;
result := 0;
end;
function CtrlItemAddr(winstruct: Dword; nomctrl: integer): Dword;
var
addr: Dword;
i: integer;
begin
addr := Read_32(winstruct + $1C8);
for i := 1 to nomctrl do
addr := Read_32(addr + $04);
addr := Read_32(addr + $08);
result := addr + $13C;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ItemAddr: Dword;
numb: integer;
begin
ConnectClient;
Packet('2300ED111080');
numb := 1;
itemAddr := CtrlItemAddr(WinStruct('Win_NPC'), 1);
WriteProcessMemory(hProcess, ptr(ItemAddr), @numb, sizeof(numb), rw);
end;
end.
диалог с нпс открывает, но квест не берет... Я думаю это конечно логически, т.к. перемешение выделения в диалоге не выход) квест то всеравно не берется... Пробовал отловить пакет на выбор квеста, эффекта нуль( так вот собственно помогите встать на путь истинный
ну крафтить яшму, да и с фишками работать проще через пакеты.
однако говорят, что все равно надо открыть окно.
Почитай эту тему: http://zhyk.ru/forum/showthread.php?t=440606 там что-то такое разбирали
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW.
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
такс решение я нашел) и убедился, что для этого придется рыть в сторону oog... у меня теперь навязался вопрос насчет твоей программы по отлову пакетов... так и должно быть, что после отлова первого пакета клиент крашится?