Введение
Данная публикация направлена на изучение некоторых приемов реверс-инжиниринга. Все материалы представлены исключительно в ознакомительных целях и не предназначены в использовании в чьих-либо корыстных целях
Предмет исследования
В качестве примера будем изучать код Atomineer Pro Documentation (далее APD). Это плагин для Visual Studio предназначенный для автоматической генерации комментариев в исходных кодах. Для начала установим данный плагин и проверим его работу. Бесплатная версия имеет триальный период и ряд ограничений использования в течении этого времени. Так при добавлении комментариев в файл пользователю выдается сообщение о том, что в течении дня можно обработать только 10 файлов
Сообщение 1![image](http://i.piccy.info/i9/e952d29100738c42c51358d6e95fe22e/1553205555/8827/1308887/_1.png)
![image](http://i.piccy.info/i9/e952d29100738c42c51358d6e95fe22e/1553205555/8827/1308887/_1.png)
При попытке обработать проект целиком утилита выдает диалог, предупреждающий что данная команда не доступна.
Сообщение 2![image](http://i.piccy.info/i9/a3747763273ffcce8da2484370b880f6/1553205118/6533/1308887/_2.png)
![image](http://i.piccy.info/i9/a3747763273ffcce8da2484370b880f6/1553205118/6533/1308887/_2.png)
Приступим
Для начала посмотрим в каталог установленного расширения и найдем там только одну динамическую библиотеку. Она нам и нужна. Первое что мы сделаем это загрузим ее в декомпилятор dotPeek от компании JetBrains.
dotPeek![image](http://i.piccy.info/i9/91d2315b56891bfda2d5e3c29d52fcbf/1553205392/89777/1308887/QIP_Shot_Screen_208.png)
![image](http://i.piccy.info/i9/91d2315b56891bfda2d5e3c29d52fcbf/1553205392/89777/1308887/QIP_Shot_Screen_208.png)
Как видно на скрине по библиотеке прошлись обфускатором, переменные и методы переименованы и имеют названия вида a, b, c, d… это нам и нужно. Мы же искали именно это. Давайте посмотрим, что же можно сделать.
Часть 1
Первое что приходит на ум это отыскать строчку, но ввиду того что функционала поиска нет в dotPeek, пойдем по другому пути. Декомпилируем библиотеку штатным ildasm.exe из состава Microsoft SDKs. На выходе получим только один текстовый файл. В нем и поищем текст сообщения «Trial Mode. Please note that your…»
текстовый файл![image](http://i.piccy.info/i9/0891eccaf10ea50f42f14ee2ef2d389a/1553205728/19484/1308887/QIP_Shot_Screen_210.png)
![image](http://i.piccy.info/i9/0891eccaf10ea50f42f14ee2ef2d389a/1553205728/19484/1308887/QIP_Shot_Screen_210.png)
Нашли метод
.method family hidebysig static bool e() cil managedКоторый принадлежит классу CmdDocThisScope. Теперь возвращаемся в dotPeek.
Заголовок спойлера![image](http://i.piccy.info/i9/2b0dd3f39cda21cf1b1a614de7fd86b3/1553205876/11874/1308887/QIP_Shot_Screen_211.png)
![image](http://i.piccy.info/i9/2b0dd3f39cda21cf1b1a614de7fd86b3/1553205876/11874/1308887/QIP_Shot_Screen_211.png)
Итак, что мы имеем. Мы нашли метод, который выводит сообщение о триальности APD и в зависимости от условия возвращает true или false. Найдем все места из которых вызывается этот метод
поиск вызова![image](http://i.piccy.info/i9/4a01993adb2b800c802c7509e250a9e1/1553205953/19522/1308887/QIP_Shot_Screen_212.png)
![image](http://i.piccy.info/i9/4a01993adb2b800c802c7509e250a9e1/1553205953/19522/1308887/QIP_Shot_Screen_212.png)
Нашлось только 2 места вызова и это методы CmdDocThisFile::c и CmdDocThisScope::c.
нашли![image](http://i.piccy.info/i9/8bde97bb50fbd8de6f15102f45a025af/1553206053/3200/1308887/QIP_Shot_Screen_213.png)
![image](http://i.piccy.info/i9/8bde97bb50fbd8de6f15102f45a025af/1553206053/3200/1308887/QIP_Shot_Screen_213.png)
По названию классов и коду конструкторов очевидно что классы отвечают за пункты меню, а виртуальность метода «с» говорит о том что это обработчик события выбора соответствующего пункта меню пользователем (Эта информация нам еще пригодится далее). Несложно догадаться что если метод возвращает true, то команда выполнится хоть и покажет диалог с предупреждением.
В начале метода CmdDocThisScope::e увеличивается переменная f. Откроем окно «IL View» и найдем код команды:
IL View![](https://habrastorage.org/webt/ci/2c/se/ci2cserm7igxadbr_whl7ru06qy.png)
![](https://habrastorage.org/webt/ci/2c/se/ci2cserm7igxadbr_whl7ru06qy.png)
В википедии есть статья с описанием этих инструкций.
Далее найдем этот метод в файле библиотеки APD. Делать это будем с использованием инструмента IDA. В окне с функциями найдем наш метод, и увидим уже знакомый код.
IDA![](https://habrastorage.org/webt/cl/5n/5z/cl5n5zpofq3tfwccepjsk6_zru0.png)
![](https://habrastorage.org/webt/cl/5n/5z/cl5n5zpofq3tfwccepjsk6_zru0.png)
Выделив инструкцию ldsfld найдем ее бинарное представление в окне Hex View
Hex View![](https://habrastorage.org/webt/d1/cx/-x/d1cx-xy5dygzyahw3qwpqlfzpms.png)
![](https://habrastorage.org/webt/d1/cx/-x/d1cx-xy5dygzyahw3qwpqlfzpms.png)
Описание команды подтверждает то, что мы нашли нужное место.
Wiki![](https://habrastorage.org/webt/ms/49/8w/ms498whb3ma36gpqld_fj6sepnk.png)
![](https://habrastorage.org/webt/ms/49/8w/ms498whb3ma36gpqld_fj6sepnk.png)
Дальнейший анализ кода этого метода и последующие шаги выходят за рамки данной статьи.
Часть 2
Теперь, как уже опытные исследователи, найдем вызов диалога с сообщением "The 'Document all in Project' command is only available in the full version…”. Вот этот метод CmdDocThisProject::c
CmdDocThisProject::c![](https://habrastorage.org/webt/xh/9s/ii/xh9siivdtjy3su3wwycbxihnepu.png)
![](https://habrastorage.org/webt/xh/9s/ii/xh9siivdtjy3su3wwycbxihnepu.png)
Класс CmdDocThisProject отвечает за команду «Обработать проект», метод «с» виртуальный. И он содержит только одно – это вызов диалога с сообщением. Ни условий, ни проверок. Поиск по исходному коду приводит нас к методу CmdDocThisProject::i, в котором есть то что мы ожидаем в CmdDocThisProject::c. Теперь в IDA мы с легкостью найдем нужные методы и сможем изучить CIL инструкции
Заключение
Осталось сказать, что в статье намеренно оставлены белые пятна для их самостоятельного изучения.