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

ALF

Известный
Проверенный
320
537
Можно пример хука без сф?
тоже самое всё, ниже функа
кстати, можно использовать для call хука если заменить 0xE9 на 0xE8
C++:
void CreateJmpHook(BYTE *pAddress, DWORD dwJumpTo, size_t size = 5)
{
    if (size < 5) return;

    DWORD prot = PAGE_EXECUTE_READWRITE;
    VirtualProtect(pAddress, size, prot, &prot);

    *pAddress = 0xE9;
    *reinterpret_cast<DWORD *>(pAddress + 0x1) = dwJumpTo - reinterpret_cast<DWORD>(pAddress) - 0x5;
    for (size_t i = 0x5; i < size; i++) *(pAddress + i) = 0x90;

    VirtualProtect(pAddress, size, prot, nullptr);
}
 
  • Нравится
Реакции: Stiopko и Cake_

Stiopko

Известный
Проверенный
307
218
Как можно взять параметры которые передавались в функцию которую хукнули?

И где они хранятся, в коком регистре?
 

RTD

Нестандартное звание
Модератор
391
414
Как можно взять параметры которые передавались в функцию которую хукнули?

И где они хранятся, в коком регистре?
 
  • Нравится
Реакции: ШPEK и Stiopko

ШPEK

Известный
1,476
524
Как можно взять параметры которые передавались в функцию которую хукнули?

И где они хранятся, в коком регистре?
Зависит от соглашения о вызове.
Например: _cdecl - в стеке, __thiscall - первый аргумент в регистре ecx и остальные в стеке, _stdcall - в стеке.
__thiscall обычно используется в методах класса.
Пример:
C++:
__asm
{
  push ebp // сохраняем значение регистра ebp в стеке 
  mov ebp, esp
  push [ebp + 4 + 8] // передаем второй аргумент 
  push [ebp + 4 + 4] // передаём первый аргумент 
  call hook // функция должна быть _stdcall
  pop ebp // воостанавливаем значение регистра ebp из стека 
}
 
  • Нравится
Реакции: RTD и Stiopko

Stiopko

Известный
Проверенный
307
218
Зависит от соглашения о вызове.
Например: _cdecl - в стеке, __thiscall - первый аргумент в регистре ecx и остальные в стеке, _stdcall - в стеке.
__thiscall обычно используется в методах класса.
Пример:
C++:
__asm
{
  push ebp // сохраняем значение регистра ebp в стеке
  mov ebp, esp
  push [ebp + 4 + 8] // передаем второй аргумент
  push [ebp + 4 + 4] // передаём первый аргумент
  call hook // функция должна быть _stdcall
  pop ebp // воостанавливаем значение регистра ebp из стека
}
а что хранится в регистре ebp, или обязательно сохранять все регистры через pushad, или можно только ebp?
 

0xNull_Dll

Известный
143
20
Парни, кто-нибудь знает оффсет на клавиши? Конкретно - на WASD. Типа, чтобы можно было записать в какой-то адресс 255 - нажалась кнопка, к примеру, W. 0 = "отжалась" (press / release)

P.S Не функцию. Именно оффсет
 

MuhaPW

Новичок
6
0
1 Не могу начать писать плагины SAMPFUNCS.
Установил Visual Studio, распаковал проект SFPlugin и открыл. Вот ошибка, ни как не могу понять с чем связана ошибка и как его исправить.

