Анимация
JavaScript


Главная  Библионтека 

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

затрет начало строки "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>

Если все было сделано правильно конечный результат должен выглядеть как показано ниже:

seg000:

0100

; File Name :

F:\IDRN\SRC\Crypt.com

MS-DOS COM-file

seg000:

0100

; Format :

seg000:

0100

; Base Address:

1000h Range: 10100h-1013Ch Loaded length: 3Ch

seg000:

0100

seg000:

0100

seg000:

0100

; ===========================================================================

seg000:

0100

seg000:

0100

; Segment type:

Pure code

seg000:

0100

seg000

segment byte putlic CCDE Lse16

seg000:

0100

assume cs:seg000

seg000:

0100

org 100h

seg000:

0100

assume es:nothing, ss:nothing, ds:seg000, fs:nothing, gs:nothing

seg000:

0100

seg000:

0100

; -------------

-- S U B R O U T I N E ---------------------------------------

seg000:

0100

seg000:

0100

seg000:

0100

public start

seg000:

0100

start

proc near

seg000:

0100

add si, 6

seg000:

0103

jmp si ; Ia5aoia ii аабапо 0106

seg000:

0103

start

endp

seg000:

0103

seg000:

0103

seg000:

0105

db 0B9h ; 1

0106

seg000:

0106

mov si, offset BytesToDecrypt

seg000:

0109

lodsw

seg000:

010A

xchg ax, cx

seg000:

010B

push si

seg000:

010C

seg000:

010C

loc 0 10C:

; CODE XREF: seg000:0110j

seg000:

010C

xor byte ptr [si], 66h

seg000:

010F

inc si

seg000:

0110

loop loc 0 10C

seg000:

0112

seg000:

0112

BreakHere:

; laBaona in ааЭалб 012E

seg000:

0112

jmp si

seg000:

0112

seg000:

0114

BytesToDecrypt

dw 18h ; DATA XREF: seg000:0106o

seg000:

0116

; -------------

--------------------------------------------------------------



seg000:

0116

seg000:

0116

seg000:

0116

seg000:

0118

seg000:

011B

seg000:

011B

seg000:

011D

seg000:

011D

seg000:

011E

seg000:

012E

seg000:

012E

seg000:

012E

seg000:

012E

seg000:

0131

seg000:

0132

seg000:

0133

seg000:

0136

seg000:

0137

seg000:

0139

seg000:

013B

seg000:

013B

seg000:

013B

MySeg:0100

MySeg:0100

MySeg:0100

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

call

100h

push

repe

movsb

retn

ends

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