• XSS.stack #1 – первый литературный журнал от юзеров форума

MinHook memcpy

Exfazo

(L3) cache
Забанен
Регистрация
29.01.2021
Сообщения
268
Решения
1
Реакции
37
Пожалуйста, обратите внимание, что пользователь заблокирован
Короче нужно хукнуть функцию memcpy , изую либу MinHook
Код:
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include "MinHook.h"

typedef void*(WINAPI *MEMCPY)(void*, const void*, size_t);
MEMCPY fMemcpy = NULL;

void* WINAPI DetourMemcpy(void* destptr, const void* srcptr, size_t num)
{
    return fMemcpy(destptr, srcptr, num);
}

int HookedMemcpy()
{
    if (MH_Initialize() != MH_OK)
    {
        MessageBoxA(NULL, "123", "123", NULL);
        return 1;
    }

    if (MH_CreateHook(&memcpy, &DetourMemcpy, reinterpret_cast<LPVOID*>(&fMemcpy)) != MH_OK)
    {
        MessageBoxA(NULL, "123", "123", NULL);
        return 1;
    }

    if (MH_EnableHook(&memcpy) != MH_OK)
    {
        MessageBoxA(NULL, "123", "123", NULL);
        return 1;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        HookedMemcpy();
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Дллка инжектится без ошибок. Смотрю на функцию memcpy, нету джампа. На мессадже бокс все работает. В чем проблема?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
memcpy может (и будет, скорее всего) инлайниться, как rep movsb какой нибудь.
Я добавил, все равно нету джампа на memcpy
C++:
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#include "MinHook.h"

typedef void*(__cdecl *MEMCPY)(void*, const void*, size_t);
MEMCPY fMemcpy = NULL;

inline void* __cdecl DetourMemcpy(void* destptr, const void* srcptr, size_t num)
{
    return fMemcpy(destptr, srcptr, num);
}

int HookedMemcpy()
{
    if (MH_Initialize() != MH_OK)
    {
        MessageBoxA(NULL, "123", "123", NULL);
        return 1;
    }

    if (MH_CreateHook(&memcpy, &DetourMemcpy, reinterpret_cast<LPVOID*>(&fMemcpy)) != MH_OK)
    {
        MessageBoxA(NULL, "123", "123", NULL);
        return 1;
    }

    if (MH_EnableHook(&memcpy) != MH_OK)
    {
        MessageBoxA(NULL, "123", "123", NULL);
        return 1;
    }
}

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        HookedMemcpy();
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
memcpy может (и будет, скорее всего) инлайниться, как rep movsb какой нибудь.
Или я не так тебя понял?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Или я не так тебя понял?
Иногда компилятор заменяет вызов memcpy на инлайн функцию, т.е. вставляет прямо в код ассемблерные инструкции, эквивалентные копированию памяти. Понятное дело, твой хук тут не сработает, т.к. именно вызова функции нет - нужно или ставить перехват на память или еще что. Открой файл в Ида и посмотри.
p.s. и вообще плохое дело проверять хук memcpy с помощью мессаджбокса и подобного. А если мессаджбокс внутри юзает memcpy?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Иногда компилятор заменяет вызов memcpy на инлайн функцию, т.е. вставляет прямо в код ассемблерные инструкции, эквивалентные копированию памяти. Понятное дело, твой хук тут не сработает, т.к. именно вызова функции нет - нужно или ставить перехват на память или еще что. Открой файл в Ида и посмотри.
p.s. и вообще плохое дело проверять хук memcpy с помощью мессаджбокса и подобного. А если мессаджбокс внутри юзает memcpy?
Вообще хук я собираюсь ставить для того что бы перехватить другой хук) То есть есть dll в процессе, он ставит хуки на разные функции, я хочу как то сделать так что бы этих хуков не было, и вот мне первое что попалось это хукнуть memcpy, и в хуке проверять то что 2 параметр memcpy, находится в диапазоне этой dll, то есть и так проверять на хук. Или это плохой способ? Ведь эта dllка memcpy может и не для хуков вызываться. короче какой есть способ предотвратить хук функции
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Хз, какой-то странный способ, как по мне.
короче какой есть способ предотвратить хук функции
попробуй сисколы заюзать.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Хз, какой-то странный способ, как по мне.

попробуй сисколы заюзать.
Никогда не слышал про сисколы, погуглил не совсем понятно что это. Мб объяснишь?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Хз, какой-то странный способ, как по мне.

попробуй сисколы заюзать.
Типо копировать оригинальную dll с диска, а что потом делать?
 
Вообще хук я собираюсь ставить для того что бы перехватить другой хук) То есть есть dll в процессе, он ставит хуки на разные функции, я хочу как то сделать так что бы этих хуков не было, и вот мне первое что попалось это хукнуть memcpy, и в хуке проверять то что 2 параметр memcpy, находится в диапазоне этой dll, то есть и так проверять на хук. Или это плохой способ? Ведь эта dllка memcpy может и не для хуков вызываться. короче какой есть способ предотвратить хук функции
А как конкретно хукает ты знаешь? Там IAT хук или сплайс? Если сплайс, пробовал снимать хук?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А как конкретно хукает ты знаешь? Там IAT хук или сплайс? Если сплайс, пробовал снимать хук?
Сплайс. Как снять. Там хуки убирать неделю будешь
 
