Инжект длл

Vintik

Мечтатель
Автор темы
Проверенный
1,466
915
Амазинг КРМП вообще подохерели, я, кстати, сделал тоже самое, когда увидел, что они втупую крашат игру при запуске CE. Но это я обошел за 3 секунды, ну может 5. Такая же херня и с экстрим инжектором, но я смог его запустить - вопрос в следующем. При инжекте длл сразу крашит игру с ошибкой "нарушение прав доступа" - как инжектнуть длл так, чтобы их клиентский античит это не спалил?
 
Решение
Да абсолютно в любой момент - и при запуске, и при загрузке, и при игре.
А вот про режимы подробнее, я инжектил вообще не трогая настройки, потому что в них не шарю

Vintik

Мечтатель
Автор темы
Проверенный
1,466
915
Попробуй разные режимы, например Manual Map, а также попробуй инжектить в разные моменты
Да абсолютно в любой момент - и при запуске, и при загрузке, и при игре.
А вот про режимы подробнее, я инжектил вообще не трогая настройки, потому что в них не шарю
 

kin4stat

mq-team
Всефорумный модератор
2,730
4,710
Да абсолютно в любой момент - и при запуске, и при загрузке, и при игре.
А вот про режимы подробнее, я инжектил вообще не трогая настройки, потому что в них не шарю
 
  • Нравится
Реакции: Vintik

Vintik

Мечтатель
Автор темы
Проверенный
1,466
915
Буду дома - проверю. Спасибо за ответ
1605531183521.png

@KiN4StAt
Да, если надо, исходный код DLL-ки (обычный джамп хук)
C++:
// dllmain.cpp : Определяет точку входа для приложения DLL.
#include "pch.h"
#include <process.h>
#include <Windows.h>
#include <TlHelp32.h>
#include <string>

void InjectJump(DWORD _offset, DWORD target)
{
    unsigned long Protection;
    VirtualProtect((void*)_offset, 5, PAGE_EXECUTE_READWRITE, &Protection);
    target -= (_offset + 5);
    *((char*)_offset) = 0xE9;
    memcpy((LPVOID)(_offset + 1), &target, sizeof(DWORD));
    VirtualProtect((void*)_offset, 5, Protection, 0);
}

VOID _stdcall OnSendChatCallback(DWORD arg1, DWORD arg2)
{
    std::string msgText = "arg1 = " + std::to_string(arg1) + "\narg2 = " + std::to_string(arg2);
    MessageBoxA(GetForegroundWindow(), msgText.c_str(), "CallBack", NULL);
}

LPVOID _onSendChatRetAddr;
_declspec(naked) VOID _onSendChatCallback()
{
    _asm
    {
        pushad
        //Количество пушей - это количество аргументов функции
        //Смещение в стэке расчитывается так: (кол-во аргументов)*4+0x20
        push[esp + 0x28]
        push[esp + 0x28]
        //Вызываем нашу основную функцию
        call OnSendChatCallback
        popad
        //Ниже повторяем действия, которые мы подменили
        push ebx
        push esi
        push edi
        lea edi, [ecx + 0x196D]
        //Возвращаемся в функцию
        jmp _onSendChatRetAddr
    }
}

void FuckAmazing(PVOID)
{
    for (int i = 0x68E65; i < 0x68E69; ++i)
        *(unsigned char*)i = 0x90; // nop
    DWORD dwSAMP = (DWORD)GetModuleHandle(L"samp.dll");
    _onSendChatRetAddr = (LPVOID)(dwSAMP + 0x68E65);
    InjectJump(dwSAMP + 0x68E60, (DWORD)&_onSendChatCallback);
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    if (ul_reason_for_call == DLL_PROCESS_ATTACH)
        _beginthread(FuckAmazing, NULL, NULL);
    return TRUE;
}


UPD: убрал нопы и заработало, почему-то ругалось на это:
Код:
for (int i = 0x68E65; i < 0x68E69; ++i)
        *(unsigned char*)i = 0x90; // nop
как правильно сделать?

UPD2: виртуал протект, совсем забыл...
 
Последнее редактирование: