Позволь спросить, а что этот код вообще делает? Ответ - ничего.
Поправил код:
Код:
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:Pointer;
Len:DWord;
begin
CallAddress:=Pointer($6737B0); //адрес был устаревший
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, dword ptr [PW_BASE_ADDRESS]
mov ecx, dword ptr [ecx+$34] //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;
Wnd: Thandle;
PID,hProcess: DWord;
begin
Wnd:=FID[Form1.ComboBox1.ItemIndex]; //Работаем с окном, которое выбрано в ComboBox'е
GetWindowThreadProcessId(Wnd,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID );
StrToByte(Packet,aParams);
InjectFunc(hProcess,@PacketCall,@aParams,sizeof(aParams));
CloseHandle(hProcess); //забыл дописать
end;
procedure TForm1.Button1Click(Sender: TObject);
var
aParams : TParams;
begin
Packet('030001'); //отсылаем пакет 030001
end;
end.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
В режиме Trace intro клиент вылетает при переключении:
Цитата:
// ---- Создаем поток, в котором все это будет выполняться.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Ожидаем завершения функции
WaitForSingleObject(hThread, INFINITE);
Где копать?
Добавлено через 2 часа 48 минут
[Ссылки могут видеть только зарегистрированные пользователи. ]
Может, кто посмотрит и найдет, что исправить.
________________
Лучшая благодарность нажать СПАСИБО.
Спасибо недоступно - нажмите на плюсик возле аватара
Последний раз редактировалось Shadrincev; 14.02.2012 в 06:05.
Причина: Добавлено сообщение
Ребят, пожалуйста, посмотрите исходник. Перечитал на раз 10 темы на pwlab.net и тут, и никак не могу понять, почему не идет инжект пакета…
Кто может помогите, помогите кто может.
________________
Лучшая благодарность нажать СПАСИБО.
Спасибо недоступно - нажмите на плюсик возле аватара
Shadrincev, объясни понятнее в чём заключается ошибка. Тогда тебе, скорее всего, помогут.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Shadrincev, объясни понятнее в чём заключается ошибка. Тогда тебе, скорее всего, помогут.
Цитата:
В режиме Trace intro клиент вылетает при переключении:
Цитата:
// ---- Создаем поток, в котором все это будет выполняться.
hThread := CreateRemoteThread(ProcessID, nil, 0, ThreadAddr, ParamAddr, 0, lpNumberOfBytes);
// ---- Ожидаем завершения функции
WaitForSingleObject(hThread, INFINITE);
При запуске же готового exe, вылет не происходит, но и инжекта нет.
________________
Лучшая благодарность нажать СПАСИБО.
Спасибо недоступно - нажмите на плюсик возле аватара
type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1,Param2,Param3: DWord;
Param4: array [1..100] of widechar;
end;
const
BA=$00B27A04;
var
Form1: TForm1;
FID: array[0..10] of THandle;
implementation
{$R *.dfm}
function ReadPlayerName(hProcess,dataWord): string;
var
i,rwWord;
ch:WideChar;
wch:array[0..255] of WideChar;
str:string;
begin
i:=0;
repeat
ReadProcessMemory(hProcess,ptr(data),@ch,2,rw);
data:=data+2;
wch[i]:=ch;
inc(i);
until
(ord(ch)=0) or (i>=255);
i:=0;
str:='';
repeat
str:=str+wch[i];
inc(i);
until
wch[i]='';
result:=str;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Wnd:THandle;
Nick,Res:String;
Hndl:array[0..255] of Char;
buf,ibuf,BCWord;
hProcess,PID,PID1Word;
i:Integer;
begin
for i:=0 to ComponentCount-1 do
if Components[i].ClassName = 'TComboBox' then
(Components[i] as TComboBox).Items.Clear;
begin
Wnd:=FindWindow('ElementClient Window',nil);
GetWindowThreadProcessId(Wnd,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID );
i:=0;
while (hProcess<>0) and (PID<>PID1) do
begin
GetWindowText(Wnd,Hndl,SizeOf(Hndl));
ReadProcessMemory(hProcess,ptr(BA),@ibuf,sizeof(ib uf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$1C),@ibuf,siz eof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$34),@ibuf,siz eof(ibuf),BC);
ReadProcessMemory(hProcess,ptr(ibuf+$638),@buf,siz eof(buf),BC);
Nick:=ReadPlayerName(hProcess,buf);
Res:='Handle: '+Hndl+' '+'Nickname: '+Nick;
SetWindowText(Wnd,PChar(Nick));
ComboBox1.Items.Add(Nick);
FID[i]:=Wnd;
PID:=PID1;
inc(i);
end;
CloseHandle(hProcess);
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if tmr1.Enabled then
begin
tmr1.Enabled := False;
Button2.Enabled := True;
Button3.Enabled := False;
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;
Wnd: Thandle;
PID,hProcess: DWord;
begin
Wnd:=FID[Form1.ComboBox1.ItemIndex];
GetWindowThreadProcessId(Wnd,@PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS,False,PID );
StrToByte(Packet,aParams);
InjectFunc(hProcess,@PacketCall,@aParams,sizeof(aP arams));
CloseHandle(hProcess);
end;
procedure TForm1.tmr1Timer(Sender: TObject);
var
aParams : TParams;
begin
Packet('280001010C00F7310000'); //пакет
end;
end.
________________
Лучшая благодарность нажать СПАСИБО.
Спасибо недоступно - нажмите на плюсик возле аватара
Последний раз редактировалось Shadrincev; 12.02.2012 в 14:46.
Shadrincev, не качалось.
Update.
Скачал. Посмотрел. Вообщем не работает, потому что программа не выбирает нужный процесс и не получает к нему права. Для начало лучше сделай так:
Код:
hProcess, PID:dword;
WndHndl:THandle;
...
...
WndHndl:=findwindow(nil,'Perfect World');//где Perfect World - название окна
GetWindowThreadProcessId(WndHndl, @PID);
hProcess:=OpenProcess(PROCESS_ALL_ACCESS, False, PID);
Когда так настроишь потом уж мучайся через ник персонажа. Благо исходников на форуме предостаточно, чтобы решить данную проблему.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось lcd1232; 12.02.2012 в 14:59.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.