Код:
1>------ Перестроение всех файлов начато: проект: FirstSF, Конфигурация: Release Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(379,5): error MSB8020: The build tools for Visual Studio 2012 - Windows XP (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, please install Visual Studio 2012 - Windows XP build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Сборка проекта "SFPlugin.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========
 

MuhaPW

Новичок
6
0
1 Не могу начать писать плагины SAMPFUNCS.
Установил Visual Studio, распаковал проект SFPlugin и открыл. Вот ошибка, ни как не могу понять с чем связана ошибка и как его исправить.

Код:
1>------ Перестроение всех файлов начато: проект: FirstSF, Конфигурация: Release Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(379,5): error MSB8020: The build tools for Visual Studio 2012 - Windows XP (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, please install Visual Studio 2012 - Windows XP build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Сборка проекта "SFPlugin.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========


Я решил проблему. Мне помог человек из Stack Overflow. Вот ссылка на вопрос и ответ. https://ru.stackoverflow.com/questions/1013544/visual-studio-2019-error-msb8020/1013659#1013659
 

ALF

Известный
Проверенный
320
537
1 Не могу начать писать плагины SAMPFUNCS.
Установил Visual Studio, распаковал проект SFPlugin и открыл. Вот ошибка, ни как не могу понять с чем связана ошибка и как его исправить.

Код:
1>------ Перестроение всех файлов начато: проект: FirstSF, Конфигурация: Release Win32 ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\Microsoft.CppBuild.targets(379,5): error MSB8020: The build tools for Visual Studio 2012 - Windows XP (Platform Toolset = 'v110_xp') cannot be found. To build using the v110_xp build tools, please install Visual Studio 2012 - Windows XP build tools.  Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
1>Сборка проекта "SFPlugin.vcxproj" завершена с ошибкой.
========== Перестроение всех проектов: успешно: 0, с ошибками: 1, пропущено: 0 ==========
достаточно просто прочитать что там написано
Alternatively, you may upgrade to the current Visual Studio tools by selecting the Project menu or right-click the solution, and then selecting "Retarget solution".
 

Stiopko

Известный
Проверенный
307
218
Здарова, сделал я структуру для хука, но она почему-то не ставит хук, хотя просто функция работала нормально, как можно решить?

C++:
struct Hook {
    DWORD addr = NULL;
    byte* data = nullptr;
    size_t size = NULL;

    Hook(const DWORD& addr, const DWORD& func, const size_t& size = 5) {
        this->data = new byte[size];
        this->size = size;
        this->addr = addr;

        DWORD dwProt = PAGE_EXECUTE_READWRITE;
        VirtualProtect((void*)addr, size, dwProt, &dwProt);

        memcpy(data, (void*)addr, size);
        memset((void*)(addr-4), 0x90, size-4);
        *(byte*)(addr) = 0xE9; // jmp
        *(unsigned int*)(addr + 1) = func - (addr + 5);

        VirtualProtect((void*)addr, size, dwProt, NULL);
        
    }

    ~Hook() {
        if (data != nullptr) {
            DWORD dwProt = PAGE_EXECUTE_READWRITE;
            VirtualProtect((void*)addr, size, dwProt, &dwProt);
            memcpy((void*)addr, data, size);
            VirtualProtect((void*)addr, size, dwProt, NULL);
            delete[] data;
        }
    }
};
 

p1cador

cerf
Проверенный
220
359
@Stiopko, код, реализующий перенаправление из функции в другое место хоть и говноплоховат, но свою задачу выполняет (не поленился, проверил дебагером).
Возможно, ты создал объект Hook на стеке, в результате чего после выхода из области видимости, автоматически вызвался деструктор. Попробуй создавать его на куче через new
 
Последнее редактирование:
  • Нравится
Реакции: Stiopko и LaRossa

MuhaPW

Новичок
6
0
У меня появился другой вопрос. Вот я отлавливаю пакеты.
Вот по этому уроку у меня получилось это сделать https://blast.hk/wiki/tutorials:api_lesson_raknet
Я понимаю как он отлавливает пакеты и как читает. (Конечно есть некоторые вопросы, но походу разберусь).

Я не понимаю одного. Зачем нужны 2 вида отправка пакетов Pacet и RPC ? Что, когда нужно использовать ?
В интернете я ничего не нашел по этому вопросу. Пожалуйста, если вы знаете ответ, или знаете источник где этот ответ есть скажите мне!