Что­бы нем­ного раз­нооб­разить свою жизнь, сегод­ня мы сно­ва зай­мем­ся раз­боркой антиква­риата. Мно­гие уже забыли о сущес­тво­вании такого инс­тру­мен­та, как дав­но похоро­нен­ный P-Code, в который тран­сли­рова­лись прог­раммы на Visual Basic. Тем не менее соз­данные с его помощью при­ложе­ния до сих пор сущес­тву­ют, и сегод­ня мы с тобой акку­рат­но сло­маем одно из них.

warning

Статья име­ет озна­коми­тель­ный харак­тер и пред­назна­чена для спе­циалис­тов по безопас­ности, про­водя­щих тес­тирова­ние в рам­ках кон­трак­та. Автор и редак­ция не несут ответс­твен­ности за любой вред, при­чинен­ный с при­мене­нием изло­жен­ной информа­ции. Рас­простра­нение вре­донос­ных прог­рамм, наруше­ние работы сис­тем и наруше­ние тай­ны перепис­ки прес­леду­ются по закону.

К сожале­нию (или счастью?), Microsoft поэтап­но похоро­нила P-Code, спер­ва перей­дя на ком­пиляцию пи‑кода в натив, от чего, на мой взгляд, он стал силь­но более неук­люжим, а затем и вов­се пол­ностью переве­ла VB на плат­форму .NET. Тем не менее из‑за сво­ей прос­тоты и популяр­ности в былые вре­мена соз­данные на P-Code про­екты весь­ма мно­гочис­ленны и про­дол­жают работать по сей день.

Что­бы ты не испу­гал­ся, если вдруг в твои руки попадет подоб­ный раритет, знал, что с ним делать и с какой сто­роны к нему подой­ти, рас­смот­рим спе­цифи­ку и внут­реннее устрой­ство P-Code на при­мере доработ­ки неболь­шой гра­фичес­кой прог­раммы. Усло­вия задачи таковы: у нас есть соф­тина, в текущей пос­тавке которой отклю­чены некото­рые полез­ные фун­кции (нет свя­зан­ных с ними пун­ктов меню). Но сама чер­ная кош­ка в тем­ной ком­нате при­сутс­тву­ет, то есть в модуле име­ются и нуж­ные нам пун­кты меню, и код отве­чающих за них фун­кций. Прос­то они невиди­мы для нашей лицен­зии, и открыть их — наша задача.

Для начала опре­деля­ем тип прог­раммы и ее защиту при помощи DetectItEasy.

DIE определил компилятор программы как Microsoft Visual Basic 6.0
DIE опре­делил ком­пилятор прог­раммы как Microsoft Visual Basic 6.0

По­пыт­ка заг­рузить иссле­дуемую прог­рамму в IDA, к сожале­нию, не при­нес­ла никако­го полез­ного резуль­тата.

IDA считает, что нативный код отсутствует или зашифрован
IDA счи­тает, что натив­ный код отсутс­тву­ет или зашиф­рован

Нас­тало вре­мя для нашего любимо­го отладчи­ка x64dbg. Нем­ного повозив­шись в нем, обна­ружи­ваем, что основной код кру­тит­ся внут­ри модуля msvbvm60.dll.

Программа в отладчике
Прог­рамма в отладчи­ке

На­лицо клас­сичес­кая вир­туаль­ная машина. В ней интер­пре­тиру­ется поток дан­ных, текущий ука­затель коман­ды находит­ся в регис­тре esi. Из потока выбира­ется байт кода опе­рации, и по его индексу из таб­лицы адре­сов обра­бот­чиков (6909AA24 в дам­пе) выбира­ется адрес обра­бот­чика сле­дующей коман­ды, на которую дела­ется переход. По счастью, это не злоб­ный про­тек­тор типа Enigma или Themida, никаких обфуска­торов и анти­отладчи­ков в коде нет. Более того, нам даже не тре­бует­ся изоб­ретать велоси­пед, раз­бирая вир­туаль­ную машину самос­тоятель­но — за вре­мя сущес­тво­вания VB за нас это сде­лали дру­гие доб­рые люди.

