 |
Считать оффсеты с файла - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок |
01.08.2012, 22:35
|
#16
|
|
|
|
Разведчик
|
 Регистрация: 23.06.2012
 Сообщений: 43
 Популярность: 427
 Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
|
Re: Считать оффсеты с файла
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
Если это функция вызова пакета - то ошибка тут - должно быть +$20
|
|
 |
|
 |
|
нет это инжект движения в заданную точку
в общем все получилось
Код:
type
PParams = ^TParams;
TParams = packed record
buf:array[0..6]of integer;
Param1,Param2:dword;
Param3:pointer;
end;
procedure AutoRouteCall(aPParams:PParams); stdcall;
var
cmd,addr,araddr: Pointer;
begin
araddr:=aPParams^.Param3;
cmd:=@aPParams^.buf;
addr :=araddr;
asm
pushad
mov eax, dword ptr [$00A571E0]
mov eax, dword ptr [eax +$001c]
mov ecx, dword ptr [eax +$0034]
push cmd
call addr
popad
end;
end;
ПРОЦЕДУРА ВЫЗОВА:
procedure AutoRouteStart(x, y : integer);
var
aParams:TParams;
begin
aParams.buf[0] := $14A;
aParams.buf[1] := 0;
aParams.buf[2] := 0;
aParams.buf[3] := 0;
aParams.buf[4] := x;
aParams.buf[5] := y;
aParams.buf[6] := 0;
aParams.Param3:=pointer(AutoRouteAddress);
InjectFunc(hProcess,@AutoRouteCall, @aParams,sizeof(aParams));
end;
procedure TForm1.FormCreate(Sender: TObject);
........
AutoRouteAddress:=StrToInt64Def('$'+f.Readstring('Params','AutoRouteAddress',IntToHex($00478ED0,8)),Default);
........
Да простят меня гуру программирования если что не так
Ну пара строк в коде конечно лишние, потом уберу
Последний раз редактировалось fds255; 01.08.2012 в 22:37.
|
|
|
02.08.2012, 09:22
|
#17
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Re: Считать оффсеты с файла
 |
Цитата: |
 |
|
|
|
|
|
|
|
|
нет это инжект движения в заданную точку
в общем все получилось
Код:
type
PParams = ^TParams;
TParams = packed record
buf:array[0..6]of integer;
Param1,Param2:dword;
Param3:pointer;
end;
procedure AutoRouteCall(aPParams:PParams); stdcall;
var
cmd,addr,araddr: Pointer;
begin
araddr:=aPParams^.Param3;
cmd:=@aPParams^.buf;
addr :=araddr;
asm
pushad
mov eax, dword ptr [$00A571E0]
mov eax, dword ptr [eax +$001c]
mov ecx, dword ptr [eax +$0034]
push cmd
call addr
popad
end;
end;
ПРОЦЕДУРА ВЫЗОВА:
procedure AutoRouteStart(x, y : integer);
var
aParams:TParams;
begin
aParams.buf[0] := $14A;
aParams.buf[1] := 0;
aParams.buf[2] := 0;
aParams.buf[3] := 0;
aParams.buf[4] := x;
aParams.buf[5] := y;
aParams.buf[6] := 0;
aParams.Param3:=pointer(AutoRouteAddress);
InjectFunc(hProcess,@AutoRouteCall, @aParams,sizeof(aParams));
end;
procedure TForm1.FormCreate(Sender: TObject);
........
AutoRouteAddress:=StrToInt64Def('$'+f.Readstring('Params','AutoRouteAddress',IntToHex($00478ED0,8)),Default);
........
Да простят меня гуру программирования если что не так 
Ну пара строк в коде конечно лишние, потом уберу
|
|
 |
|
 |
|
Слушай тут другая тема для разговора не лезь со своим движением .
Я вот нашел исходники бота там чтение из файла такое же , но суют они вот так :
Код:
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses: DWord;
PacketAddr: DWord;
Len:DWord;
begin
PacketAddr := aPParams^.Param3;
CallAddress:=Pointer(PacketAddr);
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
Код:
procedure Packet(BaseAddr: dword; PacketAddr: dword; Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAddr;
aParams.Param3 := PacketAddr;
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
Что опять же не работает у меня по не понятным причинам . Опять пв вылетает
|
|
|
02.08.2012, 10:18
|
#18
|
|
|
|
Разведчик
|
 Регистрация: 23.06.2012
 Сообщений: 43
 Популярность: 427
 Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
|
Re: Считать оффсеты с файла
тема то другая, а принцип передачи переменных тотже
попробуй сделать так:
Код:
type
PParams = ^TParams;
TParams = packed record
.........................//здесь другие твои переменные
Param3:pointer;
........................//здесь тоже
end;
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses: DWord;
// PacketAddr: DWord;
Len:DWord;
begin
// PacketAddr := aPParams^.Param3;// это не нужно
CallAddress:=aPParams^.Param3; //Pointer(PacketAddr);
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure Packet(BaseAddr: dword; PacketAddr: dword; Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAddr;
aParams.Param3 := pointer(PacketAddr);
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
так по крайней мере call CallAddress будет срабатывать правильно.
Последний раз редактировалось fds255; 02.08.2012 в 10:46.
|
|
|
02.08.2012, 15:50
|
#19
|
|
|
|
Рыцарь-капитан
|
 Регистрация: 07.10.2009
 Сообщений: 496
 Популярность: 2687
 Сказал(а) спасибо: 64
Поблагодарили 325 раз(а) в 105 сообщениях
|
Re: Считать оффсеты с файла
________________
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Совершенный автологин для Perfect World [RUOFF, PWI, Фришек 1.4.4 - 1.4.5]
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - Патч на Горны, Красный (да и любой) чат, Анфриз, Бесконечный зум, Моментальный разгон на полете для RUOFF, PWI и прочих 1.4.6 и фришек 1.4.4, 1.4.5.
--------------------------------------------
Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - патчер для серверов 1.4.5 и 1.4.4 работающий с включенной игрой.
--------------------------------------------
|
|
|
02.08.2012, 19:20
|
#20
|
|
|
|
Разведчик
|
 Регистрация: 23.06.2012
 Сообщений: 43
 Популярность: 427
 Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
|
Re: Считать оффсеты с файла
В общем проблема решена!
1) ПРОВЕРЬ:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
ini: TIniFile;
Path:String;
function ReadAddr(Section, Ident: string; Default: DWORD): DWORD;
begin
Result := StrToInt64Def('$' + ini.ReadString(Section, Ident, IntToHex(Default, 8)), Default);
// запись на случай если значение не описано в файле
ini.WriteString(Section, Ident, IntToHex(Result, 8));
end;
begin
Path:=Application.ExeName;
Path:=ExtractFileDir(Path);
if Path[Length(Path)]<>'\' then Path:=Path+'\';
ini:=TIniFile.Create(Path+'offset.ini');
base_addr := ReadAddr('Offset', 'BaseAdress',$A571E0);
PK_addr := ReadAddr('Offset', 'BaseAdress',$63DB70);
BaseAdress:=base_addr;
SendPacket:=PK_addr;
ты считываешь
base_addr := ReadAddr('Offset', ' BaseAdress',$A571E0);
PK_addr := ReadAddr('Offset', ' BaseAdress',$63DB70);
разве base_addr у тебя должен равняться PK_addr??? тогда зачем считываешь из файла одно и то же значение?
2) Если сделаешь так:
Код:
type
PParams = ^TParams;
TParams = packed record
.........................//здесь другие твои переменные
Param1,Param2:DWORD
Param3:Pointer;
........................//здесь тоже
end;
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses: DWord;
Len:DWord;
begin
CallAddress:=aPParams^.Param3;
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure Packet(BaseAddr: dword; PacketAddr: dword; Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAddr;
aParams.Param3 := pointer(PacketAddr);
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
то все должно сработать на 100%
3) Скажу даже больше.
Если захочешь $20 тоже считать с файла, тогда делай так:
Код:
type
PParams = ^TParams;
TParams = packed record
.........................//здесь другие твои переменные
Param1,Param2,Param4:DWORD
Param3:Pointer;
........................//здесь тоже
end;
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses, Offset1, Len: DWord;
begin
CallAddress:=aPParams^.Param3;
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
Offset1:=aPParams^.Param4; //передаешь значение Offset1
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
add ecx, Offset1
mov ecx, dword ptr [ecx]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure Packet(BaseAddr: dword; PacketAddr: dword; Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAddr;
aParams.Param3 := pointer(PacketAddr);
aParams.Param4 := off1 //off1 тип dword - считаешь из файла как обычно
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
И будет тебе счастье!!!
Последний раз редактировалось fds255; 02.08.2012 в 21:46.
|
|
|
Пользователь сказал cпасибо:
|
|
02.08.2012, 21:44
|
#21
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Re: Считать оффсеты с файла
Ты сам код проверял ? После него на каждый пакет такая надпись : E2010 Incompatible types: 'Cardinal' and 'string'
|
|
|
02.08.2012, 22:04
|
#22
|
|
|
|
Разведчик
|
 Регистрация: 23.06.2012
 Сообщений: 43
 Популярность: 427
 Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
|
Re: Считать оффсеты с файла
Посмотри это у тебя так?
Код:
type
PParams = ^TParams;
TParams = packed record
.........................//здесь другие твои переменные
Packet: array [0..100] of byte;
Param1,Param2:DWORD
Param3:Pointer;
........................//здесь тоже
end;
Код:
procedure Packet(BaseAddr: dword; PacketAddr: dword; Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAddr;
aParams.Param3 := pointer(PacketAddr);
aParams.Param4 := off1 //off1 тип dword - считаешь из файла как обычно
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
Переменная off1 должна быть Dword если ты ее используешь конечно, проверь
Возможно косяк в процедуре StrToByte
да и еще возможный косяк, если ты брал код из 3 пункта моего предыдущего сообщения то попробуй так:
Код:
type
PParams = ^TParams;
TParams = packed record
Packet: array [0..100] of byte;
Param1,Param2,Param5:DWORD
Param3:Pointer;
Param4: array [1..100] of widechar;
end;
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses, Offset1, Len: DWord;
begin
CallAddress:=aPParams^.Param3;
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
Offset1:=aPParams^.Param5; //передаешь значение Offset1
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
add ecx, Offset1
mov ecx, dword ptr [ecx]
push Len
push pPacket
call CallAddress
popad
end;
end;
procedure Packet(BaseAddr: dword; PacketAddr: dword; Packet: string);
var
aParams: TParams;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAddr;
aParams.Param3 := pointer(PacketAddr);
aParams.Param5 := off1 //off1 тип dword - считаешь из файла как обычно
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
Последний раз редактировалось fds255; 02.08.2012 в 22:58.
|
|
|
02.08.2012, 22:54
|
#23
|
|
|
|
Разведчик
|
 Регистрация: 17.09.2009
 Сообщений: 46
 Популярность: 1187
 Сказал(а) спасибо: 8
Поблагодарили 50 раз(а) в 13 сообщениях
|
Re: Считать оффсеты с файла
|
|
|
03.08.2012, 09:49
|
#24
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Re: Считать оффсеты с файла
Вот функции
Код:
TForm1.FormCreate(Sender: TObject);
var
ini: TIniFile;
Path:String;
function ReadAddr(Section, Ident: string; Default: DWORD): DWORD;
begin
Result := StrToInt64Def('$' + ini.ReadString(Section, Ident, IntToHex(Default, 8)), Default);
// запись на случай если значение не описано в файле
ini.WriteString(Section, Ident, IntToHex(Result, 8));
end;
begin
Path:=Application.ExeName;
Path:=ExtractFileDir(Path);
if Path[Length(Path)]<>'\' then Path:=Path+'\';
ini:=TIniFile.Create(Path+'offset.ini');
base_addr := ReadAddr('Offset', 'BaseAdress',$A571E0);
PK_addr := ReadAddr('Offset', 'SendPacket',$63DB70);
BaseAdress:=base_addr;
SendPacket:=PK_addr;
end;
Код:
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses: DWord;
PacketAddr: DWord;
Len:DWord;
begin
Packet_addr:= aPParams^.Param3;
CallAddress:=Pointer(Packet_addr);
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
Код:
procedure StrToByte(Packet:string; var aParams:TParams);
var
i, cnt: integer;
begin
cnt:=((length(Packet)+1) div 3);
aParams.Param1 := cnt;
for i:=0 to cnt-1 do
aParams.Packet[i]:=strtoint('$'+Packet[i*3+1]+Packet[i*3+2]);
end;
Код:
procedure Packet(BaseAdress: dword; SendPacket: dword; Packet: string);
var
aParams: TParams;
hprocess:dword;
begin
StrToByte(Packet,aParams);
aParams.Param2 := BaseAdress;
aParams.Param3 := SendPacket;
InjectFunc(hProcess, @PacketCall, @aParams,sizeof(aParams));
end;
Вот все функции где ошибка не пойму , но все равно высвечивается Incompatible types: 'Cardinal' and 'string' На каждый пакет после функции
Последний раз редактировалось STIL23; 03.08.2012 в 09:54.
|
|
|
03.08.2012, 10:21
|
#25
|
|
|
|
Разведчик
|
 Регистрация: 23.06.2012
 Сообщений: 43
 Популярность: 427
 Сказал(а) спасибо: 18
Поблагодарили 59 раз(а) в 35 сообщениях
|
Re: Считать оффсеты с файла
ВОТ ЭТО ЧТО ЗА ПЕРЕМЕННАЯ, ГДЕ ОНА ОБЪЯВЛЕНА И КАКОГО ТИПА???
В VAR процедуры ее нет!!!
Код:
procedure PacketCall(aPParams:PParams); stdcall;
var
CallAddress,pPacket:pointer;
BaseAddresses: DWord;
PacketAddr: DWord;
Len:DWord;
begin
Packet_addr:= aPParams^.Param3;
CallAddress:=Pointer(Packet_addr);
BaseAddresses:=aPParams^.Param2;
Len:=aPParams^.Param1;
pPacket:=@aPParams^.Packet;
asm
pushad
mov ecx, BaseAddresses
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+$20]
push Len
push pPacket
call CallAddress
popad
end;
end;
|
|
|
03.08.2012, 10:48
|
#26
|
|
|
|
Сержант
|
 Регистрация: 19.12.2009
 Сообщений: 130
 Популярность: 34
 Сказал(а) спасибо: 21
Поблагодарили 86 раз(а) в 32 сообщениях
|
Re: Считать оффсеты с файла
Все решил проблему было в другом дело , всем спс
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Похожие темы
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Оффсеты
|
maloia |
Cross Fire |
13 |
30.04.2012 11:29 |
[Помогите!] Оффсеты
|
firuzikh10 |
Общение разработчиков |
1 |
21.04.2012 17:03 |
оффсеты
|
саня питерский |
Вопросы и ответы, обсуждения |
3 |
25.01.2012 08:29 |
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 04:22.
|
 |