Анимация
JavaScript
|
Главная Библионтека затрет начало строки "Hello, Sailor!", поэтому, ее необходимо заблаговременно передвинуть немного «вниз» (т.е. в область более старших адресов), например, с помощью скрипта следующего содержания «for(a=0x108;a<0x11A;a++) PatchByte([0x2000,a+0x20],Byte([0x2000,a]);». Пояснение: объявление переменной a для краткости опущено (сами должны понимать, не маленькие :-), длина строки, как водится, берется с запасом, чтобы не утомлять себя лишними вычислениями и перемещение происходит справа налево, поскольку исходный и целевой фрагменты заведомо не пересекаются. Подведя к курсор к строке :0128 нажатием <A> преобразуем цепочку символов к удобно-читаемому виду; подведем курсор к строке :0102 и, выбрав в меню "Edir" пункт "Path program", "Assembler", введем команду "MOV DX,128h", где «128h» - новое смещение строки, и тут же преобразуем его в смещение нажатием <Ctrl-O>. Вот теперь можно вводить новый текст - переместив курсор на инструкцию "ret", вновь вызовем ассемблер и введем "xor AX,AX<ENTER>INT 16h<Enter>RET<Enter><Esc>". На последок рекомендуется произвести «косметическую» чистку - уменьшить размер сегмента до необходимого и переместить строку "Hello, Sailor" вверх, прижав ее вплотную к коду. Пояснение: удалить адреса, оставшиеся при уменьшении размеров сегмента за его концом можно взводом флажка "Disable Address" в окне свойств сегмента, вызываемом нажатием <Alt-S> Если все было сделано правильно конечный результат должен выглядеть как показано ниже:
mov mov int retn ah, 9 dx, 108h 21h ; CODE XREF: seg000:013Bu ; "Hello,Sailor!\r\n$" ; DOS - PRINT STRING ; DS:DX -> string terminated by "$" db Hello,Sailor!,0Dh,0Ah,$ ; DATA XREF: seg000:0118o ; CODE XREF: seg000:0112u
MySeg:0100 MySeg:0100 MySeg MySeg:0100 MySeg:0100 MySeg:0100 MySeg:0100 MySeg:0100 MySeg:0100 Segment type: Regular segment byte public use16 assume cs:MySeg ;org 100h assume es:nothing, ss:nothing, ds:nothing, fs:nothing, gs:nothing loc 1000 100: mov mov int retn ah, dx, ; CODE XREF: seg000:013Bu offset aHelloSailor 0 ; "Hello,Sailor!\r\n$" ; DOS - PRINT STRING ; DS:DX -> string terminated by "$" ; KEYARD - READ CHAR ERC BUFFER, WAIT IF EMPTY ; Return: AH = scan code, = character aHelloSailor 0 MySeg db Hello,Sailor!,0Dh,0Ah,$ ends DATA XREF: MySeg:0102o MySeg:0102 MySeg:0105 MySeg:0105 MySeg:0107 MySeg:0109 MySeg:0109 MySeg:010B MySeg:010B MySeg:010C MySeg:010C MySeg:010C MySeg:010C MySeg:010C end start a) окончательно дизассемблированный текст Структурно программа состоит из следующих частей - расшифровщика, занимающего адреса seg000:0x100 - seg000:0x113, переменной размером в слово, содержащей количество расшифровываемых байт, занимающей адреса seg000:0x114-seg000:0x116, исполняемого кода программы, занимающего целиком сегмент MySeg и загрузчика, занимающего адреса seg000:0x12E-seg000:0x13B. Все эти части должны быть в перечисленном порядке скопированы в целевой файл, причем исполняемый код программы необходимо предварительно зашифровать, произведя над каждым его байтом операцию XOR 0x66. Ниже приведен пример скрипта, автоматически выполняющего указанные действия. Для его загрузки достаточно нажать <F2> или выбрать в меню "File" пункт "Load file", "IDC file". компилятор для файла Crypt static mair () auto a,f; Открывается фа Crtypt2.com заси в хволном реж/е f=fopen("crypt2.com","wb"); В Crypt2 коется распфроник for (a=0x100;a<0x114;a++) utc(Bie([0x1000,a]),f); Седеляется и коется в слово, содеряапее число баов для расшифровки fputc( SegEnd([0x2000,0x100]) - SegStart([0x2000,0x100]),f); fputc(0,f); Ко;ется и налету пфруется распфрованньй фрагме for(a=SegStart([0x2000,0x100]);a!=SegEnd([0x2000,0x100]);a++) fputc(Bite(a) 0x66,f); Досьюается загрузчик for(a=0x12E;a<0x13C;a++) fputc(Byte([0x1000,a]),f); Закрывается файл. fclose(f); a) исходный код скрипта-компилятора Подробное объяснение каждой функции, встретившийся в скрипте, можно найти в главах «Сегменты и селекторы», «Файловый ввод-вывод» и т.д. Выполнение скрипта приведет к созданию файла "Crypt2.com", запустив который можно убедиться в его работоспособности - он выводит строку на экран и, дождавшись нажатия любой клавиши, завершает свою работу. Огромным преимуществом такого подхода является «сквозная» компиляция файла, т.е. дизассемблированный листинг в действительности не ассемблировался! Вместо этого из виртуальной памяти байт-за-байтом читалось оригинальное содержимое, которое за исключением модифицированных строк доподлинно идентично исходному файлу. Напротив, повторное ассемблирование практически никогда не позволяет добиться полного сходства с дизассемблируемым файлом. IDA - очень удобный инструмент для модификации файлов, исходные тексты которых утеряны или отсутствуют; она практически единственный дизассемблер, способный анализировать зашифрованные программы, не прибегая к сторонним средствам; она обладает развитым пользовательским интерфейсом и удобной системой навигации по исследуемому тексту; она дает может справится с любой мыслимой и немыслимой задачей но эти, и многие другие возможности, невозможно реализовать в полной мере, без владения языком скриптов, что и подтвердил приведенный выше пример. Язык скриптов IDA Си IDA поддерживает Си-подобный скрип-язык, в целом напоминающий Си Керигана и Ричи, но значительно упрощенный, не поддерживающий типов, массивов, указателей и в том числе не обладающий возможностью отладки приложений. Язык скриптов изначально задумывался как средство выполнения простейших операций, укладывающихся в десяток-другой строк кода, а для «серьезных» задач предусмотрен механизм плагинов - внешних модулей, написанных на Borland C++ или Microsoft Visual C++ и подключаемых к IDA по мере необходимости. Впрочем, в подавляющем большинстве случаев нет никакой нужды прибегать к плагинам и вполне можно обойтись встроенным скрипт-языком. Ниже приводится краткое описание языка скриптов IDA Си, рассчитанное на читателя знакомого и владеющего «классическим» Си. Консоль Простейшие скрипты могут быть набраны «не отходя от кассы» в диалоге, вызываемом нажатием <Shif-F2>, в дальнейшем именуемым консолью. Достоинство этого 0 1 2 3 4 5 [ 6 ] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 |