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

 eXeL@B —› Протекторы —› Как реализовать восстановление импорта программно?
Посл.ответ Сообщение

Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2006 15:07 · Поправил: BUGOR
· Личное сообщение · #1

Здраствуйте, уважаемый all. Прошу у вам помощи. Решился-таки написать динамический унпакер, чисто для себя, для повышения опыта, выбрал FSG.
Вообщем реализовал всё, до OEP дохожу, там брякаюсь, делаю дамп, правлю таблицу секций, заголовки и встал я на импорте. Как программно восстановить импорт? Нашёл место где FSG заполняет IAT, но я видать туговатый, не могу догнать, что мне с этим делать, хотя довольно отчётливо представляю как в программе устроен импорт, но вот как его восстановить понять не могу, прошу помочь.
В аттач кладу распакованный, запакованный файлы и дамп, который делает мой унпакер.

Так же, место где FSG заполняет импорт находится по адресу: 004001C2

Не могу приаттачить: fearus.narod.ru/ASMmd5.rar

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




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

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

Как вариант-некоторые анпакеры юзают библиотеку от ImpRec, может её заюзать.



Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

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

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




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

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

padonak ты реально идиот.
BUGOR если действительно хочешь разобраться пиши в личку, помогу, но только если действительно есть желание, иначе лучше не расстаивай меня.

-----
Yann Tiersen best and do not fuck





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

Создано: 12 июня 2006 16:30 · Поправил: Hellspawn
· Личное сообщение · #5

как-то давно, тоже писал нечто подобное и нашёл полезное в нете
держи, разбирайся....

76ca_12.06.2006_CRACKLAB.rU.tgz - rebIT11-SRC.zip

-----
[nice coder and reverser]




Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2006 16:34
· Личное сообщение · #6

Hellspawn, спасибо, буду смотреть. Вопрос актуален, кто как может объясните, буду очень благодарен.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 июня 2006 16:45 · Поправил: PE_Kill
· Личное сообщение · #7

if dll<>curren dll
then
begin
invoke paste_null
invoke read_entry
end;

Пойдет?

-----
Yann Tiersen best and do not fuck




Ранг: 15.3 (новичок)
Активность: 0.020
Статус: Участник

Создано: 12 июня 2006 16:45
· Личное сообщение · #8

где уже не помню попался исходник импрек.длл
древний правда

b3e3_12.06.2006_CRACKLAB.rU.tgz - imprecdll.7z



Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2006 16:50
· Личное сообщение · #9

PE_Kill, или я не понимаю тонкий крэкерский юмор или чё, но нахрена мне тут кидать понты? Я попросил по-человечески, ну ответь ты по-человечески, ну коли не хочешь помогать, лучше не начинай вообще.

Valenok Pirojkov, спасибо большое, буду разбираться.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 12 июня 2006 17:18
· Личное сообщение · #10

я могу конечно выложить весь исходник на 1200 строк, но если ты не понимаешь элементарного, то о чем речь?

-----
Yann Tiersen best and do not fuck




Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 12 июня 2006 17:34 · Поправил: BUGOR
· Личное сообщение · #11

PE_Kill, ты гуру спору нет, и твой экзамен мне в личке очень понравился, да только я тебе сказал, что у меня есть желание и если я не понимаю как восстановить импорт, то это не значит, что я не смогу это понять, для тебя это элементарно, да, может быть это дейтсвительно элементарно, я это пойму, когда смогу сделать это. То, чего ты достиг в этой области никто не ставит под сомнение, но не надо считать меня сопляком, который пришёл просить научить его хэкать и выносить приговоры типа "но если ты не понимаешь элементарного, то о чем речь?", поэтому давай закончим этот бессмысленный спор и каждый пойдёт своей дорогой, если ты можешь помочь в чём-то, то помоги, я буду тебе благодарен и возможно в чём-то смогу помочь тебе, если же не хочешь мне помогать, то просто проигнорируй этот топик.



Ранг: 14.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июня 2006 12:08
· Личное сообщение · #12

Было бы неплохо реализовать задуманное в виде плагина к ollydbg...

Попроси FEUERRADER-а, мож поможет...



Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 июня 2006 12:39
· Личное сообщение · #13

Что задуманное? Восстановление импорта? Так уже реализовано, например в плагине OllyDump



Ранг: 14.9 (новичок)
Активность: 0.020
Статус: Участник

Создано: 13 июня 2006 13:07
· Личное сообщение · #14

BUGOR пишет:
Так уже реализовано, например в плагине OllyDump

Реализация-то в ollydbg есть... но не всегда восстанавливает, например, у FSG 2.0.
Если твоя реализация будет восстанавливать импорт FSG - скорее всего и у большинства пакеров будет "нормально" восстанавливать импорт ;)



Ранг: 186.8 (ветеран)
Активность: 0.040
Статус: Участник

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

Я клепал изврата ради свою реализацию примерно следущим способом:
1) Находил границы подгруженных либ;
2) брал адрес из IAT и смотрел чьей либе он принадлежит. Дальше вручную разбирал экспорт этой либы и определял имя или ординал.
3) добавлял его в таблицу импорта.

Сложного ничего, а попрактиковаться полезно=)



Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 июня 2006 14:22 · Поправил: BUGOR
· Личное сообщение · #16

MoonShiner, скажи, как ты определял нижнюю границу IAT?
Да, и вроде бы была апи которая по адресу функции возвращал её имя?
И ещё Как определить имя библиотеки, которой принадлежит данная фукнкция(допустим нам известны её имя и адрес, а imagebase этой библиотеки неизвестен)?



Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 13 июня 2006 15:17 · Поправил: BUGOR
· Личное сообщение · #17

Так, со всем вроде разобрался, спасибо людям с никами nice и UsAr, оч помогли. Осталось понять как определить границы IAT, как рациональней и более универсальней сделать это?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

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

Посмотрел я твою прогу. Короче так. По адресу 004001C2 LODS DWORD PTR DS:[ESI]. Так вот там немного извратная директория импорта. По адресу из ESI лежит массив укзателей на имена АПИ. По адресу ESI+4 лежит указатель на имя DLL. Всё можешь ребилдить импорт. Размер директории импорта ревен числу ImageImportDescriptors*0x14 + 0x14. Мутишь новый массив из IIDs, FirstThunks которого получаешь из ESI пишешь его в новую секцию (если будишь отрезать секцию пакера), пересчитываешь размер и пишешь в Import Directory RVA адрес первого IID, в Size пересчитаный размер

-----
Yann Tiersen best and do not fuck





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 14 июня 2006 07:54
· Личное сообщение · #19

Держи сорс, думаю дальше сам разберешься. Дампить надо на обработке импорта.

6582_14.06.2006_CRACKLAB.rU.tgz - Project1.dpr

-----
Yann Tiersen best and do not fuck




Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

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

PE_Kill, большое спасибо. Но ты знаешь, там если брякнутся на адресе LODS DWORD PTR DS:[ESI], то в esi будет указатели на адреса функций, а в esi+4 указатели на имена длл, так вот если от всех этих VA (на имена функций) отнять ImageBase+1, то мы получим offset'ы на имена функций, после чего заменяем все FFFFFFFF и 7FFFFFFF в этом массиве указателей на нули, это будут границы массивов FirstFunk. Далее из той таблицы, что в [ESI] от первого значение отнимаем ImageBase, это будет ни что иное как IMAGE_IMPORT_DESCRIPTOR.FirstFunk, от значения [ESI+4] тоже отнимаем ImageBase и получаем IMAGE_IMPORT_DESCRIPTOR.Name(RVA). Таким образом можно не добавлять новую секцию, а записать импорт на тоже место, где он и был, только обработав FirstFunk и Сгенерив IID на основе Таблицы в [ESI].



Ранг: 23.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 14 июня 2006 12:00
· Личное сообщение · #21

А, да ты точно так же сделал, только с добавлением секции. Вот чё-то мне секцию добавлять нехочется, дамп и так распирает.




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 14 июня 2006 12:07
· Личное сообщение · #22

Возможно, это я за пару минут накидал, особо не смотрел, что там да как, ты же просил подсказку, я тебе ее дал. Кстати границы FirstThunk только 7FFFFFFF, а FFFFFFFF это конец IAT, но вместо него тоже надо 0 втыкать. Удачи.

PS Проверь, как FSG с импортом по ординалам работает.

-----
Yann Tiersen best and do not fuck



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


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