Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ida.final.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
6 Mб
Скачать

Long ftell (long handle);

Функция возвращает текущую позицию указателя в открытом файле относительно его начала.

Операнд

Пояснения

handle

Дескриптор открытого файла

Return

Завершение

Возвращаемое значение

Успешно

Текущая позиция

Ошибка

-1

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

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

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

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

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

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

Can't 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 ; CODE XREF: seg000:232Ep

seg000:02E4 push ds

seg000:02E5 xor ax, ax

seg000:02E7 mov ds, ax ; DS == NULL

seg000:02E9 assume ds:nothing

seg000:02E9

seg000:02E9 MyLabel:

seg000:02E9 mov ax, ds:413h

seg000:02EC shl ax, 6

seg000:02EF cmp ax, 0A000h

seg000:02F2 pop ds

seg000:02F3 assume ds:seg000

seg000:02F3 retn

seg000:02F3 sub_0_2E4 endp

auto a;

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

loadfile(a,0,0x102E4,0x40);

seg000:02E4 sub_0_2E4 proc near ; CODE XREF: seg000:232Ep

seg000:02E4 push sp

seg000:02E5 push 7369h

seg000:02E7 jnb loc_0_309 ; DS == NULL

seg000:02E9 assume ds:nothing

seg000:02E9

seg000:02E9 MyLabel:

seg000:02E9 jo loc_0_34C

seg000:02EC arpl [bx+si+20h], bp

seg000:02EF popa

seg000:02F2 outsw

seg000:02F3 assume ds:seg000

seg000:02F3 ja near ptr loc_0_367+1

seg000:02F3 sub_0_2E4 endp

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

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

seg000:02E4 push sp

seg000:02E5 push 7369h

seg000:02E8 and [bx+si+61h], dh

seg000:02EB jz loc_0_350

seg000:02ED push 6120h

seg000:02F0 ins byte ptr es:[di], dx

seg000:02F1 ins byte ptr es:[di], dx

seg000:02F2 outsw

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

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

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

seg000:32A0 db 0E2h, 20h, 0A4h, 0A0h, 2 dup(0ADh), 0EBh, 0A9h, 20h

seg000:32A0 db 0ACh, 0A5h, 0E5h, 0A0h, 0ADh, 0A8h, 0A7h, 0ACh, 21h

seg000:32A0 db 0

seg000:32A0 seg000 ends

seg000:32A0

seg000:32A0

seg000:32A0 end start

auto a;

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

loadfile(a,0,0x102E4,0x10);

seg000:32A0 db 0E2h, 20h, 0A4h, 0A0h, 2 dup(0ADh), 0EBh, 0A9h, 20h

seg000:32A0 db 0ACh, 0A5h, 0E5h, 0A0h, 0ADh, 0A8h, 0A7h, 0ACh, 21h

seg000:32A0 db 0

seg000:32A0 seg000 ends

seg000:32A0 end start

0:000132EA db 54h ; T

0:000132EB db 68h ; h

0:000132EC db 69h ; i

0:000132ED db 73h ; s

0:000132EE db 20h ;

0:000132EF db 70h ; p

0:000132F0 db 61h ; a

0:000132F1 db 74h ; t

0:000132F2 db 63h ; c

0:000132F3 db 68h ; h

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

MySeg:000A ; Segment type: Regular

MySeg:000A MySeg segment byte public '' use16

MySeg:000A assume cs:MySeg

MySeg:000A ;org 0Ah

MySeg:000A 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

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

pos

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

ea

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

Size

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

Return

Завершение

Пояснения

0

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

1

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]