Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771

Трамплин (вставить 5 nop перед jmp)

23.04.2021, 17:01. Показов 4115. Ответов 9

Студворк — интернет-сервис помощи студентам
Нужно вставить 5 nop'ов в начале какой-нибудь WinAPI функции чтобы обойти проверку на jmp. Как это сделать?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void InstallHook(void* func2hook, void* payloadFunction)
{
  DWORD oldProtect;
  VirtualProtect(AddColors, 1024, PAGE_EXECUTE_READWRITE, &oldProtect);
    
  //32 bit relative jump opcode is E9, takes 1 32 bit operand for jump offset
  uint8_t jmpInstruction[5] = { 0xE9, 0x0, 0x0, 0x0, 0x0 };
    
  //to fill out the last 4 bytes of jmpInstruction, we need the offset between 
  //the payload function and the instruction immediately AFTER the jmp instruction
  const uint32_t relAddr = (uint32_t)payloadFunction - ((uint32_t)func2hook + sizeof(jmpInstruction));
  memcpy(jmpInstruction + 1, &relAddr, 4);
 
  //install the hook
  memcpy(func2hook, jmpInstruction, sizeof(jmpInstruction));
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
23.04.2021, 17:01
Ответы с готовыми решениями:

Вставить в массиве 2 элемента, один перед макс, другой перед минимальным
Проблема такая, последнее число массива не выводится, точнее выводится но как 0. Элементы то вставляются где надо, но вот с последним...

Дан двумерный массив размером 5 * 8, заполненный случайным образом. Вставить перед всеми строками, первый элемент которых делится на3,вставить....
Дан двумерный массив размером 5 * 8, заполненный случайным образом. Вставить перед всеми строками, первый элемент которых делится на 3,...

В заданном тексте перед каждой группой цифр, за которой стоит пробел, вставить знак «+», в том случае, если перед этой группой нет знака «-»
Помогите пожжалкйста ! В заданном тексте перед каждой группой цифр, за которой стоит пробел, вставить знак «+», в том случае, если перед...

9
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
23.04.2021, 18:16
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
проверку на jmp
Что за проверка на jmp? В чем конкретно проблема? Опкод nop-a 0x90.
Я так понимаю, вы хотите перехватывать API сплайсингом. Тут нужно и правильные привилегии получить и дизассемблер длин иметь (ну или для конкретной функции посмотреть заранее реализацию, что может измениться при очередном обновлении).
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
23.04.2021, 18:30  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Что за проверка на jmp?
Один шиз детектит перехват функций при помощи проверки на jmp
C++
1
if(*function_A == 0xE9)
Нужно отредактировать код выше так, чтобы он добавлял один nop перед jmp

Цитата Сообщение от WhiteP Посмотреть сообщение
Тут нужно и правильные привилегии получить и дизассемблер длин иметь
Не понимаю о чем Вы. До этого пользовался Microsoft Detours, но он весит достаточно много. Вы занимались трамплинами?
0
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
23.04.2021, 18:44
Лучший ответ Сообщение было отмечено eXpl01TeR как решение

Решение

Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Нужно отредактировать код выше так, чтобы он добавлял один nop перед jmp
Ну что-то есть сомнения, что "шиз" проверяет именно первый опкод. Вполне возможно, что сканирует (если бы я проверял, то уж нопы то точно бы пропустил... Ну да вам видней.

C++
1
2
3
uint8_t jmpInstruction[] = {0x90,0xE9, 0x0, 0x0, 0x0, 0x0 };
...
memcpy(jmpInstruction + 2, &relAddr, 4);
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Вы занимались трамплинами?
Экспериментировал в свое время.
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
23.04.2021, 19:51  [ТС]
Цитата Сообщение от WhiteP Посмотреть сообщение
Экспериментировал в свое время.
Скопировал код отсюда (немного изменив)
https://stackoverflow.com/a/54661410/14410805

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
typedef DWORD (WINAPI* T_timeGetTime)();
T_timeGetTime _timeGetTime;
 
DWORD WINAPI __timeGetTime()
{
    return _timeGetTime() * 2;
}
 
bool Hook(BYTE* src, BYTE* dst, int len)
{
    if (len < 5) return false;
 
    DWORD curProtection;
    VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &curProtection);
 
    uintptr_t  relativeAddress = ((uintptr_t)dst - (uintptr_t)src) - 5;
 
    *src = 0xE9;
    *(uintptr_t*)((uintptr_t)src + 1) = relativeAddress;
 
    VirtualProtect(src, len, curProtection, &curProtection);
    return true;
}
 
void* TrampolineHook(BYTE* src, BYTE* dst, int len)
{
    // Убедитесь, что длина больше 5
    if (len < 5) return 0;
 
    // Создайте шлюз (len + 5 для перезаписанных байтов + jmp)
    void* gateway = VirtualAlloc(0, len + 5, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
 
    // Записать украденные байты в шлюз
    memcpy(gateway, src, len);
 
    // Получите шлюз к месту назначения
    uintptr_t  gatewayRelativeAddr = ((uintptr_t)src - (uintptr_t)gateway) - 5;
 
    // Добавьте код операции jmp в конец шлюза
    *(BYTE*)((uintptr_t)gateway + len) = 0xE9;
 
    // Добавьте адрес в jmp
    *(uintptr_t*)((uintptr_t)gateway + len + 1) = gatewayRelativeAddr;
 
    // Поместите крючок в место назначения
    Hook(src, dst, len);
 
    return gateway;
}
 
int Testing::attach()
{
    _timeGetTime = (T_timeGetTime)TrampolineHook((BYTE*)&timeGetTime, (BYTE*)&__timeGetTime, 7); // изменил на 7
    return TRUE;
}
С ExitProcess работает, но с timeGetTime из Winmm.dll не хочет. Cheat Engine пишет что длина первой инструкции 7 байт. Подскажите пожалуйста, в чём может быть проблема?
0
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
23.04.2021, 19:52  [ТС]
Скриншот почему-то не прикрепился (в Cheat Engine когда редактируешь память оно пишет если слишком большая / маленькая длина, я специально написал nop чтобы написало длину)
Миниатюры
Трамплин (вставить 5 nop перед jmp)  
0
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
23.04.2021, 21:54
В режиме x86 код выше работает.
Проблема в том, что относительное смещение в x64 не влезает в 4-байтный операнд инструкции 0xE9.
Почитайте. Можно попытаться выделить память так, чтобы хватило разрядов для относительного прыжка (2 Гб +-), в статье это есть с примером кода (№1).
Думаю, можно также полностью перейти на абсолютную адресацию.
1
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
25.04.2021, 10:52
Цитата Сообщение от eXpl01TeR Посмотреть сообщение
Один шиз детектит перехват функций при помощи проверки на jmp
это условие, а не проверка на jmp.
если уж говорить о проверке, то здесь проверяется флаг (ZF=1).
и как выше уже сказали добавление в адрес дополнительных байт просто приведёт в переполнению и программа сломается.
и вообще это не правильный метод, точнее не для этой задачи.

по факту у вас аж 4 варианта действий:
1. банально убрать условие
2. передать в условие значение *function_A равное 0xe9
3. заменить в регистре значение 0xe9 на значение *function_A
4. изменить флаг ZF на 0
2
841 / 347 / 68
Регистрация: 20.11.2012
Сообщений: 814
25.04.2021, 11:38
_lunar_, я так понимаю, что ТС пишет что-то вроде чита и не намерен менять код программы-жертвы. Вопросы задаются относительно кода внедрения, а не относительно проверки в программе. Хотя в таком случае проверка первого опкода вызываемой функции - это что-то не то. Я бы контрольную сумму считал, как минимум...
1
155 / 9 / 2
Регистрация: 14.08.2019
Сообщений: 771
25.04.2021, 21:07  [ТС]
WhiteP, _lunar_, Спасибо большое за Ваши ответы. Я ещё достаточно неопытен, но мне очень интересно развиваться в подобном направлении. Прошу прощения если мои вопросы показались или покажутся (в будущем) глупыми. <3

Добавлено через 2 минуты

Не по теме:

_lunar_, Так-же, я хотел бы извиниться за своё поведение вот в этой теме

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.04.2021, 21:07
Помогаю со студенческими работами здесь

Нужно сделать анимацию мотоциклиста, а точнее как он едет, потом заежает на трамплин
Нужно сделать анимацию мотоциклиста,а точнее как он едет,потом заежает на трамплин,делает сальто в воздухе,потом приземляется на другой...

Вставить элемент перед div-om
есть у меня пхп скрипт который выдает целую кучу дивов, и есть текстовое поле с кнопочкой и аяксом. Мне надо вставить данные полученные из...

Вставить буквы перед цифрами
Можно ли чтобы перед цифрами вставлялись буквы ЛМ, Например: у меня вот так 85563322 Хочу вот так ЛМ 85563322 ...

Вставить перед каждым ! знаком ?
Вставить перед каждым восклицательным знаком вопросительный. В питоне новичок (2 недели опыта), задали на инфе написать такую прогу, все...

Вставить значение 0 перед элементами
Вставить значение 0 перед элементами, находящимися в позиции, соответствующие числам Фибоначчи. Натолкните на мысль, какие действия? ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru