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

ya_noob

Участник
Автор темы
57
7
Увидел как SR_team написал плагин используя только структуры без функции main, попробовал, но в игре НЕТ НИКАКИХ ИЗМЕНЕНИЙ.
Сначала был такой код:
C++:
#include <cstring>
#pragma warning(disable:4996)

struct loader
{
public:
    loader()
    {
        memset((unsigned char*)0x00522F6A, 0x90, 6); // FixFOV
        *(float*)0x00522F7A = 90;
        strcpy(reinterpret_cast<char*>(0x866C8C), "$-%d");
        strcpy(reinterpret_cast<char*>(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 <Windows.h>

struct Loader {
    Loader() {
        PatchMemory((LPVOID)0x00522F6A, "\x90\x90\x90\x90\x90\x90", 6); // FixFOV
        *(float*)0x00522F7A = 90;
        strcpy_s(reinterpret_cast<char*>(0x866C8C), sizeof("$-%d"), "$-%d");
        strcpy_s(reinterpret_cast<char*>(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
 
Решение
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.

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

siwage

Активный
193
67
Я не знаю С++, но возможно это?
1687977856235.png
 

ya_noob

Участник
Автор темы
57
7
скачал плагин SR_team'a работает

https://www.blast.hk/threads/173829/ Я скачал готовый .asi, захотел посмотреть сурс, а там это
 

EclipsedFlow

Известный
Проверенный
1,047
476
C++:
// Создаешь класс/структуру. В
// Создай конструктор и деструктор для них.
// Первый метод после "public:" - Конструктор, второй Деструктор.
// Конструктор выполняет код один раз при создании объекта класса/структруры.
// Деструктор обратное, вызывается один раз при удалении объекта из поля видисмоти.

// Тебе остается создать объект в глобальной области.

class Boot
{
public:
    Boot(void) // Конструктор
    {
        // код выполняется раз при инициализации объкта.
    }
    
    
    ~Boot(void) // деструктор
    {
        // код выполняется раз при выхода из видисмоти/удалении объекта.
    }
    
    
    
} g_boot;
// Или
Boot g_boot;
 
  • Нравится
Реакции: Z3roKwq

ya_noob

Участник
Автор темы
57
7
C++:
// Создаешь класс/структуру. В
// Создай конструктор и деструктор для них.
// Первый метод после "public:" - Конструктор, второй Деструктор.
// Конструктор выполняет код один раз при создании объекта класса/структруры.
// Деструктор обратное, вызывается один раз при удалении объекта из поля видисмоти.

// Тебе остается создать объект в глобальной области.

class Boot
{
public:
    Boot(void) // Конструктор
    {
        // код выполняется раз при инициализации объкта.
    }
   
   
    ~Boot(void) // деструктор
    {
        // код выполняется раз при выхода из видисмоти/удалении объекта.
    }
   
   
   
} g_boot;
// Или
Boot g_boot;
так я же так и сделал?
 

SR_team

like pancake
BH Team
4,809
6,487
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.

Тебе для каждого адреса по которому ты пишешь, надо сначала разрешить запись через VirtualProtect
 
  • Влюблен
Реакции: Z3roKwq

ya_noob

Участник
Автор темы
57
7
Ты пишешь в память без VirtualProtect. Обычно это приводит к крашу игры, но если это делать в момент инициализации библиотеки, то вместо краша библиотека сразу выгрузится - что у тебя и происходит.

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

SR_team

like pancake
BH Team
4,809
6,487
Но если делать подобную инициализацию в цикле, который находится в функции main, то гта не крашится без разрешения записи VirtualProtect
У тебя она не может не крашится. Может ты под циклом имеешь в виду mainloop из SF - это немного другое, и там CLEO снимает протект на всю память игры. Тут ты пишешь раньше.
И адрес 0x00561344, например, указывает на код. У кода по умолчанию разрешены только чтение и выполнение, а запись запрещена
 

ya_noob

Участник
Автор темы
57
7
У тебя она не может не крашится. Может ты под циклом имеешь в виду 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<char*>(0x866C8C), "$-%d");
        strcpy(reinterpret_cast<char*>(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

like pancake
BH Team
4,809
6,487
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<char*>(0x866C8C), "$-%d");
        strcpy(reinterpret_cast<char*>(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

Участник
Автор темы
57
7
Так ты в цикле ждешь пока игра загрузится, за это время успевает загрузится CLEO и применить VirtualProtect к игре
клео в сборке нет, ни клео, ни мунлоадера, ни сф, ни модлоадера. У меня в сборке один только ASI Loader. У меня один аси, чтобы избежать любых конфликтов с клео, луа, сф и так далее
 

SR_team

like pancake
BH Team
4,809
6,487
клео в сборке нет, ни клео, ни мунлоадера, ни сф, ни модлоадера. У меня в сборке один только ASI Loader. У меня один аси, чтобы избежать любых конфликтов с клео, луа, сф и так далее
значит asi-loader снимает протект, потому что нельзя писать в зпротекченную ппамять
 

ya_noob

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