 |
|

09.09.2018, 23:40
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
Здравствуйте.
Заметил, что из за перехвата оконной процедуры(wndproc) через SetWindowLongPtr, при выгрузке плагина через консоль сф командой "pfree SFPlugin" происходит краш. В коллбэке деструктора игры и DLL PROCESS DETACH'e пытался восстанавливать оригинальный WndProc, но краш все равно был.
Может быть, кто нибудь знает, из за чего такое происходит?
C++:
Код:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#pragma comment(lib, "user32.lib")
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
WNDPROC oWndProc
=
0
;
LRESULT __stdcall
WndProc
(
HWND hWnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"WNDPROC CALLED"
)
;
return
CallWindowProcA
(
oWndProc
,
hWnd
,
uMsg
,
wParam
,
lParam
)
;
}
void
__stdcall
Destructor
(
)
{
static
bool
once
=
false
;
if
(
!
once
)
{
SetWindowLongPtr
(
GetForegroundWindow
(
)
,
GWLP_WNDPROC
,
(
long
)
oWndProc
)
;
once
=
true
;
}
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
||
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
||
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
oWndProc
=
(
WNDPROC
)
SetWindowLongPtr
(
GetForegroundWindow
(
)
,
GWLP_WNDPROC
,
(
long
)
WndProc
)
;
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
Destructor
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
else
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
Destructor
(
)
;
return
TRUE
;
}
|
|
|

