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

legendabrn

Известный
Проверенный
121
171
samp - это адрес в памяти
0xB7C5 это смещение
Нужно хукнуть samp.dll?
Или как сделать что бы просто работало? 😄
C++:
std::string chatSAMP{ "SAMP 0.3.7 R1" };

class patchChatSAMP {

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

legendabrn

Известный
Проверенный
121
171
на данное предупреждение можешь не обращать внимания, .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,294
501
С++:
#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
171
С++:
#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,109
вы ебнутые? @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
171
вы ебнутые? @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,109
зачем трогать оригинальную строчку, ведь если ему потребуется использовать строку больше 46 символов, то твой пример затронет и чужую строку
ему надо 1 символ поменять, кстати твой пример тоже работать не будет, там const char[] а ты подменяешь на std::string.
 

legendabrn

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

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

sc6ut

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

sc6ut

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

sc6ut

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

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

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

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