HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #2861  
Старый 09.09.2018, 23:40
_Vine_
Участник форума
Регистрация: 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
;
}
 
Ответить с цитированием

  #2862  
Старый 10.09.2018, 05:50
CleanLegend
Постоянный
Регистрация: 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/)
 
Ответить с цитированием

  #2863  
Старый 11.09.2018, 08:46
_Vine_
Участник форума
Регистрация: 06.01.2016
Сообщений: 154
С нами: 5447649

Репутация: 28
По умолчанию

Цитата:
Сообщение от CleanLegend  

BlastHackNet/mod_s0beit_sa(https://github.com/BlastHackNet/mod_s0beit_sa/blob/master/src/samp.cpp#L675)

cheat_state->state maybe can't change, check it

в sf wndproc уже перехвачен, достаточно зарегать каллбек.
тут пример - Гайд - API SF | Урок 5 - Подключение ImGui(https://blast.hk/threads/23083/)
А можно ли как то сделать это без сф?
 
Ответить с цитированием

  #2864  
Старый 11.09.2018, 09:20
MISTER_GONWIK
Познавший АНТИЧАТ
Регистрация: 09.03.2013
Сообщений: 1,262
С нами: 6935116

Репутация: 183


По умолчанию

Цитата:
Сообщение от _Vine_  

А можно ли как то сделать это без сф?
нет, твой хук потом еще 40 раз какие-нибудь собейты, сфы перезапишут в итоге очередь не вернуть
 
Ответить с цитированием

  #2865  
Старый 11.09.2018, 09:33
#Rin
Познавший АНТИЧАТ
Регистрация: 09.08.2015
Сообщений: 1,213
С нами: 5663255

Репутация: 183


По умолчанию

Цитата:
Сообщение от Weeq  

нет, твой хук потом еще 40 раз какие-нибудь собейты, сфы перезапишут в итоге очередь не вернуть
Может можно выделить память (Чтобы при выгрузке функция осталось в процессе), записать туда функцию WndProc которая вызывает следующий WndProc, что бы не сломать очередь?
 
Ответить с цитированием

  #2866  
Старый 12.09.2018, 10:27
-raymond-
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами: 4423953

Репутация: 68
По умолчанию

как отправить фейк анимацию
 
Ответить с цитированием

  #2867  
Старый 12.09.2018, 10:53
Roger571
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами: 5689694

Репутация: 68
По умолчанию

Цитата:
Сообщение от raymondique  

как отправить фейк анимацию
Хукать онфут дату и редактировать параметры sCurrentAnimationID, sAnimFlags
 
Ответить с цитированием

  #2868  
Старый 12.09.2018, 11:11
-raymond-
Участник форума
Регистрация: 17.12.2017
Сообщений: 110
С нами: 4423953

Репутация: 68
По умолчанию

как изменить текст уже отрендеренного текста?
 
Ответить с цитированием

  #2869  
Старый 12.09.2018, 11:33
Roger571
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами: 5689694

Репутация: 68
По умолчанию

Цитата:
Сообщение от beento  

как изменить текст уже отрендеренного текста?
Смотря какого текста.

Если игрового, то через память.

А через д3д хук - сам решаешь, шо рендерить.

Цитата:
Сообщение от beento  

я уже отрендерил текст через д3д, как мне изменить текст на другой?
Ты можешь изменять данные каждый раз при вызове proxyIDirect3DDevice9::Present

Можешь посмотреть, как это реализовано в собейте.
 
Ответить с цитированием

  #2870  
Старый 12.09.2018, 17:01
_Vine_
Участник форума
Регистрация: 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)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.