Язык протектора 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 |