Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #87, МАРТ 2006 г.

Язык протектора

GPcH (www.dotfix.net)

Хакер, номер #087, стр. 087-142-5


getoep oep, va_oep

getimagebase imagebase

add @va_oep@,@imagebase@,va_oep

add @oep@,1,oep

getcode @oep@, 4, VBHeader

invert @VBHeader@, VBHeader

sub @VBHeader@,@imagebase@,VBHeader

add @VBHeader@,30,VBHeader

getcode @VBHeader@, 4, ProjectInfo

invert @ProjectInfo@, ProjectInfo

sub @ProjectInfo@,@imagebase@,ProjectInfo

add @ProjectInfo@,20,ProjectInfo

getcode @ProjectInfo@, 4, NativeCode

messagebox This program compiled to P-Code,64,VB file sniffer,retval, if NativeCode = 00000000

messagebox This program compiled to Native Code,64,VB file sniffer,retval, if NativeCode > 00000000

Как видишь, скрипт очень прост. Решение той же задачи на Си потребовало бы втрое больше времени, не говоря уже о том, что потребовалось бы позаботиться о пользовательском интерфейсе и прочих рутинных операциях, которые за нас выполняет скриптовый движок и сам DotFix FakeSigner. От нас остается только объяснить ему, что делать с уже открытым файлом. Задачи корректно закрыть файл и т.п. также целиком и полностью ложатся на скрипт.

Теперь рассмотрим только что написанный код. Сначала мы в нем считываем адрес VBHeader структуры, по этому адресу считываем саму структуру, а затем по смещению 30h относительно начала структуры считываем поле ProjectInfo. Оно, в свою очередь, указывает на соответствующую структуру ProjectInfo. По смещению 20h уже относительно начала ProjectInfo структуры считываем 4-байтное поле NativeCode. Если оно отлично от нуля, то мы имеем Native Code программу, если иначе, то это - пикод. Так как Dword-поля расположены в EXE-файле в формате справа на лево, то мы их все приводим к нормальному отображению командой invert. Затем эти адреса необходимо перевести в Offset, для этого мы отнимаем из них ImageBase. Признаюсь честно, что для более корректного перевода надо скорректировать это число по Offset и VA-адресам секции, в которой находится адрес, но в VB-программах эти адреса у первой секции обычно всегда равны, поэтому я решил не усложнять скрипт лишними операциями.

[пишем простенький криптор]

Теперь, когда мы немного разобрались с командами скриптового языка, я думаю, имеет смысл написать что-нибудь гораздо более серьезное. Я предлагаю написать криптор PE-файлов. Он будет криптовать первые 10 байт в EXE-файле, начиная от точки входа, а точка входа будет меняться на последнюю секцию. В нее мы запишем декриптор того участка из 10 байт и, соответственно, переход на оригинальную точку входа в программу. В простейшем виде скрипт будет выглядеть так:

[суперкриптор]

;определяем точку входа

getoep oep, va_oep

;xor'им первые 10 байт точки входа и

;заносим код декриптора в переменную 'decoder'

xorcode @va_oep@,10,decoder

;определяем imagebase

getimagebase imagebase

;складываем oep и imagebase

add @va_oep@,@imagebase@,va_oep

;записываем байты в обратном порядке

invert @va_oep@, va_oep

;заносим длину нашего кода в переменную 'len'

length 60@decoder@61B8@va_oep@FFE0,len

Назад на стр. 087-142-4  Содержание  Вперед на стр. 087-142-6