10.09.2018, 05:50
|
|
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами:
6908018
Репутация:
213
|
|
Сообщение от mr.krabs
Как вывести локально сообщение в asi?
BlastHackNet/mod_s0beit_sa(https://github.com/BlastHackNet/mod_s0beit_sa/blob/master/src/samp.cpp#L675)
Сообщение от _=Gigant=_
why this not working i wanted to check when i'm driving to put gravity back to normal
if (cheat_state->state == CHEAT_STATE_ACTOR)
{
gta_gravity_set(10.0000);
}
else if (cheat_state->state == CHEAT_STATE_VEHICLE)
{
gta_gravity_set(0.0080);
}
cheat_state->state maybe can't change, check it
Сообщение от _Vine_
Здравствуйте.
Заметил, что из за перехвата оконной процедуры(wndproc) через SetWindowLongPtr, при выгрузке плагина через консоль сф командой "pfree SFPlugin" происходит краш. В коллбэке деструктора игры и DLL PROCESS DETACH'e пытался восстанавливать оригинальный WndProc, но краш все равно был.
Может быть, кто нибудь знает, из за чего такое происходит?
C++:
Код:
#define _SILENCE_STDEXT_HASH_DEPRECATION_WARNINGS
#include
#include
#include
#include
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
#pragma comment(lib, "user32.lib")
SAMPFUNCS
*
SF
=
new
SAMPFUNCS
(
)
;
WNDPROC oWndProc
=
0
;
LRESULT __stdcall
WndProc
(
HWND hWnd
,
UINT uMsg
,
WPARAM wParam
,
LPARAM lParam
)
{
SF
->
getSAMP
(
)
->
getChat
(
)
->
AddChatMessage
(
-
1
,
"WNDPROC CALLED"
)
;
return
CallWindowProcA
(
oWndProc
,
hWnd
,
uMsg
,
wParam
,
lParam
)
;
}
void
__stdcall
Destructor
(
)
{
static
bool
once
=
false
;
if
(
!
once
)
{
SetWindowLongPtr
(
GetForegroundWindow
(
)
,
GWLP_WNDPROC
,
(
long
)
oWndProc
)
;
once
=
true
;
}
}
void
CALLBACK
mainloop
(
)
{
static
bool
init
=
false
;
if
(
!
init
)
{
if
(
GAME
==
nullptr
||
GAME
->
GetSystemState
(
)
!=
eSystemState
::
GS_PLAYING_GAME
||
!
SF
->
getSAMP
(
)
->
IsInitialized
(
)
)
return
;
oWndProc
=
(
WNDPROC
)
SetWindowLongPtr
(
GetForegroundWindow
(
)
,
GWLP_WNDPROC
,
(
long
)
WndProc
)
;
SF
->
getGame
(
)
->
registerGameDestructorCallback
(
Destructor
)
;
init
=
true
;
}
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
if
(
dwReasonForCall
==
DLL_PROCESS_ATTACH
)
SF
->
initPlugin
(
mainloop
,
hModule
)
;
else
if
(
dwReasonForCall
==
DLL_PROCESS_DETACH
)
Destructor
(
)
;
return
TRUE
;
}
в sf wndproc уже перехвачен, достаточно зарегать каллбек.
тут пример - Гайд - API SF | Урок 5 - Подключение ImGui(https://blast.hk/threads/23083/)
|
|
|

11.09.2018, 08:46
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
А можно ли как то сделать это без сф?
|
|
|

11.09.2018, 09:20
|
|
Познавший АНТИЧАТ
Регистрация: 09.03.2013
Сообщений: 1,262
С нами:
6935116
Репутация:
183
|
|
Сообщение от _Vine_
А можно ли как то сделать это без сф?
нет, твой хук потом еще 40 раз какие-нибудь собейты, сфы перезапишут в итоге очередь не вернуть
|
|
|

11.09.2018, 09:33
|
|
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами:
5663255
Репутация:
183
|
|
Сообщение от Weeq
нет, твой хук потом еще 40 раз какие-нибудь собейты, сфы перезапишут в итоге очередь не вернуть
Может можно выделить память (Чтобы при выгрузке функция осталось в процессе), записать туда функцию WndProc которая вызывает следующий WndProc, что бы не сломать очередь?
|
|
|

12.09.2018, 10:27
|
|
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами:
4423953
Репутация:
68
|
|
как отправить фейк анимацию
|
|
|

12.09.2018, 10:53
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от raymondique
как отправить фейк анимацию
Хукать онфут дату и редактировать параметры sCurrentAnimationID, sAnimFlags
|
|
|

12.09.2018, 11:11
|
|
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами:
4423953
Репутация:
68
|
|
как изменить текст уже отрендеренного текста?
|
|
|

12.09.2018, 11:33
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от beento
как изменить текст уже отрендеренного текста?
Смотря какого текста.
Если игрового, то через память.
А через д3д хук - сам решаешь, шо рендерить.
Сообщение от beento
я уже отрендерил текст через д3д, как мне изменить текст на другой?
Ты можешь изменять данные каждый раз при вызове proxyIDirect3DDevice9::Present
Можешь посмотреть, как это реализовано в собейте.
|
|
|

12.09.2018, 17:01
|
|
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами:
5447649
Репутация:
28
|
|
Сообщение от Rinat_Namazov
Может можно выделить память (Чтобы при выгрузке функция осталось в процессе), записать туда функцию WndProc которая вызывает следующий WndProc, что бы не сломать очередь?
Тоже об этом думал, но столкнулся с рядом проблем.
1) Не совсем уверен, правильно ли создаю функцию в динамической памяти, может быть есть более правильный способ?
C++:
Код:
void
func
(
)
{
// code
}
int
main
(
)
{
LPVOID memory
=
VirtualAlloc
(
0
,
/* Размер функции в байтах */
,
MEM_COMMIT
,
PAGE_EXECUTE_READWRITE
)
;
DWORD oldProtect
;
VirtualProtect
(
func
,
/* Размер функции*/
,
PAGE_EXECUTE_READWRITE
,
&
oldProtect
)
;
memcpy
(
memory
,
func
,
/* Размер функции */
)
;
VirtualProtect
(
func
,
/* Размер функции */
,
oldProtect
,
0
)
;
// memory - указатель на копию функции func в динамической памяти
}
2) С выделением функции и ее вызовом проблем нет, до выгрузки плагина из игры.
После выгрузки плагина из игры при первом вызове WNDPROC происходит краш.
То есть, если выгрузить плагин, и ничего не делать(не двигать курсор, не нажимать клавиши на клавиатуре), то краша, пока, не будет, до тех пор пока что то не начать делать.
Указатель на оригинальный WNDPROC выделяю динамически, сообщение в чат вовсе убрал.
Смотрел в отладчике, после выгрузки плагина указатель на указатель на оригинальный WNDPROC становится недоступным, тк он находится в самом плагине, который был выгружен. Ну, и, собственно, из за этого и происходит краш. Как исправить не знаю, может кто подскажет?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|