На нашем форуме вы можете получить приватный чит для игры Euro Truck Simulator 2. Подробности по ссылке ниже:
Тема с читом на Euro Truck Simulator 2
Авторизация  
Xhayla

[C++ | DLL] Запись в выделенную память.

Рекомендуемые сообщения

Получаю нужные мне адреса.

DWORD from_addr = (DWORD)GetModuleHandle(L"Game.dll") + 0x36143B;
DWORD jmp_original = (DWORD)GetModuleHandle(L"Game.dll") + 0x361440;

В массив jmp записываю адрес прыжка обратно jmp_original, в оригинальный код.

BYTE jmp[5] = { 0xE9 };
memcpy(jmp + 1, (const void*)jmp_original, 4);

Далее выделяю память в размере 10 байт. 5 байт для нужной мне инструкции + 5 дня прыжка обратно.

DWORD alloc_addr = (DWORD)malloc(10); // выделяю память.
memcpy((void*)alloc_addr, (void*)from_addr, 5); // в первые 5 байт выделенной памяти записываю инструкцию размером 5 байт из оригинала.
memcpy((void*)(alloc_addr + 0x5), (void*)&jmp, 5); // в оставшиеся 5 байт, записываю адресс прыжка обратно.

 

После инъекции DLL в процесс, нахожу выделенную память, в итоге нужная инструкция скопировалась нормально, а вот прыжок обратно указывает совсем на другой адрес. СКРИНШОТ ИЗ CE выделенной памяти

Изменено пользователем Xhayla

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты


Так правильно.

const DWORD game_dll = (DWORD)GetModuleHandle(L"Game.dll");
const DWORD from_addr = game_dll + 0x36143B;
const DWORD jmp_original = game_dll + 0x361440;

 

void JMP(PBYTE buffer, DWORD A, DWORD B)
{
    buffer[0] = 0xE9;
    *(long*)&buffer[1] = long(B - A) - 5;
}

BYTE jmp[5];
JMP(jmp, alloc_addr + 0x5, jmp_original);
memcpy((void*)(alloc_addr + 0x5), (void*)jmp, 5);

Или так, если есть прямой доступ записи.

void JMP(DWORD A, DWORD B)
{
    PBYTE buffer = (PBYTE)A;
    buffer[0] = 0xE9;
    *(long*)&buffer[1] = long(B - A) - 5;
}

JMP(alloc_addr + 0x5, jmp_original);

 

Изменено пользователем Hack

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо, если не сложно, скажите пожалуйста, я изменяю Protect памяти на нужный мне, но, я указываю 5 байт, а он изменят защиту на всей странице, можно ли сделать так, чтобы он изменял защиту только 5 байт, которые я указал.

Если нет, то как программно узнать с какого адреса он изменил защиту?

VirtualProtect(reinterpret_cast<void*>(from_addr), 5, PAGE_EXECUTE_READWRITE | PAGE_GUARD, &dwOld);

 

Изменено пользователем Xhayla

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет, так как минимальное разделение страницы это 4096 байт.

DWORD getBaseAddress(DWORD Address)
{
    MEMORY_BASIC_INFORMATION mbi;
    if (!VirtualQuery((void*)Address, &mbi, sizeof(mbi)))
        return 0;
    return (DWORD)mbi.BaseAddress;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Воспитательные работы давно не проводились видать... Зачем цитировать куски кода на пол страницы ?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
16 часов назад, LIRW сказал:

Воспитательные работы давно не проводились видать

Не говори-ка, совсем распоясались!

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
В данном топике никто не постил уже 4 месяца. Пости здесь только если твой вопрос точно совпадает с темой данного топика.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Предпросмотр
Авторизация