Вообще хук я собираюсь ставить для того что бы перехватить другой хук) То есть есть dll в процессе, он ставит хуки на разные функции, я хочу как то сделать так что бы этих хуков не было, и вот мне первое что попалось это хукнуть memcpy, и в хуке проверять то что 2 параметр memcpy, находится в диапазоне этой dll, то есть и так проверять на хук. Или это плохой способ? Ведь эта dllка memcpy может и не для хуков вызываться. короче какой есть способ предотвратить хук функции
На большинство c-runtime функций ты не поставишь - после компиляции: "они не вызываются - они сами часть бинарника". Анитивирус уже выполнил вредоносный код в твоей проге. С другой стороны у тебя есть реальная возможность работать с другими альтернативными функциями которые не похуканы - через хевенсгейт вызывая 64 битные функции из ntdll (так как инжектится 32 битная либа антивируса в 32 битный твой процесс).
Если уж анхукать то https://github.com/frkngksl/Celeborn в бой
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Мб объяснишь?
https://xss.pro/threads/43097/ - если эта функция, которая в итоге приводит к вызову syscall'а, то можно просто вызвать syscall. Хукать memcpy, чтобы избежать хука - это бред, так как хук может быть установлен и без помощи memcpy, тем более, что memcpy в большинстве случаев заинлайнится (вместо вызова будет подставлен код), это - очень частая оптимизация.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
https://xss.pro/threads/43097/ - если эта функция, которая в итоге приводит к вызову syscall'а, то можно просто вызвать syscall. Хукать memcpy, чтобы избежать хука - это бред, так как хук может быть установлен и без помощи memcpy, тем более, что memcpy в большинстве случаев заинлайнится (вместо вызова будет подставлен код), это - очень частая оптимизация.
Прочитал статью, хорошая статья. Однако в твоей статье, рассказано про api функции, экспортируемые. Я как то лазил в отладчике и видел вызов функции с одного модуля, там сразу в этой функции джамп на главный модуль(exe), там уже стоит как бы хук, вместо вызова одной функции, стоит прыжок на этот модуль защиты, я пробовал изменить это все на оригинальные байты, сначала софт не вылетал, потом вылетел, где то еще хук стоит. Так вот как быть с этим?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
https://xss.pro/threads/43097/ - если эта функция, которая в итоге приводит к вызову syscall'а, то можно просто вызвать syscall. Хукать memcpy, чтобы избежать хука - это бред, так как хук может быть установлен и без помощи memcpy, тем более, что memcpy в большинстве случаев заинлайнится (вместо вызова будет подставлен код), это - очень частая оптимизация.
Так а что если я заммапаю себе в память главный модуль(exe), и буду проверять джампы на этот модуль защиты, если есть такое, значит я из этого exe на диске скопирую оригинальные байты в память процесса? Должно сработать же
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Так а что если я заммапаю себе в память главный модуль(exe), и буду проверять джампы на этот модуль защиты, если есть такое, значит я из этого exe на диске скопирую оригинальные байты в память процесса? Должно сработать же
Попробуй, но технически ничего не мешает "модулю защиты" периодически проверять и восстанавливать свои хуки. Ну либо валить процесс, если его хук куда-то пропал.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх