Я хочу использовать API Deviare V2 для перехвата вызовов winapi из тестового приложения. Проблема в том, что перехватчики и системные вызовы находятся в одном и том же процессе, и поэтому вызовы не перехватываются.
Если я открою отдельные процессы для каждого из них, то перехват будет работать. У кого-нибудь еще был такой сценарий / проблема?
Дело в том, что я пытаюсь добавить какой-то модульный тест в мир кода и вместо того, чтобы модифицировать существующий производственный код, чтобы обернуть / смоделировать все системные вызовы, я подумал, что могу просто перехватить все эти вызовы и подделать их, как я хочу.
На самом деле гораздо проще подключить API в вашем собственном процессе (на самом деле, когда вы хотите подключить другой процесс, вам все равно нужно внедрить DLL в этот процесс, поэтому в основном, когда вы подключаете свой собственный процесс, вы можете просто пропустить этот шаг). Это может быть ошибка в используемой вами библиотеке. Попробуйте Microsoft Detours или, если хотите, исправьте память самостоятельно, на самом деле это не так сложно, несколько часов работы, если вы новичок в этом вопросе.
Вам следует опасаться, что некоторые компиляторы C ++ будут в некоторых случаях (я думаю, что отладочные сборки) использовать некоторую заглушку перехода или что-то вроде этого, что может помешать процессу перехвата. В этом случае вы должны проявлять особую осторожность при подключении — MS Detours, вероятно, делает это правильно. Вы можете попробовать отладку / релиз сборки, если это влияет на ваш успех.
Я имею в виду, чтобы получить правильный адрес API. Если функция находится в DLL, как в случае с WinAPI, вы можете быть уверены, что получаете правильный адрес, если используете LoadLibrary и GetProcAddress.
С другой стороны, я не думаю, что перехват API-интерфейса — это правильный способ избежать насмешек при тестировании, хотя он должен работать.
Если вас больше интересует, как работает перехват, вы можете посмотреть мою статью здесь: http://lkm.fri.uni-lj.si/zoranb/research/berdajs-bosnic%20SPE%202011.pdf
Других решений пока нет …