Привет, мир, я просто возился с Windows Internals, поэтому у меня возникла идея создать новую серию для AXIAL. Я изо всех сил стараюсь быть школьником, чтобы сбалансировать свое время и продолжить эту серию. Надеюсь, тебе понравится

О чем конкретно сериал?

Речь идет о обратном инжиниринге Внутренние интерфейсы Windows API. Если вы не знаете, что они на самом деле представляют, я предлагаю вам пройти через это. В каждой статье, которую я отнесу к этой серии, я поделюсь своим путешествием, обращая вспять эти внутренние компоненты WinAPI. Необходимые инструменты, которые я буду использовать, - это WinDbg и IDA Pro (вы можете получить свою любимую), но Windbg является немного обязательным. В каждой статье я буду выбирать WinAPI, а для этого блога я выбрал IsDebuggerPresent. Вы можете прочитать об этом здесь".

Я также прилагаю некоторые ресурсы, чтобы начать работу с WinDbg и IDA Pro.

WinDbg: https://riptutorial.com/windbg

IDA Pro: https://forum.tuts4you.com/files/file/1472-ida-pro-user-tutorial/

Получайте удовольствие от обучения.

Глубокое реверсирование:

Основная причина начать с этого в том, что для меня это легко. Итак, теперь давайте посмотрим, как использовать эту функцию в простой программе, согласно MSDN:

BOOL IsDebuggerPresent ();

Эта функция просто возвращает логическое значение и не принимает никаких параметров. Теперь давайте посмотрим, как мы можем использовать это в простой программе на C.

Итак, теперь, если я попытаюсь запустить это внутри отладчика, и по достижении этого условия он обнаружит отладчик и выйдет. Теперь давайте посмотрим, как работает эта функция.

Но сначала мы все знаем, что kernel32.dll реализует большинство функций WinAPI, таких как эта функция, например, ну, это не на 100% правильно, так как в нем есть некоторые функции, которые не реализованы. Если мы попытаемся открыть kernel32.dll в IDA, тогда перейдите к экспорту «CTRL + F» и найдите IsDebuggerPresent, мы увидим это:

До сих пор мы могли следовать инструкции Jump Right, но на самом деле она не доходит до реальной реализации:

Так где же настоящая реализация? Ну, это в kernelbase.dll. Так что, если мы бросим его в IDA и перейдем к таблице экспорта, круто! Мы нашли это :)

Функция выглядит простой, но работает. Итак, сначала он перемещает gs: 60 в регистр rax, а затем теперь RAX указывает на PEB, поэтому он берет это значение и смещения от PEB + 2, чтобы попасть в поле BeingDebugged, поскольку я нахожусь на x64 gs, здесь относится к регистру сегмента который указывает на TEB (блок среды потока) в системах на базе x32, это fs. Но что такое TEB и PEB? Таким образом, TEB - это структура данных ядра, которая содержит всю информацию, относящуюся к потоку, и аналогично PEB, но PEB содержит информацию обо всем процессе. Давайте посмотрим на это в WinDbg. В дополнение к ресурсам, указанным выше, вы можете посмотреть это Видео, чтобы настроить его правильно.

Сначала давайте посмотрим, где находится TEB, используя «! Teb»:

Итак, мы видим, что он находится по адресу 0000000000210000, а PEB находится по адресу 000000000020f000.

Как мы видим здесь, структура TEB содержит довольно много информации, хотя это не все из них, одним из них является указатель на PEB, и WinDbg доказывает, что его смещение 60 теперь позволяет нам увидеть PEB:

Как мы видим, здесь поле BeingDebugged находится по смещению 2, и причина проста: два поля над ними представляют собой символы размером 1 байт. Таким образом, поле BeingDebugged просто содержит значение 1 или 0. 1 означает, что оно отлажено, а 0 означает, что оно не отлаживается. Поэтому при использовании функции она возвращает либо True (1), либо False (0).

Итак, если мы продолжим выполнение приведенной выше команды, мы увидим, что для параметра BeingDebugged установлено значение Да. Итак, в основном, если мы хотим эту проверку Antidbg, мы можем просто исправить The Call для функции, или мы можем немного потрудиться и внедрить Dll или exe, чтобы исправить это поле BeingDebugged.

Заключение:

Так что это был вводный блог, в котором рассказывается о моем опыте, надеюсь, он вам понравился или, может быть, вы узнали кое-что. Я определенно не профессионал в этой теме, просто начал делать это на ходу, и мне понравилось делиться этим с сообществом. Если вы обнаружите какую-либо проблему или ошибку, обязательно свяжитесь со мной, мы будем очень признательны. А пока следите за обновлениями, еще не все :).

Блог Nerd из AX1AL. Присоединяйтесь к нашему серверу раздор.