Анимация
JavaScript
|
Главная Библионтека Затем указать позицию в файле для чтения (аргумент 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 Обратите внимание, что загрузка не вызывает реассемблирования исследуемой программы. При этом только перезаписывается соответствующий регион виртуальной памяти, но не меняются связанные с ней флаги!
; 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
Доступ к загруженным данным может быть осуществлен, например, вызовами 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 Строго говоря, приведенный пример дизассемблирован не правильно. Если программа подгружала ресурсы из текстового файла динамически во время работы, то перемещение их в сегмент может даже нарушить ее работоспособность после ассемблирования и уж точно не изменит алгоритм, так что бы файловый обмен заменился обращением к памяти. Но на этапе исследования дизассемблируемого кода это невероятно удобно. Можно даже вычислить какие инструкции, какой код загружают, и создать перекрестные ссылки для обеспечения быстрого перехода между различными фрагментами дизассемблируемого текста.
success savefile (long handle,long pos,long ea,long size); Функция, обратная loadfile (смотри описание выше). Она позволяет сохранить фрагмент виртуальной памяти на диске в виде файла. ; CODE XREF: seg000:03C7p ; CODE XREF: seg000:03E4j
; 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 |