Итак, мы наконец вплот­ную подош­ли к понятию P-Code. Этот тер­мин был при­думан еще пол­века назад одним из осно­вопо­лож­ников сов­ремен­ного прог­рамми­рова­ния Ник­лаусом Вир­том для любого аппа­рат­но‑незави­симо­го псев­докода вир­туаль­ной машины. Одна­ко с лег­кой руки Microsoft при­жилось оно при­мени­тель­но к теперь уже мер­тво­му байт‑коду Visual Basic, пре­иму­щес­твен­но 6-й вер­сии.

Схе­ма фун­кци­они­рова­ния P-Code пре­дель­но прос­та и вид­на на скрин­шоте выше. Из стран­ных осо­бен­ностей мож­но отме­тить наличие целых шес­ти таб­лиц обра­бот­чиков байт‑кодов. Это зна­чит, что не все опко­ды псев­докоманд одно­бай­товые, каж­дый из пос­ледних пяти опко­дов глав­ной таб­лицы (FB-FF) — «сос­тавной» двух­бай­товый. То есть обра­бот­чик каж­дого из этих кодов счи­тыва­ет сле­дующий байт и переда­ет управле­ние по его индексу на обра­бот­чик из дру­гой таб­лицы адре­сов, в которой тоже содер­жится 256 воз­можных зна­чений. Непонят­но, зачем исполь­зует­ся такой хит­рый спо­соб, а глав­ное — для чего пре­дус­мотрен такой запас опко­дов, ведь из 1531 воз­можно­го задей­ство­вано все­го 822, при­чем некото­рые дуб­лиру­ют друг дру­га.

Я не буду при­водить здесь пол­ную таб­лицу опко­дов P-Code, жела­ющие могут най­ти ее на сай­те DotFix или даже в более информа­тив­ном виде в ис­ходни­ках про­екта Semi-VB-Decompiler. Там же при­водят­ся аргу­мен­ты и при­мер­ный смысл каж­дого опко­да.

Во­ору­жив­шись дан­ной информа­цией, гораз­до про­дук­тивнее раз­бирать и отла­живать прог­рамму даже в x64dbg. Одна­ко сущес­тву­ют и еще более прод­винутые инс­тру­мен­ты для отладки и деком­пиляции пи‑кода. Два из них ты уже, навер­ное, уви­дел по при­веден­ным выше ссыл­кам: сво­бод­ный деком­пилятор Semi-VB-Decompiler и ком­мерчес­кий VB Decompiler. Еще один незаме­нимый инс­тру­мент для работы с пи‑кодом — сво­бод­ный ди­зас­сем­блер‑отладчик VBDec.

На­до ска­зать, что эти про­екты весь­ма сырые и име­ют мас­су недоче­тов (к при­меру, Semi-VB-Decompiler у меня вооб­ще не деком­пилиро­вал ни одно­го фай­ла и не смог най­ти валид­ную сиг­натуру), но их воз­можнос­ти допол­няют друг дру­га. К при­меру, VB Decompiler уме­ет с более‑менее перемен­ным успе­хом не толь­ко дизас­сем­бли­ровать, но и вос­ста­нав­ливать VB-код. При­чем не толь­ко из P-Code, но и из ском­пилиро­ван­ного из него натива, и даже из .NET. А хоть VBDec это­го и не уме­ет, зато его дизас­сем­блер на нес­коль­ко поряд­ков более пря­мой и без­глюч­ный, а глав­ное, у него есть пол­нофун­кци­ональ­ный дебаг­гер с воз­можностью трас­сиров­ки P-Code.

Вер­немся к нашей задаче и поп­робу­ем решить ее уже с помощью этих чудес­ных инс­тру­мен­тов. Для начала откры­ваем иссле­дуемую прог­рамму в VB Decompiler и ищем глав­ное окно. В VB Decompiler для это­го име­ется инс­тру­мент Tools-Search string (он, прав­да, вре­мена­ми под­глю­чива­ет, но потер­петь мож­но). Хоть прог­рамма и обфусци­рова­на, но мы находим и глав­ное окно MDIForm1, и пер­вый пункт меню из скры­тых из‑за отсутс­твия лицен­зии.

Форма основного окна, вид из VB Decompiler
Фор­ма основно­го окна, вид из VB Decompiler

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    2 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии