Актуально. Закрытие диалогового окна с НПС - Общение разработчиков - Программирование для Perfect World, общение и обсуждене разработок
05.02.2016, 18:03
#16
Пехотинец
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
Нашел старый клиент
Код:
CPU Disasm
Address Hex dump Command Comments
00809A00 53 PUSH EBX
00809A01 56 PUSH ESI
00809A02 8B7424 0C MOV ESI,DWORD PTR [ESP+0C]
00809A06 8BD9 MOV EBX,ECX
00809A08 57 PUSH EDI
00809A09 8BFE MOV EDI,ESI
00809A0B 83C9 FF OR ECX,FFFFFFFF
00809A0E 33C0 XOR EAX,EAX
00809A10 F2:AE REPNE SCAS BYTE PTR [EDI]
00809A12 F7D1 NOT ECX
00809A14 49 DEC ECX
00809A15 75 08 JNE SHORT elementclient.00809A1F
00809A17 5F POP EDI
00809A18 5E POP ESI
00809A19 B0 01 MOV AL,1
00809A1B 5B POP EBX
00809A1C C2 0400 RET 4
00809A1F 8B43 78 MOV EAX,DWORD PTR [EBX+78]
00809A22 BF 01000000 MOV EDI,1
00809A27 3BC7 CMP EAX,EDI
00809A29 75 76 JNE SHORT elementclient.00809AA1
00809A2B 55 PUSH EBP
00809A2C 8B2D E884A100 MOV EBP,DWORD PTR [<&MSVCRT._strcmpi>]
00809A32 68 98B9AC00 PUSH OFFSET elementclient.00ACB998 ; ASCII "IDCANCEL"
00809A37 56 PUSH ESI
00809A38 FFD5 CALL EBP
00809A3A 83C4 08 ADD ESP,8
00809A3D 85C0 TEST EAX,EAX
00809A3F 75 16 JNE SHORT elementclient.00809A57
00809A41 8B4B 34 MOV ECX,DWORD PTR [EBX+34]
00809A44 BF 02000000 MOV EDI,2
00809A49 53 PUSH EBX
00809A4A 57 PUSH EDI
00809A4B 8B01 MOV EAX,DWORD PTR [ECX]
00809A4D FF50 18 CALL DWORD PTR [EAX+18]
00809A50 5D POP EBP
00809A51 5F POP EDI
00809A52 5E POP ESI
00809A53 5B POP EBX
00809A54 C2 0400 RET 4
Нашел в новом клиенте тоже место
Код:
CPU Disasm
Address Hex dump Command Comments
009B2FC0 /. 53 PUSH EBX
009B2FC1 |. 56 PUSH ESI
009B2FC2 |. 8B7424 0C MOV ESI,DWORD PTR [ARG.1]
009B2FC6 |. 8BD9 MOV EBX,ECX
009B2FC8 |. 57 PUSH EDI
009B2FC9 |. 8BFE MOV EDI,ESI
009B2FCB |. 83C9 FF OR ECX,FFFFFFFF
009B2FCE |. 33C0 XOR EAX,EAX
009B2FD0 |. F2:AE REPNE SCAS BYTE PTR [EDI]
009B2FD2 |. F7D1 NOT ECX
009B2FD4 |. 49 DEC ECX
009B2FD5 |. 75 08 JNZ SHORT elementclient.009B2FDF
009B2FD7 |. 5F POP EDI
009B2FD8 |. 5E POP ESI
009B2FD9 |. B0 01 MOV AL,1
009B2FDB |. 5B POP EBX
009B2FDC |. C2 0400 RET 4
009B2FDF |> 8B43 78 MOV EAX,DWORD PTR [EBX+78]
009B2FE2 |. BF 01000000 MOV EDI,1
009B2FE7 |. 3BC7 CMP EAX,EDI
009B2FE9 |. 75 76 JNE SHORT elementclient.009B3061
009B2FEB |. 55 PUSH EBP
009B2FEC |. 8B2D 84C3BF00 MOV EBP,DWORD PTR [<&MSVCRT._strcmpi>]
009B2FF2 |. 68 EC10CF00 PUSH OFFSET elementclient.00CF10EC ; /Arg2 = ASCII "IDCANCEL"
009B2FF7 |. 56 PUSH ESI ; |Arg1 => [ARG.1]
009B2FF8 |. FFD5 CALL EBP ; \msvcrt._strcmpi
009B2FFA |. 83C4 08 ADD ESP,8
009B2FFD |. 85C0 TEST EAX,EAX
009B2FFF |. 75 16 JNZ SHORT elementclient.009B3017
009B3001 |. 8B4B 34 MOV ECX,DWORD PTR [EBX+34]
009B3004 |. BF 02000000 MOV EDI,2
009B3009 |. 53 PUSH EBX
009B300A |. 57 PUSH EDI
009B300B |. 8B01 MOV EAX,DWORD PTR [ECX]
009B300D |. FF50 18 CALL DWORD PTR [EAX+18]
009B3010 |. 5D POP EBP
009B3011 |. 5F POP EDI
009B3012 |. 5E POP ESI
009B3013 |. 5B POP EBX
009B3014 |. C2 0400 RET 4
Получил готовый инжект закрытия любого окна
Код:
const
DlgCancelPush = $00CF10EC;//$00ACB998;
DialogOpAddr = $009B2FC0;//$00809A00;
PW_BASE_ADDRESS = $00D6F0AC;
PW_DYNAMIC_BASE_OFFSET = $001c; // [base] + 1c = CECGameRun
PW_UIMANAGER_OFFSET = $0010; // [base] + 1c + 18
PW_UIMANAGER_GAMEUI_OFFSET = $0008; // [base] + 1c + 18 + 08 = CECGameUIMan
PW_UIMANAGER_CURRENT_DIALOG = $0074; // [base] + 1c + 18 + 08 + 74
procedure DialogOperationCall(aPParams : PParams); stdcall;
var
address : Pointer;
param : Cardinal;
begin
//DialogOpAddr = $00809A00;
address := Pointer(DialogOpAddr);
param := aPParams^.Param1;
asm
pushad
push param
//PW_BASE_ADDRESS = $00b27a04;
mov esi, dword ptr [PW_BASE_ADDRESS]
//PW_DYNAMIC_BASE_OFFSET = $001c; // [base] + 1c = CECGameRun
mov esi, dword ptr [esi + PW_DYNAMIC_BASE_OFFSET]
//PW_UIMANAGER_OFFSET = $0018; // [base] + 1c + 18
mov esi, dword ptr [esi + PW_UIMANAGER_OFFSET]
//PW_UIMANAGER_GAMEUI_OFFSET = $0008; // [base] + 1c + 18 + 08 = CECGameUIMan
mov esi, dword ptr [esi + PW_UIMANAGER_GAMEUI_OFFSET]
// PW_UIMANAGER_CURRENT_DIALOG = $0074; // [base] + 1c + 18 + 08 + 74
mov esi, dword ptr [esi + PW_UIMANAGER_CURRENT_DIALOG]
mov ecx, esi
call address
popad
end;
address := nil;
end;
procedure CloseDialog();
var
aParams : TParams;
begin
aParams.Param1 := DlgCancelPush; //DlgCancelPush = $00ACB998; DlgOkPush =00ACB6C8 адрес кнопки ОК
InjectFunc(hProcess, @DialogOperationCall, @aParams, SizeOf(aParams));
end;
procedure TForm3.Button4Click(Sender: TObject);
begin
connect;
CloseDialog();
end;
Ну и до кучи Структура GUI
Остальное на сколько понял осталось без изменения
Всем спасибо за проделанную работу.
Последний раз редактировалось diagnost; 05.02.2016 в 18:07 .
05.02.2016, 18:37
#17
Старший сержант
Регистрация: 09.04.2010
Сообщений: 204
Популярность: 5518
Сказал(а) спасибо: 49
Поблагодарили 512 раз(а) в 198 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
Ради интереса спрошу - а кроме как чисто эстетической цели (ну, чтобы лишних окон не было), данный инжект несет практическую пользу?
________________
[
Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW.
PW Everyday Helper Bot
06.02.2016, 00:04
#18
Пехотинец
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
Зачем нужен этот инжект? Мне кажется
здесь полный ответ на этот вопрос. Тоже все перелопатил пока смог запустить этот инжект. Он имеет непосредственное отношение к GUI. Раньше его называли ButtonPress(это Call адрес), потом он получил название DialogOpAddr(Call адрес), а теперь просто GUI(Call адрес, еще его называют GUI_Command ) Я не хочу сказать что, они все одинаковы, но все они крутятся возле выше указанного участка кода. И как его искать до сих пор мне не понятно.
Осталось выяснить, как найти вот эти адреса
Код:
BA+0x1C+0x04+0x18+I+D
I (окна, длинна 0x850 байт)
0x2B8 Действия
0x2C0 Игроки и группы
0x2C4 Служба поддержки
0x314 Характеристики персонажа
0x32C Ремонт
0x36C Призыв духа
0x3E8 Помощь
0x40C Инвентарь
0x428 Диалог с нпс
0x438 Домашние животные
0x458 Окно алхимика
0x468 Панель 1-9
0x470 Горячие клавиши
0x4B0 Настройки
0x4C4 Умения
0x50C Системная панель
0x51C Задания
D (данные окна, длинна 0x218 байт)
0x98 WndX, dword
0x9C WndY, dword
0xA0 WndW, dword
0xA4 WndH, dword
0X90 WndO, byte (1-open, 0-close)
Последний раз редактировалось diagnost; 06.02.2016 в 00:24 .
06.02.2016, 00:12
#19
Старший сержант
Регистрация: 09.04.2010
Сообщений: 204
Популярность: 5518
Сказал(а) спасибо: 49
Поблагодарили 512 раз(а) в 198 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
________________
[
Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW.
PW Everyday Helper Bot
06.02.2016, 00:30
#20
Пехотинец
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
Если окно не закрыть, перестают работать скиллы(в Пати), кроме этого после подключения инжекта автопути к боту, персы перестали следовать за ПЛ, тупо стоят, пока не закроешь окно. А также, если в таргете кто то есть при нажатии ESC идет команда сброс таргета, мне не всегда нужно делать сброс таргета, нужно просто закрыть окно(нажать на крестик). У ПЛ всегда кто то есть в таргете ESC просто не помогает.
Последний раз редактировалось diagnost; 06.02.2016 в 00:37 .
06.02.2016, 00:41
#21
Старший сержант
Регистрация: 09.04.2010
Сообщений: 204
Популярность: 5518
Сказал(а) спасибо: 49
Поблагодарили 512 раз(а) в 198 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
А не проще было найти флаг блокировки интерфейса и его обнулять? :-)
________________
[
Ссылки могут видеть только зарегистрированные пользователи. ]-cофт и прочее для комфортной игры в PW.
PW Everyday Helper Bot
06.02.2016, 00:49
#22
Пехотинец
Регистрация: 02.01.2010
Сообщений: 95
Популярность: 1542
Сказал(а) спасибо: 110
Поблагодарили 460 раз(а) в 288 сообщениях
Re: Актуально. Закрытие диалогового окна с НПС
По другому менять фокус окна?(Хорошая идея, и почему об этом не подумал?) Для него также нужно искать адреса и инжектить, в начале топа есть такое, только примеров не видел.
Теперь по поводу оптимизации кода. ESI и EDI регистры используются немного по другому, они нам здесь не нужны. У нас остались свободными регистры EAX, EBX. Мы будем использовать EAX и ECX(который уже используется). После преобразования последняя строчка mov ecx, esi нам совсем не нужна. Приводим код к общему стандарту:
Код:
procedure BtnPressAs(aPParams:PParams); stdcall;
var
Btn_Call, BaseAddr: Pointer;
IdCancel: dword;
begin
BaseAddr := Pointer(aPParams^.Param1);
IdCancel := aPParams^.Param2;
Btn_Call := Pointer(aPParams^.Param3);
asm
pushad
mov eax, IdCancel
push eax
mov ecx, BaseAddr
mov ecx, dword ptr [ecx]
mov ecx, dword ptr [ecx+$1C]
mov ecx, dword ptr [ecx+$10]
mov ecx, dword ptr [ecx+$8]
mov ecx, dword ptr [ecx+$74]
call Btn_Call
popad
end;
end;
procedure WinClose();
var
aParams: TParams;
begin
aParams.Param1 := base_addr;
aParams.Param2 := IdCancel_addr;
aParams.Param3 := ButtonPress_addr;
if (aParams.Param1 <> 0) and (aParams.Param2 <> 0) and (aParams.Param3 <> 0) then
InjectFunc(@BtnPressAs, @aParams, SizeOf(aParams));
end;
Последний раз редактировалось diagnost; 06.02.2016 в 20:40 .
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
Похожие темы
Тема
Автор
Раздел
Ответов
Последнее сообщение
[Помогите!] баг на закрытие профиля!
/predator=-
Общение и обсуждение
1
19.01.2012 23:56
Закрытие клиента
Fuckker555
Вопросы и ответы: RF Online
2
29.11.2011 21:47
Закрытие игры
sanekkka
Общение и обсуждение S4 League
25
06.06.2011 13:54
[Помогите!] Закрытие формы
CheaterNoob
Вопросы и ответы, обсуждения
2
22.04.2011 03:18
Заявление об ответственности / Список мошенников
Часовой пояс GMT +4, время: 13:29 .