Сейчас на форуме: Rio, -Sanchez-, artyavmu, CDK123 (+7 невидимых)

 eXeL@B —› Софт, инструменты —› Imprec, IAT autosearch. Как оно работает?
Посл.ответ Сообщение

Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 14 июня 2012 16:26
· Личное сообщение · #1

Кто-нибудь знает алгоритм? Сорцов у меня нет, а распаковывать и смотреть что там MackT наваял - особо желанием не горю.

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 14 июня 2012 17:11
· Личное сообщение · #2

Хз что там наваяли, но как варианты:
1. Сканить дата секции на группу офсетов.
2. Трейсить до первого импа
3. Сканить секцию кода на call offs

-----
старый пень




Ранг: 189.9 (ветеран), 334thx
Активность: 0.30
Статус: Участник

Создано: 14 июня 2012 17:17
· Личное сообщение · #3

Сорцы на васме лежат, но не полные вроде.

| Сообщение посчитали полезным: TLN


Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 14 июня 2012 17:19 · Поправил: Flint
· Личное сообщение · #4

Hellsp@wn делал подобную тулзу Easy import finder
http://exelab.ru/f/action=vthread&forum=1&topic=8381

-----
Nulla aetas ad discendum sera





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 14 июня 2012 17:35
· Личное сообщение · #5

Hexxx
а сырки scylla не катят https://github.com/NtQuery/Scylla ?

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 14 июня 2012 17:41
· Личное сообщение · #6

Flint давно было, я уже не помню как оно работает, исходники вроде должны быть.

r_e пишет:
Хз что там наваяли, но как варианты:
1. Сканить дата секции на группу офсетов.


вроде как раз вот так

-----
[nice coder and reverser]




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 14 июня 2012 18:12 · Поправил: Hexxx
· Личное сообщение · #7

ajax пишет:
а сырки scylla не катят

Scylla ищет дизасмом опкоды вызова или прыжка через память, т.е. FF 15 или FF 25. Это наверно именно то что делает imprec. Судя потому как оно ошибается

Hellspawn пишет:
вроде как раз вот так

т.е. если в определенном куске памяти скопилось какое-то количество адресов за пределами модуля, то это IAT?

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 14 июня 2012 19:36
· Личное сообщение · #8

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

-----
старый пень





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 14 июня 2012 19:39
· Личное сообщение · #9

Hexxx
импрек находил таблицу импорта и сверял каждый оффсет в ней (+4) с оффсетами загруженных либ. вроде ничего более

-----
От многой мудрости много скорби, и умножающий знание умножает печаль





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 14 июня 2012 23:19
· Личное сообщение · #10

Hexxx ну если грубо, то да:

Code:
  1. // фyнкция проверяет принадлежность адреса какому-либо модулю 
  2. Function FastCheckAddressIAT(dwAddress:DWORD):dword;
  3. var
  4.   nn:dword; // счётчик
  5. begin
  6.   result:=0;
  7.     If (dwAddress > modules.minb) and (dwAddress < modules.maxb) then
  8.     For nn:=1 to modules.count do
  9.       If (dwAddress > modules.modul[nn].base) and (dwAddress < (modules.modul[nn].base + modules.modul[nn].size)) then
  10.       begin
  11.         result:=1;
  12.         break;
  13.       end;
  14. end; // END FastCheckAddressIAT

тут просто проверяется вхождения адреса, хоть в какой либо модуль, можно дальше можно тут же проверить, что это именно кодовая секция и т.д.

-----
[nice coder and reverser]




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 15 июня 2012 00:20 · Поправил: Hexxx
· Личное сообщение · #11

Это понятно, но как отличить от глобальных переменных хранящих адрес экспортируемой функции в другом модуле? Импорты бывают разные
Например берем самый худший вариант: изначально импортируется в бинарь только одна функция. Дальше бинарь накрыт протектором херящим импорт. Как найти IAT для такого бинаря?

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 590.4 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 15 июня 2012 01:50
· Личное сообщение · #12

Hexxx
Универсально - никак.
Хучим LoadLibrary, GetModuleHandle, GetProcAddress и смотрим что протектор резолвит. Хотя, он может все сделать сам, не обращаясь к системе.

-----
старый пень





Ранг: 238.8 (наставник), 67thx
Активность: 0.20
Статус: Участник
CyberHunter

Создано: 15 июня 2012 01:57
· Личное сообщение · #13

Hexxx пишет:
Например берем самый худший вариант: изначально импортируется в бинарь только одна функция. Дальше бинарь накрыт протектором херящим импорт. Как найти IAT для такого бинаря?


У бинаря найдется адрес - xxxx, который будет попадать в адресное пространство какого-то модуля (скорее всего в кодосекцию). У модуля будут экспортируемые функции - yyyy. Если xxxx = yyyy, значит скорее всего это импорт.

-----
Nulla aetas ad discendum sera




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 15 июня 2012 11:11
· Личное сообщение · #14

r_e пишет:
Хучим LoadLibrary, GetModuleHandle, GetProcAddress и смотрим что протектор резолвит.

Я рассматриваю вариант импрека, когда мы смотрим на уже запущеный процесс. Так что не судьба...

-----
Реверсивная инженерия - написание кода идентичного натуральному




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 15 июня 2012 11:12
· Личное сообщение · #15

Flint пишет:
Если xxxx = yyyy, значит скорее всего это импорт.

Перечитай пример, и поймешь что далеко не факт.

-----
Реверсивная инженерия - написание кода идентичного натуральному





Ранг: 990.2 (! ! !), 380thx
Активность: 0.680
Статус: Модератор
Author of DiE

Создано: 15 июня 2012 11:35
· Личное сообщение · #16

а никак, для таких случаев вводим интерактивность

-----
[nice coder and reverser]





Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 15 июня 2012 11:56 · Поправил: DillerInc
· Личное сообщение · #17

Кстати вот, но это было давно и неправда

-----
the Power of Reversing team




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 15 июня 2012 13:48
· Личное сообщение · #18

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

-----
Реверсивная инженерия - написание кода идентичного натуральному


| Сообщение посчитали полезным: mak


Ранг: 283.6 (наставник), 56thx
Активность: 0.130
Статус: Участник
Author of GeTaOEP

Создано: 16 июня 2012 14:01
· Личное сообщение · #19

Hexxx пишет:
плагин к IDA, чтобы можно было импорт по полным дампам памяти восстанавливать

...а можно подробнее о том, как это выглядит?

-----
the Power of Reversing team





Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 16 июня 2012 17:21
· Личное сообщение · #20

DillerInc
дамп всех регионов памяти .exe, типа как region dump в lordpe/petools. дальше прогон импорта по адресам сиих регионов. имхо.
PS: когда-то в одной группе была мысля сделать анпакер (exe, конечно, большой бы получался) на основе полного дампа регионов - но, много тонкостей, руки не дошли.

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 481.4 (мудрец), 109thx
Активность: 0.180
Статус: Участник
Тот самый :)

Создано: 16 июня 2012 21:35 · Поправил: Hexxx
· Личное сообщение · #21

DillerInc пишет:
а можно подробнее о том, как это выглядит?

Дампы которые делает windbg, process explorer, task manager и т.д. можно грузить в IDA. Дамп чем хорош:
1) он содержит ВСЮ память процесса
т.е. не бывает такой ситуации когда у тебя переходники ведут в протектор, а ты забыл их сдампить.
2) все DLL находятся на одних и тех же адресах не смотря на ASLR.
ибо это же полный дамп памяти процесса
3) протекторы не блокируют создание таких дампов
Да и не смогут Я могу апаратно рушить всю винду (BSOD), и забирать инфу о процессе из полного дампа физической памяти. Т.е. невозможно отличить, кто спровоцировал дамп.
4) в дампе есть "контекст" известно какой процесс и какой поток что делал.
Используя эмуляторы можно сколько угодно имитировать всевозможные вызовы и смотреть, что будет.

Пока что я хочу сделать прогамму минимум: написать плагин к IDA, чтобы сохранять импорт в текстовый файл в формате импрека.
А там может допилю до полноценной тулзы для получения полностью восстановленного exe из IDA.

Как это будет происходить восстановление импорта. Плагин находит IAT и показывает какие из указателей в нем в какой экспорт сейчас указывают. Будет как в импреке дерево и видно где чистый thunk, а где в протектор смотрит. Дальше можно, используя какие угодно свои IDC/python скрипты или плагины к IDA, менять адреса в IAT на правильные. Т.е. патчить базу IDA, так чтобы IAT выглядела коректно. Когда все будет готово можно будет сохранить импорт как текстовый файл в формате импрека, или даже сохранить сразу восстановленый бинарь.

-----
Реверсивная инженерия - написание кода идентичного натуральному



 eXeL@B —› Софт, инструменты —› Imprec, IAT autosearch. Как оно работает?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати