Взлом программ на Visual Basic в native коде. Крэкинг ч.26

Обсудить статью на форуме


Очень удобно, когда все крэкерские инструменты, книги и статьи в одном месте. Используйте сборник 2020 года от EXELAB - вот тут.


ВЗЛОМ ПРИЛОЖЕНИЙ, НАПИСАННЫХ НА VISUAL BASIC, С ПОМОЩЬЮ OLLYDBG

В этой и последующих главах мы будем учиться крэкать программы, написанные на Visual Basic’е, с помощью OllyDbg, на что вы можете мне сказать, что для этого существует специальный инструменты, но так как этот курс посвящён именно отладчику OllyDbg, то будем стараться использовать как можно меньше других инструментов, и только, если мы никак не можем добиться того, что нужно, с помощью OllyDbg, тогда и только тогда мы будем прибегать к ним.

Прежде всего, я приготовил для вас небольшой подарок.

Он называется “OLLYDBG PARCHEADO PARA BUSCAR OEPs”, который, как правило, требуется только для распаковки, но на самом деле, он также очень полезен при анализе программ, написанных на VISUAL BASIC и скомпилированных в «родной» код (но не для тех, что используют P-CODE).

Между обоими случаями есть значительное различие, и будет несколько глав, посвящённая P-CODE, но кратко можно сказать, что при «родном» коде, код, как и полагается, выполняется инструкциями в секции «code» программы, а при P-CODE запускается специальная DLL-библиотека, которая читает из секции «code» байты, содержащие информацию о том, какие команды надо исполнять.

То есть, если программа, написанная на Visual Basic’е, никогда не выполняет строки из секции кода, то в этом случае она использует P-CODE, и как с ним работать, мы изучим гораздо позже.

Чем отличается пропатченный OllyDbg? Тем, что при установке BPM ON ACCESS остановка происходит не по событиям ON READ и ON EXECUTE, а только по ON EXECUTE, и это очень полезно для нахождения OEP’ов и для Visual Basic, так как программа не будет останавливаться тысячу раз в библиотеке VB, а будет каждый раз возвращаться обратно в код программы, и мы не потонем в DLL-библиотеке Visual Basic’а.

Также, чтобы работать с Visual Basic, необходимо знать API-функции VB, которые отличаются от обычных, и их нельзя встретить в стандартных мануалах (как, например, WINAPIS32).

В остальном, есть множество туториалов, специально посвящённых VB и содержащие множество приёмов и способов, которые мы не будем использовать, но если вы захотите ознакомиться с ними, то обратитесь к «Новому курсу…» от Crackslatinos и найдите туториалы COCO и других участников, что может весьма вам помочь в данной области. Здесь мы не будем использовать данные методики и будем крэкать только с помощью OllyDbg.

Пропатченный OllyDbg помещаем в ту же папку, где лежит и непропатченный. Естественно, использовать первый имеет смысл тогда, когда взламываем VB-программы, или когда ищем OEP’ы, или в любом другом случае, когда нужно чтобы BPM ON ACCESS работал как BPM ON EXECUTION.

Конечно, если используем этот OllyDbg, то мы не можем использовать BPM ON ACCESS так, чтобы он останавливался по событиям ON READ и ON EXECUTE, в этом случае иногда можно применить HARDWARE BPX ON.

Основная проблема с API-функциями Visual Basic’а – это то, что Microsoft не распространяет информацию о них. Если нужно что-то узнать о какой-то функции, то надо делать поиск в Google, и если повезёт, то найдётся какая-нибудь страница, где будет объяснено, что она делает и для чего служат. Поэтому перед тем, как перейти к собственно крэкингу, в этом главе приводятся собранные мной материалы о некоторых наиболее важных API-функциях и содержащих некоторую общую информацию о программах на Visual Basic’е.

ЗНАЧИМЫЕ СОСТАВЛЯЮЩИЕ ИМЕНИ API-ФУНКЦИИ VB

В именах функций, которые мы повстречаем, могут встречаться следующие аббревиатуры:

bool    Boolean
str     String 
i2      Integer (2 bytes) 
ui2     Unsigned integer (2 bytes unsigned integer)
i4      Long (4 bytes integer)
r4      Single (4 bytes real)
r8      Double (8 bytes real) 
cy      Currency
var     Variant or variable 
fp      Floating point
cmp     compare 
comp    compare


Ниже идёт таблица с определениями типов переменных. Имея представление о них, мы уже многое можем понять о самой функции.

Взлом программ отладчиком OllyDbg

Например:

__vbal2Str говорит о том, что строка конвертируется в число.

Вот ещё некоторые определения:

1) Примеры API-функций, конвертирующих данные:
  1. __vbaI2Str конвертирует String в Integer
  2. __vbaI4Str конвертирует String в Long
  3. __vbar4Str конвертирует String в Single
  4. __vbar8Str конвертирует String в Double
  5. VarCyFromStr конвертирует String в Currency
  6. VarBstrFromI2 конвертирует Integer в String


Видим, что аббревиатуры дают нам представление о типах. Вот ещё несколько API-функций:

2) Перемещение данных
  1. __vbaStrCopy – копирует String в память
  2. __vbaVarCopy - копирует Variable в память
  3. __vbaVarMove – копирует Variable в память


3) Математические
  1. __vbavaradd – сумма переменных типа Variable
  2. __vbavarsub – сумма переменных типа Variable
  3. __vbavarmul – сумма переменных типа Variable
  4. __vbavaridiv – поделить две переменные, результат возвращается в виде Integer
  5. __vbavarxor – функция XOR


4) Вспомогательные:
  1. __vbavarfornext - цикл
  2. __vbafreestr – освободить неиспользующуюся переменную типа String.
  3. __vbafreeobj – освободить неиспользущийся объект.
  4. __vbastrvarval – взять значение из места, заданного строкой.
  5. multibytetowidechar – сконвертировать String в widechar-формат строки
  6. .
  7. rtcMsgBox – отображает окошко с сообщение – похоже на API-функцию Windows messagebox/a/exa.
  8. __vbavarcat – соединить две переменные.
  9. __vbafreevar – освободить неиспользующуюся переменную типа Variable.
  10. __vbaobjset Активировать объект.
  11. __vbaLenBstr – получить размер строки.
  12. rtcInputBox – отобразить окошко ввода, похоже на API-функции Windows API getwindowtext/a, GetDlgItemtext/a.
  13. __vbaNew – показать диалоговое окно – похоже на API-функцию Windows Dialogbox.
  14. __vbaNew2 - показать диалоговое окно – похоже на API-функцию Windows Dialogboxparam/a.
  15. rtcTrimBstr – подрезать String.
  16. __vbaEnd – завершение программы.
  17. __vbaLenVar – получить размер переменной.
  18. rtcMidCharVar –получить определённый символ строки.
  19. _rtcDir – проверка, существует ли файл.
  20. __vbaFileOpen – открыть файл.


5) Сравнения:
  1. __vbastrcomp – сравнение двух строк - как lstrcmp.
  2. __vbastrcmp – сравнение двух строк – как lstrcmp.
  3. __vbavartsteq – проверка на равенство двух переменных.
  4. __vbaFpCmpCy – сравнение переменной с плавающей точкой с переменной типа Currency.
  5. __vbavartstNe – сравнение двух переменных на неравенство.


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

И хотя пока что мы не рассматриваем крэкинг в SMART CHECK’е, вот адрес со списком внешних функций VB, с которым может консультироваться крэкер.

http://www.w3schools.com/vbscript/vbscript_ref_functions.asp

Например, в Smartcheck’е нам показывается функции ASC или MID, которые не соответствуют тому, что мы видим в OllyDbg или функциям в языке программирования Visual Basic, но на этой странице хорошо объяснена каждая из возможных команд и их параметры, поэтому крэкинг в SMART CHECK’е существенно легче.

Например, в SMART CHECK’е видим команду LEN, которая соответствует API-функции __vbaLenVar.

Взлом программ отладчиком OllyDbg

На странице смотрим определение LEN.

Взлом программ отладчиком OllyDbg

Это поможет тем, у кого есть проблемы с использованием SMART CHECK’а. Хотя в этом туториале мы не будем его рассматривать, думаю, что ни одна из статей, посвящённых этому инструменту, не даёт точный список используемых им выражений, поэтому я и упомянул его.

Ладно, теперь, когда мы всё это знаем, перейдём к крэканию CrackMePls.

Открываем его в пропатченном вышеуказанным образом OllyDbg.

Взлом программ отладчиком OllyDbg

Этот крэкми очень простой: есть наг (nag), который нужно убрать, и серийный номер, который нужно найти. Смотрим и делаем RUN.

Взлом программ отладчиком OllyDbg

Закрываем наг-окошко, которое похоже на MessageBoxA, хотя в Visual Basic’е этому соответствует API-функция rtcMsgBox. Установим на неё BP.

Взлом программ отладчиком OllyDbg

И рестартуем, чтобы посмотреть, произойдёт ли остановка до того, как выйдем из наг-окошка.

Взлом программ отладчиком OllyDbg

Останавливаемся здесь, нет никакой подсказки относительно параметров или чего бы то ни было ещё, но это неважно.

Видим, откуда вызывается эта API-функция, первое значение стека – это адрес, по которому будет осуществлён возврат управления.

Взлом программ отладчиком OllyDbg

Смотрим место, откуда произошёл вызов.

Взлом программ отладчиком OllyDbg

Вот вызов API-функции, а ниже, соответственно, находится точка возврата, адрес которой 4032d9.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Устанавливаем BP на точку возврата из API-функции и нажимаем RUN.

Взлом программ отладчиком OllyDbg

Нажимаем и останавливаемся на возврате.

Взлом программ отладчиком OllyDbg

EAX=1 означает, что API-функция выполнилась успешно. Теперь надо рестартовать крэкми, чтобы затем каким-нибудь образом забить наг-окно NOP’ами.

Рестартуем крэкми и останавливаемся на вызове.

Взлом программ отладчиком OllyDbg

Если кликнем правой кнопкой мыши на строке, куда происходит возврат, и выберем NEW ORIGIN HERE, то выполнение продолжится отсюда без отображения окошка. Это симуляция забивки вызова NOP’ами.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Здесь делаем RUN и смотрим, что происходит.

Взлом программ отладчиком OllyDbg

Очевидно, что решение забить NOP’ами вызов API-функции не работает. Попробуем другой способ. Рестартуем крэкми.

Взлом программ отладчиком OllyDbg

Доходим до 4032d9 и продолжаем трассировать с помощью F8.

Взлом программ отладчиком OllyDbg

Доходим до JUMP и продолжаем трассировать.

Взлом программ отладчиком OllyDbg

JMP, перед которым находится PUSH 403341, переходит на RET, то есть тот используется для перехода на 403341, о чём нам также говорит и OllyDbg. Этот приём используется для того, чтобы не дать нам заметить адрес возврата в стеке. Продолжаем трассировать.

Взлом программ отладчиком OllyDbg

Доходим до RETN 8.

Взлом программ отладчиком OllyDbg

Здесь, по адресу 402f95 заканчивается выход из CALL'а, но адрес возврата не постаётся в стеке благодаря трюку, используемого для скрытия CALL'а и адреса возврата.

Устанавливаем BP на этот CALL и рестартуем крэкми.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Забиваем CALL нопами, чтобы посмотреть, запустится ли он без наг-окошка.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Делаем RUN.

Взлом программ отладчиком OllyDbg

Пока-пока, наг, хе-хе, позже мы рассмотрим другие примеры того, как убирать наги, но этот пример был достаточно прост, не считая маленького рассмотренного выше трюка. Вопрос состоял в том, чтобы идти от появления нага до возвратов из CALL’ов, чтобы увидеть, можно ли забить NOP'ами какой-то из них для устранения назойливого окошка.

Теперь крэкми работает и предлагает нам ввести правильный серийный номер.

Взлом программ отладчиком OllyDbg

Тут мы увидим возможность, даваемую пропатченным OllyDbg. Хотим поставить BPM ON ACCESS (выполнение) на секцию кода, идём в M.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Вспоминаем, что в этом OllyDbg это BPM ON EXECUTION, при котором не происходит остановки при чтении и записи в секции, где выполняется DLL-библиотека Visual Basic'а, а быстро происходит возврат в программу, благодаря чему мы избегаем тысячи лишний остановов.

Нажимаем OK.

Взлом программ отладчиком OllyDbg

Останавливаемся здесь и немного потрассируем.

Взлом программ отладчиком OllyDbg

Доходим до этого вызова. Быстро проходим через вызовы API-функций и заходим во внутренние функции программы.

Тогда заходим с помощью F7.

Взлом программ отладчиком OllyDbg

Доходим до места, возможно, представляющего интерес, внизу видим vbaStrCmp, что может являться возможным сравнением строк. Устанавливаем сюда BP и снимаем BPM до того, как сделаем RUN.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Видим, что происходит сравнение введённой строки «989898» с правильным серийным номером. Копируем его.

Взлом программ отладчиком OllyDbg

И помещаем содержимое буфера в блокнот..

Взлом программ отладчиком OllyDbg

Отсюда легко можем скопировать правильный серийный номер.

Взлом программ отладчиком OllyDbg

Пробуем поместить его в окошко крэкми.

Взлом программ отладчиком OllyDbg

Взлом программ отладчиком OllyDbg

Хорошо, получилось. Конечно, нужно сохранить изменения (мы же забили наг-окошко NOP'ами), чтобы теперь это крэкми выполнялось нормально.

В главе 27 продолжим углубление в крэкинг приложений на Visual Basic и будем использовать более сложные примеры.



  [C] Рикардо Нарваха, пер. Aquila

Обсуждение статьи: Взлом программ на Visual Basic в native коде. Крэкинг ч.26 >>>


При перепечатке ссылка на https://exelab.ru обязательна.



Видеокурс ВЗЛОМ