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

Long GetEntryPointQty(void);

Функция возвращает число точек входа (Entry Points). Обычно IDA создает только одну точку входа, адрес которой извлекается из заголовков исполняемого файла. Но иногда возникает потребность в создании более, чем в одной точке входа.

Например, PE файл, имеющий DOS-заглушку. Если мы захотим дизассемблировать последнюю, то необходимо добавить новую точку входа «вручную», поскольку IDA предпочитает в большинтстве случаев обходится всего лишь одним Entry Point

Пример использования:

Message(“0x%X \n”, GetEntryPointQty());

0x1

Операнд

Пояснения

Return

Число точек входа

Success AddEntryPoint(long ordinal,long ea,char name,long makecode);

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

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

При генерации точки входа IDA вставляет директиву ассемблера PUBLIC.

seg000:0000 public start

seg000:0000 start proc near

seg000:0000 push ax

seg000:0001 mov cx, 1

seg000:0004 shl cx, 1

seg000:0006 add sp, cx

seg000:0008 push ax

seg000:0009 add sp, cx

seg000:000B retn

seg000:000B start endp ; sp = -4

seg000:000B

seg000:000B seg000 ends

AddEnrtyPoint(1,0x10006,”NewEntryPoint”,0);

seg000:0000 public start

seg000:0000 start proc near

seg000:0000 push ax

seg000:0001 mov cx, 1

seg000:0004 shl cx, 1

seg000:0006

seg000:0006 public NewEntryPoint

seg000:0006 NewEntryPoint:

seg000:0006 add sp, cx

seg000:0008 push ax

seg000:0009 add sp, cx

seg000:000B retn

seg000:000B start endp ; sp = -4

seg000:000B

seg000:000B seg000 ends

Если попытаться создать более одной точки с идентичными именами, то IDA добавит к последнему знак прочерка и номер имени, начиная с нуля.

AddEnrtyPoint(2,0x10009,”NewEntryPoint”,0);

seg000:0000 public start

seg000:0000 start proc near

seg000:0000 push ax

seg000:0001 mov cx, 1

seg000:0004 shl cx, 1

seg000:0006

seg000:0006 public NewEntryPoint

seg000:0006 NewEntryPoint:

seg000:0006 add sp, cx

seg000:0008 push ax

seg000:0009

seg000:0009 public NewEntryPoint_0

seg000:0009 NewEntryPoint_0:

seg000:0009 add sp, cx

seg000:000B retn

seg000:000B start endp ; sp = -4

seg000:000B

seg000:000B seg000 ends

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

Message(“0x%X \n”,

AddEnrtyPoint(2,0x10009,”MyEntryPoint”,0)

);

0x0

Допускается создание точки входа без имени. При этом она не будет отображена на экране, но появится в списке точек входа.

AddEntryPoint(1,0x122C6,””,1);

seg000:22C0 public start

seg000:22C0 start proc near

seg000:22C0 call sub_0_22DD

seg000:22C3 call sub_0_2325

seg000:22C6 call sub_0_235B

seg000:22C9 call sub_0_2374

seg000:22CC call sub_0_23B6

seg000:22CF call sub_0_23F8

Если по указанному адресу уже существует метка (или функция), то она будет переименована.

seg000:002A sub_0_2A proc near

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

seg000:0036 sub_0_2A endp

AddEntryPoint(8,0x1002A,”EntryPoint”,0);

seg000:002A public EntryPoint

seg000:002A EntryPoint proc near

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

seg000:0036 EntryPoint endp

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

AddEntryPoint(9,0x1002A,”NewEntryPoint”,0);

seg000:002A

seg000:002A public NewEntryPoint

seg000:002A NewEntryPoint proc near ; EntryPoint

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

seg000:0036 NewEntryPoint endp

Если флаг makecode будет установлен в единицу то IDA при необходимости формирует функцию и дизассемблирует инструкции.

seg000:002A db 0BEh

seg000:002B db 11h

seg000:002C db 2

seg000:002D db 0E8h

seg000:002E db 0ADh

seg000:002F db 0

seg000:0030 db 0BEh

seg000:0031 db 0BAh

seg000:0032 db 2

seg000:0033 db 0E8h

seg000:0034 db 0A7h

seg000:0035 db 0

seg000:0036 db 0C3h

AddEntryPoint(1,0x1002A,”MyEntryPoint”,1);

seg000:002A

seg000:002A public MyEntryPoint

seg000:002A MyEntryPoint proc near

seg000:002A mov si, 211h

seg000:002D call sub_0_DD

seg000:0030 mov si, 2BAh

seg000:0033 call sub_0_DD

seg000:0036 retn

seg000:0036 MyEntryPoint endp

Операнд

Пояснения

ordinal

Ординал функции

Ea

Линейный адрес конца команды

Name

Имя точки входа

makecode

==makecode

Пояснения

==1

Преоброзовывать undefine в инструкции

==0

Не переобразовывать undefine в инструкции

Return

Завершение

Пояснения

1

Успешно

0

Ошибка

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