ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Создание ASI-плагина с нуля [1] (https://forum.antichat.xyz/showthread.php?t=1389122)

kin4stat 27.05.2021 01:06

Делать мне было нечего, а работать не хотелось, поэтому вы видите этот гайд
  1. Создание ASI-плагина с нуля
  2. Хуки – что это такое и как с ними работать
  3. Безопасная инициализация и работа с SAMP
  4. Работа с рендером и Directx9
  5. Обработка событий окна + ImGui
В этом гайде мы создадим свой ASI-плагин с нуля, который выведет сообщение на экран.

Введение:

Для начала скажу, что вам понадобится Visual Studio(Так проще всего), и пакеты к ней, а именно - Разработка классических приложений на C++ и Разработка приложений на универсальной платформы Windows.

Все действия производились на Visual Studio 2019, в других версиях интерфейс может отличаться

Создание проекта:

И так, начнем с создания проекта. Жмем кнопку создать проект, и ищем "Библиотека динамической компоновки (DLL)" (Дело в том, что ASI это и есть DLL файл, только с измененным расширением).

Создаем проект. Я назвал его ASIPlugin.

После создания проекта мы видим перед собой окно редактора с подготовленным шаблоном. Шаблон содержит в себе подключение pch.h и функции DllMain.

Настройка проекта:

Начнем с настройки проекта.

В панели меню сверху жмем Проект, и выпадающем меню выбираем пункт Свойства: $ProjectName

Сверху, в выпадающем меню в открывшемся диалоге выбираем Конфигурация -> Все конфигурации.

После этого я обычно отключаю предварительно скомпилированные заголовки(pch.h), но вы можете их оставить(поэкспериментиру те сами)

Включить/Выключить можно в подменю C/C++ -> Предварительно откомпилированные заголовки -> Предварительно откомпилированный заголовок

После этого переходим в Дополнительно -> Расширение целевого файла, меняем .dll на .asi(чтобы подгружалось ASI Лоадером)

(ОПЦИОНАЛЬНО) После этого переходим в Общие -> Выходной каталог, здесь указываем путь до своей GTA

Настройка проекта окончена, переходим к написанию кода

Написание кода:

Функция DllMain - основная функция Dll библиотеки, которая в нашем случае играет роль Asi плагина. Эта функция вызывается при четырех условиях - создании/уничтожении потока, и при присоединении и отсоединении нашей библиотеки. Первые два условия в данный момент нас не особо интересуют, поэтому перейдем к другим двум. Функция принимает в себя 3 аргумента, один из которых зарезервирован системой(lpReserved). Остальные два аргумента показывают нам базовый адрес библиотеки(Адрес по которому начинается наша библиотека в оперативной памяти) и причину вызова функции. Причина вызова как я уже описал выше - имеет 4 значения: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. На данные момент нас интересуют первое и последнее из них. Первое вызывается при присоединении к процессу, последнее - при отсоединении.

Дальше работаем с DLL_PROCESS_ATTACH(В нашем случае оно будет выполнять функцию int main, как в консольном приложении C/C++).

DLL_PROCESS_DETACH на данный момент нам не нужен, т.к. нам нечего освобождать после выгрузки.

Начну с того, что DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше.

Цитата:

Сообщение от Спойлер

Дело в том, что потоки на процессоре могут выполняться совершенно параллельно, и может возникнуть ситуация когда сразу несколько потоков(в нашем случае это поток игры и наш поток) обращаются к одной и той же памяти. Возникает состояние гонки потоков, и это приводит к Undefined Behaviour (по-русски - все пойдет по пизде)

Начнем с того, что к
Код:

case DLL_PROCESS_ATTACH:
добавим
Код:

break;
, чтобы выполнение кода не пошло по другим веткам. Так как нас не интересуют события с потоками, скажем Windows, чтобы она вообще не дергала нас по этому поводу, вызвав функцию
Код:

DisableThreadLibraryCalls(hModule);
Переходим к созданию функции ожидания инициализации и добавления сообщения на экран.

Для функции
Код:

CreateThread
требуется функция определенного типа, а для std::thread подойдет любая. В этом гайде я покажу оба варианта.

Создаем функции:

C++:





Код:

DWORD WINAPI
InitializeAndLoad
(
LPVOID param
)
{
return
0
;
}



Или (для std::thread)

C++:





Код:

void
InitializeAndLoad
(
)
{
}



Функцию добавления сообщения на экран возьмем с plugin-sdk

Далее переходим к инициализации.

Игра хранит свою стадию по адресу 0xC8D4C0

И пока значение по адресу не станет 9(полная инициализация игры) - спим и ждем

C++:





Код:

while
(
*
reinterpret_cast

(
0xC8D4C0
)
!=
9
)
{
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
1u
)
)
;
}



