Анимация
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

Затем указать позицию в файле для чтения (аргумент pos). Позиция всегда считается относительно начала файла, не зависимо от текущего положения указателя.

Далее указать виртуальный линейный адрес, по которому будет скопирован фрагмент файла. Операция завершится независимо от того, производится загрузка в границах существующего сегмента или вне оных. При необходимости IDA выделяет дополнительную виртуальную память для загрузки.

Последний аргумент, передаваемый функции - это число загружаемых из файла байт. Если оно превосходит длину «хвоста» файла (то есть от указанной позиции до конца), то IDA выдаст предупреждение:

Cant read input file (file structure error?), only part of file will be loaded...

И загрузит столько байт, сколько сможет.

seg000:2C93 aWatchAvialable db Watch avialable DOS memory...........................

auto a;

a=fopen("readme.txt","rb"); loadfile(a,0,0x12C93,0x40);

seg000:2C93 aWatchAvialable db This patch allows you to permanently access the bonus

Обратите внимание, что загрузка не вызывает реассемблирования исследуемой программы. При этом только перезаписывается соответствующий регион виртуальной памяти, но не меняются связанные с ней флаги!

Это хорошо видно на следующем примере:

seg000:

02E4 sub 0 2E4

proc near

seg000:

02E4

push

seg000:

02E5

ax, ax

seg000:

02E7

ds, ax

seg000:

02E9

assume

ds:nothing

seg000:

02E9

seg000:

02E9 MyLabel:

seg000:

02E9

ax, ds:413h

seg000:

02EC

ax, 6

seg000:

02EF

ax, 0A000h

seg000:

02F2

seg000:

02F3

assume

ds:seg000

seg000:

02F3

retn

seg000:

02F3 sub 0 2E4

endp

auto a;

a=fopen("readme.txt","rb")

loadfil

e(a,0,0x102E4,0x40)

seg000:

02E4 sub 0 2E4

proc near

seg000:

02E4

push

seg000:

02E5

push

7369h

seg000:

02E7

loc 0 309

seg000:

02E9

assume

ds:nothing

seg000:

02E9

seg000:

02E9 MyLabel:

seg000:

02E9

loc 0 34C

seg000:

02EC

arpl

[bx+si+20h], bp

seg000:

02EF

popa

seg000:

02F2

outsw

seg000:

02F3

assume

ds:seg000

; CODE XREF: seg000:232Ep

; DS == NULL

; CODE XREF: seg000:232Ep

; DS == NULL



seg000-02F3 seg000:02F3 sub 0 2E4

endp

near ptr loc 0 367+1

Обратите внимание, что не только сохранились прежние метки, комментарии и перекрестные ссылки, но и оказался неверно дизассемблированным код! Но это не ошибка IDA, а ее архитектурная особенность. Вместе с обычными перекрестными ссылками сохранились и так называемые ссылки на следующую инструкцию. Поэтому вновь загруженный код был дизассемблирован с учетом прежнего «каркаса» то есть линейный адресов начала инструкций.

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

seg00 seg00 seg00 seg00 seg00 seg00

02E4

02E5 02E8 02EB 02ED

02F0 seg000:02F1 seg000:02F2

push sp

push 7369h

and [bx+si+61h], dh

jz loc 0 35 0

push 6120h

ins byte ptr es:[di], dx

ins byte ptr es:[di], dx

outsw

Чаще всего эту функцию используют для частичного дизассемблирования файла. Например, если внутри много мегабайтовой DLL необходимо исследовать лишь небольшой фрагмент, то нет нужды несколько часов ждать пока IDA дизассемблирует ее целиком - достаточно лишь загрузить требуемый фрагмент.

Кроме того, многие приложения во время работы подгружают различные свои компоненты с диска. Если их так же необходимо исследовать, то для этого можно воспользоваться loadfile.

Иногда даже не требуется создавать для этого дополнительный сегмент, загрузив данные за его границы.

seg000:32A0 seg000:32A0 seg000:32A0

seg000:32A0 seg000 seg000:32A0 seg000:32A0 seg000:32A0

db 0E2h, 20h, 0A4h, 0A0h, 2 dup(0ADh), 0EBh, 0A9h, 20h

db 0ACh, 0A5h, 0E5h, 0A0h, 0ADh, 0A8h, 0A7h, 0ACh, 21h

db 0 ends

end start

auto a;

a=fopen("readme.txt","rb") loadfile(a,0,0x102E4,0x10)

se se

g000:32A0 g000:32A0

eg0 eg0 eg0

seg000

0E2h, 20h, 0A4h, 0A0h, 2 dup(0ADh), 0EBh, 0A9h, 20h 0ACh, 0A5h, 0E5h, 0A0h, 0ADh, 0A8h, 0A7h, 0ACh, 21h

000132EA

000132EB

000132EC

000132ED

000132EE

000132EF

000132F0

000132F1

000132F2

000132F3

Доступ к загруженным данным может быть осуществлен, например, вызовами Byte. Для интерактивной же работы (например, что бы преобразовать загруженные данные в строку) все же придется создать сегмент (как это сделать рассказано в описании функции SegCreate)



MySeg:000A ; Segment type: Regular

MySeg:000A MySeg MySeg:000A MySeg:000A MySeg:000A

segment byte public use16 assume cs:MySeg ;org OAh

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

gs:nothing

MySeg:000A aThisPatchAllow db This patch allows you to permanently access the bonus track MySeg:000A MySeg ends

MySeg:000A

Строго говоря, приведенный пример дизассемблирован не правильно. Если программа подгружала ресурсы из текстового файла динамически во время работы, то перемещение их в сегмент может даже нарушить ее работоспособность после ассемблирования и уж точно не изменит алгоритм, так что бы файловый обмен заменился обращением к памяти.

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

Операнд

Пояснения

handle

Обработчик открытого только на чтение файла

Позиция в файле, относительно его начла

Линейный адрес начала региона виртуальной памяти

Size

Число байт для чтения

Return

Завершение

Пояснения

Функция завершилась неуспешно

Функция завершилась успешно

success savefile

(long handle,long pos,long ea,long size);

Функция, обратная loadfile (смотри описание выше). Она позволяет сохранить фрагмент виртуальной памяти на диске в виде файла.

; CODE XREF: seg000:03C7p

; CODE XREF: seg000:03E4j

Например:

seg000

03D3 sub 0 3D3

proc

near

seg000

03D3

push

seg000

03D4

push

seg000

03D5

al, byte ptr es:

seg000

03D9

bx, 3EAh

seg000

03DC

seg000

03DC loc 0 3DC:

seg000

03DC

[bx], al

seg000

03DE

loc 0 3E7

seg000

03E0

seg000

03E1

byte ptr [bx], 0

seg000

03E4

loc 0 3DC

seg000

03E6

seg000

03E7

seg000

03E7 loc 0 3E7:

seg000

03E7

seg000

03E8

seg000

03E9

retn

seg000

03E9 sub 0 3D3

endp

seg000

03E9

seg000

03EA aDeifxcblst

db DEIFXCBLST,0

; CODE XREF: seg000:03DEj

auto a;

a=fopen("fileme"

wb")



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