Просмотр полной версии : ASI плагин с использованием только структур/классов. Вопрос.
Увидел как SR_team написал плагин используя только структуры без функции main, попробовал, но в игре НЕТ НИКАКИХ ИЗМЕНЕНИЙ.
Сначала был такой код:
C++:
#include
#pragma warning(disable:4996)
struct
loader
{
public
:
loader
(
)
{
memset
(
(
unsigned
char
*
)
0x00522F6A
,
0x90
,
6
)
;
// FixFOV
*
(
float
*
)
0x00522F7A
=
90
;
strcpy
(
reinterpret_cast
(
0x866C8C
)
,
"$-%d"
)
;
strcpy
(
reinterpret_cast
(
0x866C94
)
,
"$%d"
)
;
*
(
char
*
)
7520695
=
235
;
*
(
float
*
)
0xB6EC1C
=
0.00012
;
*
(
float
*
)
0xB6EC18
=
*
(
float
*
)
0xB6EC1C
;
*
(
unsigned
char
*
)
0x00561344
=
*
(
unsigned
char
*
)
0x005609FF
=
0xEB
;
*
(
float
*
)
0x00B7C4F0
=
420
;
*
(
char
*
)
0x058E280
=
235
;
}
}
Loader
;
Но, как я и описал выше, никаких изменений, затем я обратился за помощью к ChatGPT и он выдал мне этот код, который я скомпилировал:
C++:
#include
struct
Loader
{
Loader
(
)
{
PatchMemory
(
(
LPVOID
)
0x00522F6A
,
"\x90\x90\x90\x90\x90\x90"
,
6
)
;
// FixFOV
*
(
float
*
)
0x00522F7A
=
90
;
strcpy_s
(
reinterpret_cast
(
0x866C8C
)
,
sizeof
(
"$-%d"
)
,
"$-%d"
)
;
strcpy_s
(
reinterpret_cast
(
0x866C94
)
,
sizeof
(
"$%d"
)
,
"$%d"
)
;
*
(
char
*
)
7520695
=
235
;
*
(
float
*
)
0xB6EC1C
=
0.00012f
;
*
(
float
*
)
0xB6EC18
=
*
(
float
*
)
0xB6EC1C
;
*
(
unsigned
char
*
)
0x00561344
=
*
(
unsigned
char
*
)
0x005609FF
=
0xEB
;
*
(
float
*
)
0x00B7C4F0
=
420
;
*
(
char
*
)
0x058E280
=
235
;
}
static
void
PatchMemory
(
LPVOID address
,
const
void
*
data
,
size_t size
)
{
DWORD oldProtect
;
VirtualProtect
(
address
,
size
,
PAGE_EXECUTE_READWRITE
,
&
oldProtect
)
;
memcpy
(
address
,
data
,
size
)
;
VirtualProtect
(
address
,
size
,
oldProtect
,
&
oldProtect
)
;
}
}
;
Loader loader
;
Чуда не произошло. Что есть плагин, что его нет, ГТАшке все равно. Пишу эту тему с потребностью поинтересоваться ЧТО НЕ ТАК?
Хочу дополнить. Вот ссылка не код, в котором я увидел подобную реализацию без функции main(): https://gitlab.com/prime-hack/samp/plugins/ChromeKiller/-/blob/main/main.cpp
Я не знаю С++, но возможно это?
https://forum.antichat.xyz/attachments/28332886/
Я не знаю С++, но возможно это?
скачал плагин SR_team'a работает
Я не знаю С++, но возможно это?
https://www.blast.hk/threads/173829/ Я скачал готовый .asi, захотел посмотреть сурс, а там это
EclipsedFlow
28.06.2023, 23:01
C++:
// Создаешь класс/структуру. В
// Создай конструктор и деструктор для них.
// Первый метод после "public:" - Конструктор, второй Деструктор.
// Конструктор выполняет код один раз при создании объекта класса/структруры.
// Деструктор обратное, вызывается один раз при удалении объекта из поля видисмоти.
// Тебе остается создать объект в глобальной области.
class
Boot
{
public
:
Boot
(
void
)
// Конструктор
{
// код выполняется раз при инициализации объкта.
}
~
Boot
(
void
)
// деструктор
{
// код выполняется раз при выхода из видисмоти/удалении объекта.
}
}
g_boot
;
// Или
Boot g_boot
;
C++:
// Создаешь класс/структуру. В
// Создай конструктор и деструктор для них.
// Первый метод после "public:" - Конструктор, второй Деструктор.
// Конструктор выполняет код один раз при создании объекта класса/структруры.
// Деструктор обратное, вызывается один раз при удалении объекта из поля видисмоти.
// Тебе остается создать объект в глобальной области.
class
Boot
{
public
:
Boot
(
void
)
// Конструктор
{
// код выполняется раз при инициализации объкта.
}
~
Boot
(
void
)
// деструктор
{
// код выполняется раз при выхода из видисмоти/удалении объекта.
}
}
g_boot
;
// Или
Boot g_boot
;
так я же так и сделал?
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.
Тебе для каждого адреса по которому ты пишешь, надо сначала разрешить запись через VirtualProtect
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.
Тебе для каждого адреса по которому ты пишешь, надо сначала разрешить запись через VirtualProtect
Но если делать подобную инициализацию в цикле, который находится в функции main, то гта не крашится без разрешения записи VirtualProtect
Но если делать подобную инициализацию в цикле, который находится в функции main, то гта не крашится без разрешения записи VirtualProtect
У тебя она не может не крашится. Может ты под циклом имеешь в виду mainloop из SF - это немного другое, и там CLEO снимает протект на всю память игры. Тут ты пишешь раньше.
И адрес 0x00561344, например, указывает на код. У кода по умолчанию разрешены только чтение и выполнение, а запись запрещена
У тебя она не может не крашится. Может ты под циклом имеешь в виду mainloop из SF - это немного другое, и там CLEO снимает протект на всю память игры. Тут ты пишешь раньше.
И адрес 0x00561344, например, указывает на код. У кода по умолчанию разрешены только чтение и выполнение, а запись запрещена
C++:
#include "windows.h"
#include "process.h"
#include "cstdint"
#pragma warning(disable:4996)
class
rain_noise
{
public
:
void
fixNoise
(
)
;
private
:
static
char
&
a1
;
static
int
&
a2
;
static
char
&
b1
;
static
int
&
b2
;
static
char
&
c1
;
static
int
&
c2
;
static
char
&
d1
;
static
int
&
d2
;
}
;
char
&
rain_noise
::
a1
=
*
(
char
*
)
0x72C7C0
;
int
&
rain_noise
::
a2
=
*
(
int
*
)
0x72C7C1
;
char
&
rain_noise
::
b1
=
*
(
char
*
)
0x705078
;
int
&
rain_noise
::
b2
=
*
(
int
*
)
0x705079
;
char
&
rain_noise
::
c1
=
*
(
char
*
)
0x72AAE0
;
int
&
rain_noise
::
c2
=
*
(
int
*
)
0x72AAE1
;
char
&
rain_noise
::
d1
=
*
(
char
*
)
0x53E126
;
int
&
rain_noise
::
d2
=
*
(
int
*
)
0x53E127
;
void
rain_noise
::
fixNoise
(
)
{
a1
=
144
;
a2
=
-
1869574000
;
b1
=
144
;
b2
=
-
1869574000
;
c1
=
144
;
c2
=
-
1869574000
;
//d1 = 144;
//d2 = -1869574000;
}
class
fov90
{
public
:
void
setFov
(
)
{
Afov2
=
90
;
// ������� ���� ������, ������������ �� �����������
fov1
=
90
;
// �����������.
// ���� �������
fov3
=
90
;
// ����������� ���� ������ ��� ���2
fov4
=
90
;
}
private
:
float
&
fov1
=
*
(
float
*
)
0x00522F7A
;
float
&
Afov2
=
*
(
float
*
)
0x00B6F250
;
float
&
fov3
=
*
(
float
*
)
0x8D5038
;
float
&
fov4
=
*
(
float
*
)
0xB6FF5C
;
}
;
class
fogdist
{
public
:
void
setFogDist
(
int
distance
)
{
fd1
=
fd2
=
0xEB
;
fd3
=
distance
;
}
private
:
unsigned
char
&
fd1
=
*
(
unsigned
char
*
)
0x00561344
;
unsigned
char
&
fd2
=
*
(
unsigned
char
*
)
0x005609FF
;
float
&
fd3
=
*
(
float
*
)
0x00B7C4F0
;
// float& LodDist = *(float*)0x00858FD8;
}
;
class
HUD
{
public
:
void
setHUD
(
)
{
// HealthHeight = 9;
// HealthWidth = 109; // 109
// HealthX = 141; //141
// HealthY = 77;
// ArmorX = 114; // 94
// ArmorY = 48; // 48
// MoneyX_ = 64;
// MoneyY_ = 89;
// MoneyY_ = (float)89.0;
// MoneyX = 20;
// MoneyY = 79; // 89
MoneyXScale
=
0.5
;
// 0.55
MoneyYScale
=
0.9
;
// 1.1
// radarrect = 1075318232;
WantedXScale
=
0.45
;
// 0.605
WantedYScale
=
0.9
;
// 1.21
WI_W
=
47
;
// 47;
WantedColor
=
0xFFD8D8D8
;
}
private
:
// float& HealthWidth = *(float*)0x866BB8;
// float& HealthHeight = *(float*)0x85EED4;
// float& HealthX = *(float*)0x86535C;
// float& HealthY = *(float*)0x866CA8;
// float& ArmorX = *(float*)0x866B78;
// float& ArmorY = *(float*)0x862D38;
// float& MoneyX = *(float*)0x85950C;
// byte& MoneyX_ = *(byte*)0x58F5FC;
// float& MoneyY = *(float*)0x866C88;
// byte& MoneyY_ = *(byte*)0x58F5DC;
float
&
WI_W
=
*
(
float
*
)
0x866C4C
;
float
&
WantedXScale
=
*
(
float
*
)
0x866C60
;
float
&
WantedYScale
=
*
(
float
*
)
0x866C64
;
float
&
MoneyXScale
=
*
(
float
*
)
0x866CAC
;
float
&
MoneyYScale
=
*
(
float
*
)
0x858F14
;
int
&
radarrect
=
*
(
int
*
)
0x58585A
;
char
&
WantedColor
=
*
(
char
*
)
0x58DDC9
;
}
;
/*namespace radarzoomfix
{
float& a3 = *(float*)5794971; // 180
// float& a0 = *(float*)5794971;
char& a2 = *(char*)5794943;
// float& b4 = *(float*)5810889;
// float& c5 = *(float*)5810877;
// float& d6 = *(float*)5810871;
// float& a7 = *(float*)5811888;
// float& a8 = *(float*)5811894;
float& a6 = *(float*)5810871;
float& a5 = *(float*)5810877;
float& a7 = *(float*)5811888;
float& a8 = *(float*)5811894;
}*/
void
__cdecl
MainThread
(
void
*
pArg
)
{
rain_noise a
;
fov90 b
;
fogdist c
;
HUD d
;
std
::
uint8_t
chromekiller
[
]
{
*
(
std
::
uint8_t
*
)
0x00733275
,
*
(
std
::
uint8_t
*
)
0x00733FB6
,
*
(
std
::
uint8_t
*
)
0x00733365
,
*
(
std
::
uint8_t
*
)
0x00734276
,
*
(
std
::
uint8_t
*
)
0x0073357E
,
*
(
std
::
uint8_t
*
)
0x007344D1
,
*
(
std
::
uint8_t
*
)
0x00733453
,
*
(
std
::
uint8_t
*
)
0x007343A6
}
;
while
(
true
)
{
while
(
(
*
(
char
*
)
0xC8D4C0
)
!=
9
)
{
Sleep
(
100
)
;
}
bool
&
denchik
=
*
(
bool
*
)
0x58F58D
;
int
&
colorhp
=
*
(
int
*
)
0xBAB22C
;
float
&
deagle
=
*
(
float
*
)
0x521632
;
float
&
ak47m4rifle
=
*
(
float
*
)
0x8CC4B4
;
float
&
zspeed
=
*
(
float
*
)
0x862F1C
;
float
&
sens1
=
*
(
float
*
)
0xB6EC1C
;
float
&
sens2
=
*
(
float
*
)
0xB6EC18
;
int
valuecolor
=
0xFFD8D8D8
;
int
*
p_valuecolor
;
denchik
=
1
;
p_valuecolor
=
(
int
*
)
0xBAB230
;
*
p_valuecolor
=
valuecolor
;
colorhp
=
valuecolor
;
deagle
=
70
;
ak47m4rifle
=
70
;
// freetarget = 90;
zspeed
=
0
;
// tochkapricel = 235;
sens1
=
0.00012
;
sens2
=
sens1
;
//aatochkapric = 235;
*
(
char
*
)
0x058E280
=
235
;
char
&
no_more_haze
=
*
(
char
*
)
7520695
;
a
.
fixNoise
(
)
;
b
.
setFov
(
)
;
c
.
setFogDist
(
600
)
;
d
.
setHUD
(
)
;
no_more_haze
=
235
;
strcpy
(
reinterpret_cast
(
0x866C8C
)
,
"$-%d"
)
;
strcpy
(
reinterpret_cast
(
0x866C94
)
,
"$%d"
)
;
for
(
std
::
uint8_t
element
:
chromekiller
)
{
element
=
0xEB
;
}
}
}
BOOL WINAPI
DllMain
(
_In_ HINSTANCE hinstDLL
,
_In_ DWORD fdwReason
,
_In_ PVOID lpvReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
_beginthread
(
MainThread
,
NULL
,
nullptr
)
;
return
TRUE
;
}
Вот код из говна и палок где используется обычный цикл, гта не крашилась из-за него. Крашилась из-за достижения 500 МБ памяти стрима (я без BufferCleaner'a).
комментарии в "вопросиках", потому что я открыл .cpp в VS Code, а изначально он был в VS 2022
C++:
#include "windows.h"
#include "process.h"
#include "cstdint"
#pragma warning(disable:4996)
class
rain_noise
{
public
:
void
fixNoise
(
)
;
private
:
static
char
&
a1
;
static
int
&
a2
;
static
char
&
b1
;
static
int
&
b2
;
static
char
&
c1
;
static
int
&
c2
;
static
char
&
d1
;
static
int
&
d2
;
}
;
char
&
rain_noise
::
a1
=
*
(
char
*
)
0x72C7C0
;
int
&
rain_noise
::
a2
=
*
(
int
*
)
0x72C7C1
;
char
&
rain_noise
::
b1
=
*
(
char
*
)
0x705078
;
int
&
rain_noise
::
b2
=
*
(
int
*
)
0x705079
;
char
&
rain_noise
::
c1
=
*
(
char
*
)
0x72AAE0
;
int
&
rain_noise
::
c2
=
*
(
int
*
)
0x72AAE1
;
char
&
rain_noise
::
d1
=
*
(
char
*
)
0x53E126
;
int
&
rain_noise
::
d2
=
*
(
int
*
)
0x53E127
;
void
rain_noise
::
fixNoise
(
)
{
a1
=
144
;
a2
=
-
1869574000
;
b1
=
144
;
b2
=
-
1869574000
;
c1
=
144
;
c2
=
-
1869574000
;
//d1 = 144;
//d2 = -1869574000;
}
class
fov90
{
public
:
void
setFov
(
)
{
Afov2
=
90
;
// ������� ���� ������, ������������ �� �����������
fov1
=
90
;
// �����������.
// ���� �������
fov3
=
90
;
// ����������� ���� ������ ��� ���2
fov4
=
90
;
}
private
:
float
&
fov1
=
*
(
float
*
)
0x00522F7A
;
float
&
Afov2
=
*
(
float
*
)
0x00B6F250
;
float
&
fov3
=
*
(
float
*
)
0x8D5038
;
float
&
fov4
=
*
(
float
*
)
0xB6FF5C
;
}
;
class
fogdist
{
public
:
void
setFogDist
(
int
distance
)
{
fd1
=
fd2
=
0xEB
;
fd3
=
distance
;
}
private
:
unsigned
char
&
fd1
=
*
(
unsigned
char
*
)
0x00561344
;
unsigned
char
&
fd2
=
*
(
unsigned
char
*
)
0x005609FF
;
float
&
fd3
=
*
(
float
*
)
0x00B7C4F0
;
// float& LodDist = *(float*)0x00858FD8;
}
;
class
HUD
{
public
:
void
setHUD
(
)
{
// HealthHeight = 9;
// HealthWidth = 109; // 109
// HealthX = 141; //141
// HealthY = 77;
// ArmorX = 114; // 94
// ArmorY = 48; // 48
// MoneyX_ = 64;
// MoneyY_ = 89;
// MoneyY_ = (float)89.0;
// MoneyX = 20;
// MoneyY = 79; // 89
MoneyXScale
=
0.5
;
// 0.55
MoneyYScale
=
0.9
;
// 1.1
// radarrect = 1075318232;
WantedXScale
=
0.45
;
// 0.605
WantedYScale
=
0.9
;
// 1.21
WI_W
=
47
;
// 47;
WantedColor
=
0xFFD8D8D8
;
}
private
:
// float& HealthWidth = *(float*)0x866BB8;
// float& HealthHeight = *(float*)0x85EED4;
// float& HealthX = *(float*)0x86535C;
// float& HealthY = *(float*)0x866CA8;
// float& ArmorX = *(float*)0x866B78;
// float& ArmorY = *(float*)0x862D38;
// float& MoneyX = *(float*)0x85950C;
// byte& MoneyX_ = *(byte*)0x58F5FC;
// float& MoneyY = *(float*)0x866C88;
// byte& MoneyY_ = *(byte*)0x58F5DC;
float
&
WI_W
=
*
(
float
*
)
0x866C4C
;
float
&
WantedXScale
=
*
(
float
*
)
0x866C60
;
float
&
WantedYScale
=
*
(
float
*
)
0x866C64
;
float
&
MoneyXScale
=
*
(
float
*
)
0x866CAC
;
float
&
MoneyYScale
=
*
(
float
*
)
0x858F14
;
int
&
radarrect
=
*
(
int
*
)
0x58585A
;
char
&
WantedColor
=
*
(
char
*
)
0x58DDC9
;
}
;
/*namespace radarzoomfix
{
float& a3 = *(float*)5794971; // 180
// float& a0 = *(float*)5794971;
char& a2 = *(char*)5794943;
// float& b4 = *(float*)5810889;
// float& c5 = *(float*)5810877;
// float& d6 = *(float*)5810871;
// float& a7 = *(float*)5811888;
// float& a8 = *(float*)5811894;
float& a6 = *(float*)5810871;
float& a5 = *(float*)5810877;
float& a7 = *(float*)5811888;
float& a8 = *(float*)5811894;
}*/
void
__cdecl
MainThread
(
void
*
pArg
)
{
rain_noise a
;
fov90 b
;
fogdist c
;
HUD d
;
std
::
uint8_t
chromekiller
[
]
{
*
(
std
::
uint8_t
*
)
0x00733275
,
*
(
std
::
uint8_t
*
)
0x00733FB6
,
*
(
std
::
uint8_t
*
)
0x00733365
,
*
(
std
::
uint8_t
*
)
0x00734276
,
*
(
std
::
uint8_t
*
)
0x0073357E
,
*
(
std
::
uint8_t
*
)
0x007344D1
,
*
(
std
::
uint8_t
*
)
0x00733453
,
*
(
std
::
uint8_t
*
)
0x007343A6
}
;
while
(
true
)
{
while
(
(
*
(
char
*
)
0xC8D4C0
)
!=
9
)
{
Sleep
(
100
)
;
}
bool
&
denchik
=
*
(
bool
*
)
0x58F58D
;
int
&
colorhp
=
*
(
int
*
)
0xBAB22C
;
float
&
deagle
=
*
(
float
*
)
0x521632
;
float
&
ak47m4rifle
=
*
(
float
*
)
0x8CC4B4
;
float
&
zspeed
=
*
(
float
*
)
0x862F1C
;
float
&
sens1
=
*
(
float
*
)
0xB6EC1C
;
float
&
sens2
=
*
(
float
*
)
0xB6EC18
;
int
valuecolor
=
0xFFD8D8D8
;
int
*
p_valuecolor
;
denchik
=
1
;
p_valuecolor
=
(
int
*
)
0xBAB230
;
*
p_valuecolor
=
valuecolor
;
colorhp
=
valuecolor
;
deagle
=
70
;
ak47m4rifle
=
70
;
// freetarget = 90;
zspeed
=
0
;
// tochkapricel = 235;
sens1
=
0.00012
;
sens2
=
sens1
;
//aatochkapric = 235;
*
(
char
*
)
0x058E280
=
235
;
char
&
no_more_haze
=
*
(
char
*
)
7520695
;
a
.
fixNoise
(
)
;
b
.
setFov
(
)
;
c
.
setFogDist
(
600
)
;
d
.
setHUD
(
)
;
no_more_haze
=
235
;
strcpy
(
reinterpret_cast
(
0x866C8C
)
,
"$-%d"
)
;
strcpy
(
reinterpret_cast
(
0x866C94
)
,
"$%d"
)
;
for
(
std
::
uint8_t
element
:
chromekiller
)
{
element
=
0xEB
;
}
}
}
BOOL WINAPI
DllMain
(
_In_ HINSTANCE hinstDLL
,
_In_ DWORD fdwReason
,
_In_ PVOID lpvReserved
)
{
if
(
fdwReason
==
DLL_PROCESS_ATTACH
)
_beginthread
(
MainThread
,
NULL
,
nullptr
)
;
return
TRUE
;
}
Вот код из говна и палок где используется обычный цикл, гта не крашилась из-за него. Крашилась из-за достижения 500 МБ памяти стрима (я без BufferCleaner'a).
комментарии в "вопросиках", потому что я открыл .cpp в VS Code, а изначально он был в VS 2022
Так ты в цикле ждешь пока игра загрузится, за это время успевает загрузится CLEO и применить VirtualProtect к игре
Так ты в цикле ждешь пока игра загрузится, за это время успевает загрузится CLEO и применить VirtualProtect к игре
клео в сборке нет, ни клео, ни мунлоадера, ни сф, ни модлоадера. У меня в сборке один только ASI Loader. У меня один аси, чтобы избежать любых конфликтов с клео, луа, сф и так далее
клео в сборке нет, ни клео, ни мунлоадера, ни сф, ни модлоадера. У меня в сборке один только ASI Loader. У меня один аси, чтобы избежать любых конфликтов с клео, луа, сф и так далее
значит asi-loader снимает протект, потому что нельзя писать в зпротекченную ппамять
значит asi-loader снимает протект, потому что нельзя писать в зпротекченную ппамять
Я понял. Почему запись в функции main работает. А запись через структуру нет? Аси Лоадер распространяет снятие протекта только на "точку входа" или как это работает, наверное чушь написал, просто мне непонятно, если аси лоадер снимает протект, то он должен снимать его и для структур или нет?
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot