Другое С/С++ Вопрос - Ответ

legendabrn

Известный
Проверенный
121
173
на данное предупреждение можешь не обращать внимания, .asi плагины подгружаются после подгрузки модуля samp.dll, а значит он уже не может быть пустым
если это весь твой код - то у тебя не инициализирован класс
C++:
std::string chatSAMP{ "SAMP 0.3.7 R1" };

class patchChatSAMP {

public:
    patchChatSAMP() {
        *reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP;
    }
} pChatSAMP;
 
  • Нравится
Реакции: F0RQU1N and и writeline

F0RQU1N and

Известный
1,292
502
С++:
#include "pch.h"
#include "string"

std::string chatSAMP{ "SAMP 0.3.7 R1" };

class patchChatSAMP {

public:
    patchChatSAMP() {
        *reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP;
    }
} pChatSAMP;


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Всё равно не хочет работать 😒

Посмотреть вложение 140403
Посмотреть вложение 140404
так ты прям в иде можешь поменять байты
 
  • Bug
Реакции: 4el0ve4ik

legendabrn

Известный
Проверенный
121
173
С++:
#include "pch.h"
#include "string"

std::string chatSAMP{ "SAMP 0.3.7 R1" };

class patchChatSAMP {

public:
    patchChatSAMP() {
        *reinterpret_cast<PVOID*>(GetModuleHandleA("samp.dll") + 0xB7C5) = &chatSAMP;
    }
} pChatSAMP;


BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

Всё равно не хочет работать 😒

Посмотреть вложение 140403
Посмотреть вложение 140404
C++:
#include "pch.h"
#include <string>

std::string chatSAMP{ "SAMP 0.3.7 R1" };

class patchChatSAMP {
private:
    uintptr_t module_samp{ 0 };

public:
    patchChatSAMP() {
        module_samp = reinterpret_cast<uintptr_t>(GetModuleHandleA("samp.dll"));

        DWORD lpflOldProtect;
        VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
        *reinterpret_cast<LPVOID*>(module_samp + 0xB7C5) = &chatSAMP;
        VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, lpflOldProtect, &lpflOldProtect);
    }
} pChatSAMP;

upd, правильный вариант:
C++:
#include "pch.h"
#include <string>

std::string chatSAMP{ "SAMP 0.3.7 R1" };

class patchChatSAMP {
private:
    uintptr_t module_samp{ 0 };

public:
    patchChatSAMP() {
        module_samp = reinterpret_cast<uintptr_t>(GetModuleHandleA("samp.dll"));

        DWORD lpflOldProtect;
        VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, PAGE_EXECUTE_READWRITE, &lpflOldProtect);
        *reinterpret_cast<LPVOID*>(module_samp + 0xB7C5) = &chatSAMP[0];
        VirtualProtect(reinterpret_cast<LPVOID>(module_samp + 0xB7C5), 0x4, lpflOldProtect, &lpflOldProtect);
    }
} pChatSAMP;
 
Последнее редактирование:
  • Нравится
Реакции: writeline

sc6ut

неизвестный
Модератор
385
1,111
вы ебнутые? @legendabrn
какой нахуи std::string
C++:
#include <windows.h>

BOOL APIENTRY DllMain( HMODULE, DWORD dwReason, LPVOID ) {
    if ( dwReason == DLL_PROCESS_ATTACH ) {
        auto samp = (DWORD)GetModuleHandleA( "samp.dll" );
        auto addr = samp + 0xE596Cu + 29u;
        DWORD vp = PAGE_EXECUTE_READWRITE;
        VirtualProtect( (void *)addr, 1u, vp, &vp );
        *(char *)addr = '1';
        VirtualProtect( (void *)addr, 1u, vp, nullptr );
    }
}
 
Последнее редактирование:
  • Bug
Реакции: 4el0ve4ik и legendabrn

legendabrn

Известный
Проверенный
121
173
вы ебнутые? @zTechnology @legendabrn
C++:
#include <windows.h>

BOOL APIENTRY DllMain( HMODULE, DWORD dwReason, LPVOID ) {
    if ( dwReason == DLL_PROCESS_ATTACH ) {
        auto samp = (DWORD)GetModuleHandleA( "samp.dll" );
        auto addr = samp + 0xE596Cu + 29u;
        DWORD vp = PAGE_EXECUTE_READWRITE;
        VirtualProtect( (void *)addr, 1, vp, &vp );
        *(char *)addr = '1';
        VirtualProtect( (void *)addr, 1, vp, nullptr );
    }
}
зачем трогать оригинальную строчку, ведь если ему потребуется использовать строку больше 46 символов, то твой пример затронет и чужую строку
 
  • Нравится
Реакции: 4el0ve4ik

sc6ut

неизвестный
Модератор
385
1,111
зачем трогать оригинальную строчку, ведь если ему потребуется использовать строку больше 46 символов, то твой пример затронет и чужую строку
ему надо 1 символ поменять, кстати твой пример тоже работать не будет, там const char[] а ты подменяешь на std::string.
 

legendabrn

Известный
Проверенный
121
173
ему надо 1 символ поменять, кстати твой пример тоже работать не будет, там const char[] а ты подменяешь на std::string.
1647695890822.png

если что, мы подменяем указатель на строку
 
  • Нравится
Реакции: writeline и 4el0ve4ik

sc6ut

неизвестный
Модератор
385
1,111

sc6ut

неизвестный
Модератор
385
1,111

sc6ut

неизвестный
Модератор
385
1,111
1647696923307.png
1647696944263.png

@4el0ve4ik @legendabrn вам повезло, что указатель на первом месте стоит
с gcc компилятором ничего не работает.
2022-03-19_15-50.png

как наверняка и со всеми другими если будет использоваться алокация на хипе, а не статический баффер размером до 15 байт, который используется в std string для коротких строк.

собрал только что msvc с длинной строкой, как и ожидалось оно не работает.
ведь если ему потребуется использовать строку больше 46 символов
а твой пример ваще никак не будет работать
 
Последнее редактирование:
  • Нравится
Реакции: etereon

4el0ve4ik

Известный
Всефорумный модератор
1,560
1,386
Посмотреть вложение 140463Посмотреть вложение 140464

с gcc компилятором ничего не работает.
Посмотреть вложение 140466
как наверняка и со всеми другими если будет использоваться алокация на хипе, а не статический баффер размером до 15 байт, который используется в std string для коротких строк.

собрал только что msvc с длинной строкой, как и ожидалось оно не работает.

а твой пример ваще никак не будет работать
да, действительно есть такой косяк.
вот так работоспособно:
C++:
        *reinterpret_cast<LPVOID*>(module_samp + 0xB7C5) = &chatSAMP[0];

совершенно не обратил на это внимание.
 
Последнее редактирование:
  • Нравится
Реакции: legendabrn
15
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здравствуйте, товарищи. Подскажите пожалуйста, как получить handle объекта по его id?

Get object by its ID (using SAMP-API):
CObject* getObjectById(std::uint32_t id)
{
    const auto& netGame{sampapi::v037r1::RefNetGame()};
    if (nullptr == netGame) {
        return nullptr;
    }

    const auto& objectPool{netGame->GetObjectPool()};
    if (nullptr == objectPool) {
        return nullptr;
    }

    return objectPool->Get(id);
}
 
  • Нравится
Реакции: sizeoftrickster