 |
Неправильная отправка - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
22.07.2012, 11:13
|
#1
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Неправильная отправка
Всем привет возникла проблема: функция отказывается отправлять пакет
Код:
2800000010B0067300000
. Пакеты медетации шлет, юзания скилов тоже , а именно этот пакет отказывается . Через PwPacketListner пакет этот отправляется. А когда я отправляю пакет через свою программу PwPacketListner пишет , что отправляется пакет
Код:
28000000000000000000
вместо данного . Кто может объяснить в чем проблема ? У друга работает- пакет отправляется. Функция вот:
Код:
unit Unit2;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, sButton, sComboBox;
type
TForm2 = class(TForm)
sComboBox1: TsComboBox;
sButton1: TsButton;
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,WID: DWord;
end;
const
PW_BASE_ADDRESS = $00A571E0;
PW_GAMERUN_ADDR = $00A57ACC;
var
Form2: TForm2;
implementation
{$R *.dfm}
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($63DB70); //адрес был устаревший
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [$A571E0]
mov ecx, dword ptr [ecx+$20] //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 TForm2.Button1Click(Sender: TObject);
begin
Packet('2800000010B0067300000');
end;
end.
Попробовал разбить на части пакет все равно шлет другой пакет
Последний раз редактировалось STIL23; 22.07.2012 в 11:16.
|
|
|
22.07.2012, 13:00
|
#2
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 14.06.2012
 Сообщений: 511
 Популярность: 7566
 Сказал(а) спасибо: 4
Поблагодарили 181 раз(а) в 88 сообщениях
|
Re: Неправильная отправка
попробуй поправь вот это
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;
замени на i
Добавлено через 3 минуты
вот моя функция пакета. прежде конечно нужно создать выбор персонажа.
 |
Цитата: |
 |
|
|
|
|
|
|
|
procedure Packet(Packet: string);
var
aParams: TParams;
PID, hProcess: DWord;
aPrm: TParams;
wnd: THandle;
h: Integer;
begin
wnd:=FindWindow('ElementClient Window', PChar(nick));
GetWindowThreadProcessId(wnd, @h);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, h);
StrToByte(Packet,aPrm); ///////////
InjectFunc(hProcess,@PacketCall,@aPrm,sizeof(aPrm) );
end; |
|
 |
|
 |
|
Последний раз редактировалось Ginrey; 22.07.2012 в 13:03.
Причина: Добавлено сообщение
|
|
|
2 пользователя(ей) сказали cпасибо:
|
|
22.07.2012, 14:46
|
#3
|
|
|
|
Пехотинец
|
 Регистрация: 21.03.2012
 Сообщений: 83
 Популярность: 1178
 Сказал(а) спасибо: 18
Поблагодарили 101 раз(а) в 53 сообщениях
|
Re: Неправильная отправка
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
2800000010B0067300000
|
|
 |
|
 |
|
2800000010B006730000 0 первый указанный вами пакет
28000000000000000000 тот что отправляли пакетлистнером
280000011F00A9210000 пакет из темы инжектов
Разницу чувствуете?) Может в этом ошибка?
________________
╔═╗
║ ˑ ˑ ╬ ╬
╚═╝
Последний раз редактировалось dwa83; 22.07.2012 в 16:24.
|
|
|
22.07.2012, 18:54
|
#4
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Re: Неправильная отправка
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 21:51.
|
 |