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

  #1  
Старый 28.12.2025, 06:52
rhjossss
Новичок
Регистрация: 28.07.2024
Сообщений: 3
С нами: 946126

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

Всех приветствую, столкнулся с проблемой , при добавлении в чит функционал анлоада (всего чита), получаю краш игры, подскажите пожалуйста какую последовательность нужно соблюдать при анхуке функций и после удаления их самих.

Сейчас логика такая:

Этап 1 — Cheat::Unload() (синхронный):

main.cpp:





Код:
void
Cheat
::
Unload
(
)
{
// 1. Скрываем курсор SAMP если меню открыто
if
(
pMenu
->
bOpen
)
pSAMP
->
toggleSAMPCursor
(
0
)
;
// 2. Удаляем хуки и основные компоненты
delete
pHooks
;
// Снимаем хуки с игры
delete
pD3DHook
;
// Снимаем хук DirectX
delete
pKeyHook
;
// Снимаем хук клавиатуры
delete
pRakClient
;
// Отключаем сетевой клиент
delete
pAimbot
;
// Удаляем аимбот
delete
pVisuals
;
// Удаляем визуалы
// 3. Запускаем отдельный поток для финальной выгрузки
CreateThread
(
NULL
,
NULL
,
LPTHREAD_START_ROUTINE
(
UnloadThread
)
,
g_hModule
,
NULL
,
NULL
)
;
}


Этап 2 — UnloadThread() (асинхронный):

main.cpp:





Код:
DWORD WINAPI
UnloadThread
(
HMODULE hModule
)
{
Sleep
(
100
)
;
// Ждём 100мс чтобы основной поток завершил работу
delete
pMenu
;
// Удаляем меню
delete
pTextures
;
// Удаляем текстуры
delete
pSAMP
;
// Удаляем SAMP интерфейс
FreeLibraryAndExitThread
(
hModule
,
0
)
;
// Выгружаем DLL из памяти
}


Почему два этапа?

А потому что:

Нельзя вызвать FreeLibrary из того же потока, который выполняет код DLL — это приведёт к крашу

FreeLibraryAndExitThread — специальная WinAPI функция, которая атомарно выгружает DLL и завершает поток

Sleep(100) даёт время основному потоку завершить рендеринг текущего кадра

Если ошибся то поправьте

Связь с g_hModule

В main.cpp при загрузке DLL сохраняется её handle:

main.cpp:





Код:
HMODULE g_hModule
=
NULL
;
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD dwReasonForCall
,
LPVOID lpReserved
)
{
case
DLL_PROCESS_ATTACH
:
g_hModule
=
hModule
;
// Сохраняем для последующей выгрузки
.
.
.
}


Этот g_hModule потом передаётся в UnloadThread для вызова FreeLibraryAndExitThread.
 
Ответить с цитированием
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


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




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...