Далее спокойно вызываем функцию AddMessageJumpQ, ведь мы знаем, что игра уже инициализирована

C++:





Код:

void
AddMessageJumpQ
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}



C++:





Код:

AddMessageJumpQ
(
"~r~Hello from blast.hk"
,
5000
,
0
,
false
)
;



Теперь создадим поток инициализации в DllMain, передав ему нашу функцию (не забывайте что для std::thread нужно подключить заголовок thread):

Код:

std::thread(InitializeAndLoad).detach();
Либо:

Код:

CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);
Итого должно выйти примерно так:

Цитата:

Сообщение от Спойлер


C++:





Код:

#include "pch.h"
#include
void
AddMessageJumpQ
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}
void
InitializeAndLoad
(
)
{
while
(
*
reinterpret_cast

(
0xC8D4C0
)
!=
9
)
{
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
100u
)
)
;
}
AddMessageJumpQ
(
"~r~Hello from blast.hk"
,
5000
,
0
,
false
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD  ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
std
::
thread
(
InitializeAndLoad
)
.
detach
(
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}



Либо так, в случае с CreateThread:

C++:





Код:

#include "pch.h"
void
AddMessageJumpQ
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}
DWORD WINAPI
InitializeAndLoad
(
LPVOID
)
{
while
(
*
reinterpret_cast

(
0xC8D4C0
)
!=
9
)
{
Sleep
(
100
)
;
}
AddMessageJumpQ
(
"~r~Hello from blast.hk"
,
1000
,
0
,
false
)
;
return
0
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD  ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
CreateThread
(
0
,
0
,
&
InitializeAndLoad
,
0
,
0
,
0
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}




Жмем Ctrl+Shift+B, ждем окончания сборки, заходим в игру и видим:

https://forum.antichat.xyz/attachments/27751597/

Palapka 27.05.2021 07:52

На сф будет гайд?

loganhackerdff 27.05.2021 09:39

Потоки не в моде

C++:





Код:

mhook
=
new
CCallHook
(
(
void
*
)
0x00748DA3
,
eSafeCall
(
sc_registers
|
sc_flags
)
,
6
)
;
mhook
->
enable
(
mainloop
)
;


kin4stat 27.05.2021 09:44

Цитата:

Сообщение от loganhackerdff

Потоки не в моде

C++:





Код:

mhook
=
new
CCallHook
(
(
void
*
)
0x00748DA3
,
eSafeCall
(
sc_registers
|
sc_flags
)
,
6
)
;
mhook
->
enable
(
mainloop
)
;



Да господи я же написал что не в этот раз, ибо придется объяснять что такое хуки зачем куда и почему

loganhackerdff 27.05.2021 09:52

Цитата:

Сообщение от KiN4StAt

Да господи я же написал что не в этот раз, ибо придется объяснять что такое хуки зачем куда и почему

Ой точно я баран, сори, сори

Gruzin Gang 27.05.2021 11:00

Цитата:

Сообщение от KiN4StAt

Делать мне было нечего, а работать не хотелось, поэтому вы видите этот гайд

В этом гайде мы создадим свой ASI-плагин с нуля, который выведет сообщение на экран.

Введение:
Для начала скажу, что вам понадобится Visual Studio(Так проще всего), и пакеты к ней, а именно - Разработка классических приложений на C++ и Разработка приложений на универсальной платформы Windows.
Все действия производились на Visual Studio 2019, в других версиях интерфейс может отличаться

Создание проекта:
И так, начнем с создания проекта. Жмем кнопку создать проект, и ищем "Библиотека динамической компоновки (DLL)" (Дело в том, что ASI это и есть DLL файл, только с измененным расширением).
Создаем проект. Я назвал его ASIPlugin.

После создания проекта мы видим перед собой окно редактора с подготовленным шаблоном. Шаблон содержит в себе подключение pch.h и функции DllMain.

Настройка проекта:
Начнем с настройки проекта.
В панели меню сверху жмем Проект, и выпадающем меню выбираем пункт Свойства: $ProjectName
Сверху, в выпадающем меню в открывшемся диалоге выбираем Конфигурация -> Все конфигурации.
После этого я обычно отключаю предварительно скомпилированные заголовки(pch.h), но вы можете их оставить(поэкспериментиру те сами)
Включить/Выключить можно в подменю C/C++ -> Предварительно откомпилированные заголовки -> Предварительно откомпилированный заголовок

После этого переходим в Дополнительно -> Расширение целевого файла, меняем .dll на .asi(чтобы подгружалось ASI Лоадером)
(ОПЦИОНАЛЬНО) После этого переходим в Общие -> Выходной каталог, здесь указываем путь до своей GTA

Настройка проекта окончена, переходим к написанию кода

Написание кода:
Функция DllMain - основная функция Dll библиотеки, которая в нашем случае играет роль Asi плагина. Эта функция вызывается при четырех условиях - создании/уничтожении потока, и при присоединении и отсоединении нашей библиотеки. Первые два условия в данный момент нас не особо интересуют, поэтому перейдем к другим двум. Функция принимает в себя 3 аргумента, один из которых зарезервирован системой(lpReserved). Остальные два аргумента показывают нам базовый адрес библиотеки(Адрес по которому начинается наша библиотека в оперативной памяти) и причину вызова функции. Причина вызова как я уже описал выше - имеет 4 значения: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. На данные момент нас интересуют первое и последнее из них. Первое вызывается при присоединении к процессу, последнее - при отсоединении.

Дальше работаем с DLL_PROCESS_ATTACH(В нашем случае оно будет выполнять функцию int main, как в консольном приложении C/C++).
DLL_PROCESS_DETACH на данный момент нам не нужен, т.к. нам нечего освобождать после выгрузки.
Начну с того, что DllMain с причиной DLL_PROCESS_ATTACH вызывается еще до появления окна GTA, когда игра еще не инициализирована, поэтому мы не можем взаимодействовать с игрой на этом моменте, и придется дождаться ее инициализации, это можно сделать разными путями, но на этот раз сделаем через создание потока, но так лучше не делать, и в дальнейшем я возможно покажу как сделать лучше.
Цитата:

Сообщение от Спойлер

Дело в том, что потоки на процессоре могут выполняться совершенно параллельно, и может возникнуть ситуация когда сразу несколько потоков(в нашем случае это поток игры и наш поток) обращаются к одной и той же памяти. Возникает состояние гонки потоков, и это приводит к Undefined Behaviour (по-русски - все пойдет по пизде)

Начнем с того, что к
Код:

case DLL_PROCESS_ATTACH:
добавим
Код:

break;
, чтобы выполнение кода не пошло по другим веткам. Так как нас не интересуют события с потоками, скажем Windows, чтобы она вообще не дергала нас по этому поводу, вызвав функцию
Код:

DisableThreadLibraryCalls(hModule);
Переходим к созданию функции ожидания инициализации и добавления сообщения на экран.
Для функции
Код:

CreateThread
требуется функция определенного типа, а для std::thread подойдет любая. В этом гайде я покажу оба варианта.
Создаем функции:

C++:





Код:

DWORD WINAPI
InitializeAndLoad
(
LPVOID param
)
{
return
0
;
}



Или (для std::thread)

C++:





Код:

void
InitializeAndLoad
(
)
{
}



Функцию добавления сообщения на экран возьмем с plugin-sdk

Далее переходим к инициализации.
Игра хранит свою стадию по адресу 0xC8D4C0
И пока значение по адресу не станет 9(полная инициализация игры) - спим и ждем

C++:





Код:

while
(
*
reinterpret_cast

(
0xC8D4C0
)
!=
9
)
{
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
1u
)
)
;
}



Далее спокойно вызываем функцию AddMessageJumpQ, ведь мы знаем, что игра уже инициализирована

C++:





Код:

void
AddMessageJumpQ
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}



C++:





Код:

AddMessageJumpQ
(
"~r~Hello from blast.hk"
,
5000
,
0
,
false
)
;



Теперь создадим поток инициализации в DllMain, передав ему нашу функцию (не забывайте что для std::thread нужно подключить заголовок thread):

Код:

std::thread(InitializeAndLoad).detach();
Либо:

Код:

CreateThread(0, 0, &InitializeAndLoad, 0, 0, 0);
Итого должно выйти примерно так:
Цитата:

Сообщение от Спойлер


C++:





Код:

#include "pch.h"
#include
void
AddMessageJumpQ
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}
void
InitializeAndLoad
(
)
{
while
(
*
reinterpret_cast

(
0xC8D4C0
)
!=
9
)
{
std
::
this_thread
::
sleep_for
(
std
::
chrono
::
milliseconds
(
100u
)
)
;
}
AddMessageJumpQ
(
"~r~Hello from blast.hk"
,
5000
,
0
,
false
)
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD  ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
std
::
thread
(
InitializeAndLoad
)
.
detach
(
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}



Либо так, в случае с CreateThread:

C++:





Код:

#include "pch.h"
void
AddMessageJumpQ
(
const
char
*
text
,
unsigned
int
time
,
unsigned
short
flag
,
bool
bPreviousBrief
)
{
(
(
void
(
__cdecl
*
)
(
const
char
*
,
unsigned
int
,
unsigned
short
,
bool
)
)
0x69F1E0
)
(
text
,
time
,
flag
,
bPreviousBrief
)
;
}
DWORD WINAPI
InitializeAndLoad
(
LPVOID
)
{
while
(
*
reinterpret_cast

(
0xC8D4C0
)
!=
9
)
{
Sleep
(
100
)
;
}
AddMessageJumpQ
(
"~r~Hello from blast.hk"
,
1000
,
0
,
false
)
;
return
0
;
}
BOOL APIENTRY
DllMain
(
HMODULE hModule
,
DWORD  ul_reason_for_call
,
LPVOID lpReserved
)
{
switch
(
ul_reason_for_call
)
{
case
DLL_PROCESS_ATTACH
:
DisableThreadLibraryCalls
(
hModule
)
;
CreateThread
(
0
,
0
,
&
InitializeAndLoad
,
0
,
0
,
0
)
;
break
;
case
DLL_THREAD_ATTACH
:
case
DLL_THREAD_DETACH
:
case
DLL_PROCESS_DETACH
:
break
;
}
return
TRUE
;
}




Жмем Ctrl+Shift+B, ждем окончания сборки, заходим в игру и видим:

в пизду я лучше пойду дальше луа пилить

Vintik 27.05.2021 11:03

Дело было вечером...

Цитата:

Сообщение от KiN4StAt

Делать было нечего


SR_team 27.05.2021 14:36

Цитата:

Сообщение от KiN4StAt

Разработка приложений на универсальной платформы Windows.

Нахуя? Это же metro-приложения для магазина Windows. Каким боком они к ASI относятся?

Цитата:

Сообщение от KiN4StAt

Начнем с настройки проекта.
В панели меню сверху жмем Проект, и выпадающем меню выбираем пункт Свойства: $ProjectName
Сверху, в выпадающем меню в открывшемся диалоге выбираем Конфигурация -> Все конфигурации.
После этого я обычно отключаю предварительно скомпилированные заголовки(pch.h), но вы можете их оставить(поэкспериментиру те сами)
Включить/Выключить можно в подменю C/C++ -> Предварительно откомпилированные заголовки -> Предварительно откомпилированный заголовок

После этого переходим в Дополнительно -> Расширение целевого файла, меняем .dll на .asi(чтобы подгружалось ASI Лоадером)
(ОПЦИОНАЛЬНО) После этого переходим в Общие -> Выходной каталог, здесь указываем путь до своей GTA

Настройка проекта окончена, переходим к написанию кода

добавь сюда скриншоты, без них хлебушки не осилят мышкой тыкать

Цитата:

Сообщение от KiN4StAt

Функция DllMain - основная функция Dll библиотеки, которая в нашем случае играет роль Asi плагина

Я тут недавно одному челу с курсачем помогал, так вот у него были проблемы с распознанием функций, Твои хлебушки так же могут начать херачить код в начало или конец DllMain.cpp. Добавь скрины

Цитата:

Сообщение от KiN4StAt

Первое вызывается при присоединении к процессу, последнее - при отсоединении.

А еще при присоединении и отсоединении происходит вызов конструкторов и деструкторов для глобальных объектов, можно написать свой класс, который будет все инициализировать и уничтожать, и просто создать его глобальный инстанс. Но в Windows такое не всегда работает без DllMain, но причин не помню, года 4+ назад тыкал это

SR_team 27.05.2021 15:11

Цитата:

Сообщение от loganhackerdff

Потоки не в моде

C++:





Код:

mhook
=
new
CCallHook
(
(
void
*
)
0x00748DA3
,
eSafeCall
(
sc_registers
|
sc_flags
)
,
6
)
;
mhook
->
enable
(
mainloop
)
;



Кал хуки не в моде

C++:





Код:

static
SRHook
::
Hook

gameloopHook
{
0x748DA3
,
6
}
;
gameloopHook
.
install
(
)
;
gameloopHook
.
onBefore
+=
GameLoop
;


AkrD1338 15.07.2021 21:22

а как скомпилировать , если есть исходник прошу помогите

F0RQU1N and 26.07.2021 06:34

Цитата:

Сообщение от AkrD1338

а как скомпилировать , если есть исходник прошу помогите

скомплировать - ctrl + shift + b, и выбери сверху release и x86

kin4stat 08.09.2021 02:14

Цитата:

Сообщение от SR_team

Кал хуки не в моде

C++:





Код:

static
SRHook
::
Hook

gameloopHook
{
0x748DA3
,
6
}
;
gameloopHook
.
install
(
)
;
gameloopHook
.
onBefore
+=
GameLoop
;



Срхуки не в моде

C++:





Код:

static
kthook_simple_t

hook
{
0x748DA3
}
;
hook
.
before
.
connect
(
GameLoop
)
;


SR_team 08.09.2021 13:40

Цитата:

Сообщение от kin4stat

Срхуки не в моде

C++:





Код:

static
kthook_simple_t

hook
{
0x748DA3
}
;
hook
.
before
.
connect
(
GameLoop
)
;



В срхуках не важен calling convention и для функций без аргументов можно оставить просто <>

kin4stat 08.09.2021 14:18

Цитата:

Сообщение от SR_team

В срхуках не важен calling convention и для функций без аргументов можно оставить просто <>

А еще нет поддержки fastcall, и используется куча ассемблера который потом не перенести на x64 гыг

А, еще, нет автоопределения размера хука

SR_team 08.09.2021 14:47

Цитата:

Сообщение от kin4stat

А еще нет поддержки fastcall, и используется куча ассемблера который потом не перенести на x64 гыг
А, еще, нет автоопределения размера хука

А как ты собираешься без ассемблера хукать что-то отличное от функций, например условия? И в x64 нет fastcall

kin4stat 08.09.2021 15:04

Цитата:

Сообщение от SR_team

А как ты собираешься без ассемблера хукать что-то отличное от функций, например условия? И в x64 нет fastcall

Так в x86 он один фиг остается

SR_team 08.09.2021 16:21

Цитата:

Сообщение от kin4stat

Так в x86 он один фиг остается

ни разу не видел, что бы он где-то использовался

kin4stat 08.09.2021 17:25

Цитата:

Сообщение от SR_team

ни разу не видел, что бы он где-то использовался

Ну ты может не видел, у меня юзкейсы были, так бы я тоже с этим фастоколлом не ебался бы

manukhov 03.01.2022 02:29

Цитата:

Сообщение от kin4stat

Начнем с того, что к
Код:

case DLL_PROCESS_ATTACH:
добавим
Код:

break;
, чтобы выполнение кода не пошло по другим веткам. Так как нас не интересуют события с потоками, скажем Windows, чтобы она вообще не дергала нас по этому поводу, вызвав функцию
Код:

DisableThreadLibraryCalls(hModule);

ну тогда наверно стоит просто bool fdwReason присвоить

C++:





Код:

BOOL APIENTRY
DllMain
(
HMODULE hModule
,
bool
fdwReason
,
LPVOID lpReserved
)
{
if
(
fdwReason
)
{
g_hModule
=
hModule
;
DisableThreadLibraryCalls
(
hModule
)
;
CreateThread
(
NULL
,
NULL
,
(
LPTHREAD_START_ROUTINE
)
main
,
NULL
,
NULL
,
NULL
)
;
}
return
TRUE
;
}


kin4stat 03.01.2022 02:38

Цитата:

Сообщение от T4yz1e

ну тогда наверно стоит просто bool fdwReason присвоить

C++:





Код:

BOOL APIENTRY
DllMain
(
HMODULE hModule
,
bool
fdwReason
,
LPVOID lpReserved
)
{
if
(
fdwReason
)
{
g_hModule
=
hModule
;
DisableThreadLibraryCalls
(
hModule
)
;
CreateThread
(
NULL
,
NULL
,
(
LPTHREAD_START_ROUTINE
)
main
,
NULL
,
NULL
,
NULL
)
;
}
return
TRUE
;
}



Сигнатура не совпадет, может линкер ошибкой отбить, мол не то подаешь. А вообще это IFNDR. В целом подмена entrypoint, это уже отдельная тема, там много нюансов, слишком большое обсуждение выйдет

manukhov 03.01.2022 02:49

Цитата:

Сообщение от kin4stat

Сигнатура не совпадет, может линкер ошибкой отбить, мол не то подаешь. А вообще это IFNDR. В целом подмена entrypoint, это уже отдельная тема, там много нюансов, слишком большое обсуждение выйдет

Окей, но я делал так в течении какого-то времени и у меня проблем пока не возникало, я думаю здесь это не так принципиально.

Leatington 29.04.2022 10:47

Возможно, мелкое замечание, но почему бы не создавать сразу пустой проэкт, чтобы потом не вычищать оттуда прекомпилированные заголовки, раз ты их всё равно не используешь?

evan. 27.07.2022 16:42

странно, у меня ASI Loader не читает плагин вообще

ВЛАД ДИНОЗАВР 22.08.2022 02:01

Цитата:

Сообщение от kin4stat

И так, начнем с создания проекта. Жмем кнопку создать проект, и ищем "Библиотека динамической компоновки (DLL)" (Дело в том, что ASI это и есть DLL файл, только с измененным расширением).

в каком разделе? я не нашёл (lmao)

Okak_Pon 11.02.2024 23:00

Для гта 4 будет работать?

Vintik 12.02.2024 21:59

Цитата:

Сообщение от William_Chkhalo

Для гта 4 будет работать?

Да

Uno 0_o 17.08.2024 19:14

жду гайд на создание Internal чита через чтение и перезапись памяти

игрок сампа 07.01.2026 14:33

странно почему то не работает код с гайда

Vintik 10.01.2026 15:21

Цитата:

Сообщение от игрок сампа

странно почему то не работает код с гайда

нужно больше инфы


Время: 05:58