PDA

Просмотр полной версии : ASI плагин с использованием только структур/классов. Вопрос.


ya_noob
28.06.2023, 22:31
Увидел как 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

siwage
28.06.2023, 22:46
Я не знаю С++, но возможно это?

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

ya_noob
28.06.2023, 22:51
Я не знаю С++, но возможно это?


скачал плагин 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
;

ya_noob
28.06.2023, 23:25
C++:






// Создаешь класс/структуру. В
// Создай конструктор и деструктор для них.
// Первый метод после "public:" - Конструктор, второй Деструктор.
// Конструктор выполняет код один раз при создании объекта класса/структруры.
// Деструктор обратное, вызывается один раз при удалении объекта из поля видисмоти.
// Тебе остается создать объект в глобальной области.
class
Boot
{
public
:
Boot
(
void
)
// Конструктор
{
// код выполняется раз при инициализации объкта.
}
~
Boot
(
void
)
// деструктор
{
// код выполняется раз при выхода из видисмоти/удалении объекта.
}
}
g_boot
;
// Или
Boot g_boot
;





так я же так и сделал?

SR_team
28.06.2023, 23:32
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.

Тебе для каждого адреса по которому ты пишешь, надо сначала разрешить запись через VirtualProtect

ya_noob
28.06.2023, 23:35
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.

Тебе для каждого адреса по которому ты пишешь, надо сначала разрешить запись через VirtualProtect


Но если делать подобную инициализацию в цикле, который находится в функции main, то гта не крашится без разрешения записи VirtualProtect

SR_team
28.06.2023, 23:38
Но если делать подобную инициализацию в цикле, который находится в функции main, то гта не крашится без разрешения записи VirtualProtect


У тебя она не может не крашится. Может ты под циклом имеешь в виду mainloop из SF - это немного другое, и там CLEO снимает протект на всю память игры. Тут ты пишешь раньше.

И адрес 0x00561344, например, указывает на код. У кода по умолчанию разрешены только чтение и выполнение, а запись запрещена

ya_noob
28.06.2023, 23:40
У тебя она не может не крашится. Может ты под циклом имеешь в виду 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

SR_team
29.06.2023, 21:46
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 к игре

ya_noob
29.06.2023, 23:52
Так ты в цикле ждешь пока игра загрузится, за это время успевает загрузится CLEO и применить VirtualProtect к игре


клео в сборке нет, ни клео, ни мунлоадера, ни сф, ни модлоадера. У меня в сборке один только ASI Loader. У меня один аси, чтобы избежать любых конфликтов с клео, луа, сф и так далее

SR_team
30.06.2023, 04:37
клео в сборке нет, ни клео, ни мунлоадера, ни сф, ни модлоадера. У меня в сборке один только ASI Loader. У меня один аси, чтобы избежать любых конфликтов с клео, луа, сф и так далее


значит asi-loader снимает протект, потому что нельзя писать в зпротекченную ппамять

ya_noob
30.06.2023, 06:41
значит asi-loader снимает протект, потому что нельзя писать в зпротекченную ппамять


Я понял. Почему запись в функции main работает. А запись через структуру нет? Аси Лоадер распространяет снятие протекта только на "точку входа" или как это работает, наверное чушь написал, просто мне непонятно, если аси лоадер снимает протект, то он должен снимать его и для структур или нет?