Сейчас на форуме: tyns777, zds, JustLife, 2nd, morgot, Rio (+4 невидимых)

 eXeL@B —› Программирование —› Определение функций импорта
Посл.ответ Сообщение

Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 09:00 · Поправил: s0l
· Личное сообщение · #1

Здравствуйте, подскажите пожалуйста, есть ли способ найти в PE файле все вызову функций импорта (что-то типа Search for all intermodular calls в OllyDbg), т.е. найти примерно такое:
Code:
  1. 00406418   $- FF25 C4924500 jmp     dword ptr ds:[<&kernel32.GetProc>; kernel32.GetProcAddress

Сразу бы хотелось оговориться, что бинарный поиск FF25 и FF15 не подходит, надеюсь сами понимаете почему




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 12 августа 2009 09:35 · Поправил: BoRoV
· Личное сообщение · #2

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

-----
Лучше быть одиноким, но свободным © $me




Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 09:43
· Личное сообщение · #3

BoRoV пишет:
прочесть с легкостью с таблицы импорта

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




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 12 августа 2009 09:44
· Личное сообщение · #4

BoRoV пишет:
учи структуру пе-файла, можно это прочесть с легкостью с таблицы импорта

Я вот так понял, что ему именно вызовы из кода нужны. Олька, скорее всего, делает это путем парсинга кода на предмет конструкций jmp dword ptr ds:[адрес из импорта] и call то-же не ст0ит забывать.

-----
invoke OpenFire




Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 09:46
· Личное сообщение · #5

Ice-T
+1 ты все правильно понял.
Так это возможно как-нибудь реализовать?




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 12 августа 2009 09:47
· Личное сообщение · #6

s0l пишет:
Сразу бы хотелось оговориться, что бинарный поиск FF25 и FF15 не подходит, надеюсь сами понимаете почему

Я не понимаю - почему?

-----
invoke OpenFire





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 12 августа 2009 09:51 · Поправил: BoRoV
· Личное сообщение · #7

пиши скрипт, а внем пиши, кажется так:
Code:
  1. findop <адрес начала поиска>, #FF25#(#FF15#)


-----
Лучше быть одиноким, но свободным © $me




Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 09:52
· Личное сообщение · #8

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



Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 09:54
· Личное сообщение · #9

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




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 12 августа 2009 09:56
· Личное сообщение · #10

s0l пишет:
Потому, что в коде может встретиться такая же структура, но никаким образом не относящаяся к импорту.

дык чекай адрес назначения

-----
invoke OpenFire




Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 12 августа 2009 10:03
· Личное сообщение · #11

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

. . .
mov esi, [LoadIconW]
. . .
. . . // инструкции, не затрагивающие esi
. . .
call esi
. . .
. . . // инструкции, не затрагивающие esi
. . .
call esi
. . .

активно генерируемые vc++



Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 10:05 · Поправил: s0l
· Личное сообщение · #12

Ice-T
Что-то мне даже не приходил в голову такой вариант, спасибо за подсказку. Буду пробовать...

p.s.: если есть другой выход, пожалуйста сообщите =)

_ruzmaz_
Для начала бы реализовать самое простенькое, а потом можно и дальше идти =)




Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 12 августа 2009 10:09 · Поправил: Ice-T
· Личное сообщение · #13

Дизасмит и анализировать. Иначе - хз как.

upd:
Хотя есть еще вариант взять процесс под отладку.

-----
invoke OpenFire




Ранг: 20.8 (новичок), 7thx
Активность: 0.010.02
Статус: Участник

Создано: 12 августа 2009 10:58
· Личное сообщение · #14

все популярные линкеры создают непрерывный массив адресов импорта, сосредоточенный в одной секции. Главное найти начало и ее конец, а это очень просто



Ранг: 60.6 (постоянный), 20thx
Активность: 0.070
Статус: Участник

Создано: 12 августа 2009 11:19
· Личное сообщение · #15

Ice-T пишет:
взять процесс под отладку

В моем случае это не приемлимо.

int_256
мне не нужны адреса импорта



Ранг: 114.8 (ветеран), 41thx
Активность: 0.10
Статус: Участник

Создано: 12 августа 2009 11:22
· Личное сообщение · #16

Можно использовать то что ольга отдизассемблит и проанализирует - например в файл сохранить и там искать нужные вызовы (или плагин написать)




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 12 августа 2009 12:46
· Личное сообщение · #17

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




Ранг: 568.2 (!), 465thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 12 августа 2009 13:33 · Поправил: ClockMan
· Личное сообщение · #18

Ну так в ольке есть же функция Find references, в окне дампа ставишь Long>аdress ищешь табличку,она будет иметь такой вид
00413084 >7C801E1A kernel32.TerminateProcess
00413088 >7C801EF2 kernel32.GetStartupInfoA
0041308C >7C809832 kernel32.InterlockedCompareExchange
00413090 >7C802446 kernel32.Sleep
00413094 >7C80981E kernel32.InterlockedExchange
00413098 >7C80AC6E kernel32.FreeLibrary
0041309C >7C80AEDB kernel32.LoadLibraryW
004130A0 >7C80B465 kernel32.GetModuleFileNameW
004130A4 >7C90FE01 ntdll.RtlGetLastWin32Error
004130A8 >7C8449FD kernel32.SetUnhandledExceptionFilter

км>Find references
и оля ищет адреса вызова этой апи

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 12 августа 2009 13:45
· Личное сообщение · #19

ClockMan, на сколько я понимаю - ему нужна своя программная реализация подобного.

-----
invoke OpenFire




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 12 августа 2009 14:51
· Личное сообщение · #20

Я вот так и не понял, чего требуется:

1) На известную в файле АПИ-шку найти перечень мест где она дергается ?
или:
2) Выдать перечень всех мест, где дергается какая-либо АПИ-шка ?

-----
My love is very cool girl.




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 12 августа 2009 15:02
· Личное сообщение · #21

Если второе, то :
1. Составить массив Описателей (НАЧАЛО, КОНЕЦ) всех ИАТов
2. Начиная с начального адреса поиска ищешь очередную FF25, FF15 + mov esi,offs / call esi и потом адресок смотришь в описателях, если попало, значит - АПИ-шко

-----
My love is very cool girl.





Ранг: 126.7 (ветеран)
Активность: 0.140
Статус: Участник
#CCh

Создано: 12 августа 2009 15:05
· Личное сообщение · #22

Ну на самом деле алгоритм не много посложнее будет.. Но предоставим это автору)

-----
invoke OpenFire





Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 12 августа 2009 15:31
· Личное сообщение · #23

* парсишь таблицу импорта файла и составляешь список адресов всех используемых в проге апи ф-ций, а также составляешь диапазон адресов библиотек (это важно, т.к. адрес в коде может указывать на FuncAddr+x)
* определяешь секции с кодом
* берёшь двиг дизасма типа hde и идёшь по коду, обращая внимание на инструкции типа
mov reg32,addr, после чего ищешь call/push/jmp reg32
push addr
jmp [addr]
call [addr]

cверяешь addr со списком адресов ф-ций

далее понятно, я думаю

-----
EnJoy!




Ранг: 271.5 (наставник), 12thx
Активность: 0.150
Статус: Участник
Packer Reseacher

Создано: 12 августа 2009 16:04
· Личное сообщение · #24

>>(это важно, т.к. адрес в коде может указывать на FuncAddr+x)
важный нюанс! +1

-----
My love is very cool girl.



 eXeL@B —› Программирование —› Определение функций импорта
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати