как он выполняет всего одну инструкцию и сразу останавливает поток? Если взять windows, то он использует какие-то манипуляции с контекстом, через системные функции?
Продолжает исполнение, проверяет (E/R)IP на то, не равен ли он следующей инструкции с предыдущей. Если равен, то останавливает С Step Into - продолжает исполнение, получает адрес функции, в которую нужно войти, и если указатель на адресе функции - останавливает. Тем самым попадаем внутрь
записывает опкод int 3(cc), на следующую за call инструкцию если с обходом, либо на адрес куда ведет call если с заходом. Когда исполнение доберется до этой точки проц сам через прерывание дернет отладчик.
Логично, хотя иногда не будет работать, если не пресечь стандартные методы обнаружения отладчика, или какого-нибудь дампа памяти И да - вот так реализовано как раз в x64dbg в классе TraceDebug - TraceExecute Но там уже в настройках ядра встроена галочка на спуфинг BeingDebugged, и восстановливания флага записи на память
Блин сижу внутри функции TraceExecute и вижу фигу, одна обработка и нигде адресации до прерывания. Привык как в си углублятся внутрь функций пока не дойдешь до этого самого прерывания. Даже асемблер легче читается... Лан посплю и завтра доразбираю. Всеравно надо с++ учится понимать. Спасибо огромное👌🙃
Ну вот верное решение было - на следующую функцию int3 всунуть, продолжить, а Windows сам процесс остановит, потом восстанавливаешь байты, которые заменил
eflags | 0x100 же.
Обсуждают сегодня