Нужно залогировать входные параметры у функции и продолжить ее выполнение 1: с помощью дизасма длин инструкций получаю количество байт для сохранения, чтобы вставить код трамплина 2: сохраняю оригинальные байты в буфер 3: после сохраненных байт дописываю в буфер Код (Text): Trampoline: push rax mov rax,1122334455667788h @TrampolineAddress = ($ - Trampoline - 8) mov [rsp-8],rax pop rax jmp qword [rsp-10h] @TrampolineSize = ($ - Trampoline) где: 1122334455667788 патчится абсолютным адресом следующей инструкции после сохраненных 4: записываю код трамплина в начало перехватываемой функции, только 1122334455667788 заменяю на абсолютный адрес функции логирования 5: после отработки функции логирования, управление передаю на буфер с сохраненными байтами, после их исполнения получает управление код трамплина из буфера, который передает управление на инструкцию следующую за трамплином в перехватываемой функции как можно сделать получше? c прерываниями код выше не дружит
Если логировать надо одну-две функции, то лучше использовать отладочные регистры, ИМХО. Тогда танцев с бубном будет меньше. Например, не надо менять код туда-обратно, права доступа к страницам, меньше проблем с антивирусом, не будет проблем с многопоточными приложениями и можно отслеживать вызовы функции только из нужных потоков. Вопрос только, что означает фраза - "c прерываниями код выше не дружит" ?
vx1d В x64 релатив адресация данных, поэтому невозможно выполнить патч без полной пересборки кода. Это просто морф без изменения кода, только смещений.
ну я сделал так: - ищу подходящее место в функе чтобы не было вначале переходов, работы с глобальными переменными и т.п. - с помощью дизасма длин инструкций определяю количество байт большее 5 для сохранения оригинальных инструкций - записываю относительный jmp (5 байт) на код в пределах 2Гб на код1 (размещяется в свободном месте PE) - в коде1 в динамике пишу: Код (Text): push rax mov rax,(адрес за пределами 2Гб на мой код2) call rax (на код2 в мою библиотеку) pop rax (сохраненные инструкции) jmp (обратно после сохранненных инструкций)
ну там работа со стеком выше указателя стека, если между инструкциями произойдет что-то то стек может потереца
vx1d Посмотрите это https://github.com/Worobow/MakeLib Обсуждение было на rsdn, заявлено что это конструктор(умеет создавать граф и билдить).
Можно поподробнее про работу выше указателя стека - я что то такого не припомню. И что может произойти между инструкциями? Хотелось бы пример. Вообще, когда RIP окажется на указанном в отладочных регистрах адресе, просто произойдёт исключение по всем правилам (естественно нужно заранее установить обработчик) в обработчике которого логируем всё что надо. Вопрос только в "c прерываниями код выше не дружит" - это означает, что использовать исключения проца нельзя или нет?
сожрать стек, сохранить туда ВСЕ регистры, сохранить часть стека с возможными аргументами, передать управление своей функции, единственным аргументом которой будет указатель на все это зыж https://en.wikipedia.org/wiki/X86_calling_conventions ззыж во все регистры входит xmm