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

 eXeL@B —› Программирование —› Вопрос по получению импорта
. 1 . 2 . >>
Посл.ответ Сообщение


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

Создано: 24 января 2009 16:54
· Личное сообщение · #1

Щас пишется прога, одной с ее ф-ий есть получение импорта. Столкнулись с такой проблемой, что при работе с прогами упаковаными WinUPack'ом 0.39 идет не коректное получение импорта, я подключил к этой проблеме знакомого, после нескольких дней иследования, получили заключение, что в прогах упакованых WinUPack'ом 0.39 импорта вобще нет. Тогда интересно как его получают тот же самый PEiD или DiE.

Где истина?

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





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 24 января 2009 17:06 · Поправил: daFix
· Личное сообщение · #2

Одна поправка - импорт я не несколько дней смотрел, а минут 10. И вторая поправка - я только вчера вечером взялся помогать. Этот знакомый - это я
Натолкните на мысль...

-----
Research For Food





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

Создано: 24 января 2009 17:08
· Личное сообщение · #3

кури доки по пе формату и директории импорта

-----
[nice coder and reverser]





Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 24 января 2009 17:19 · Поправил: coderess
· Личное сообщение · #4

мб стоит кусок кода привести, который ответственен за получения импорта?
ЗЫ: динамически API подгружаются, через, LoadLibrary/GetProcAddress

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





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

Создано: 24 января 2009 17:45
· Личное сообщение · #5

Импорта не может не быть. Сейчас практически ни 1 программа не работает без функций импорта. Значит невосстановление их грозит неработоспособностью дампа. Либо я чо-то не понял, и вопрос не в восстановлении импорта, а просто чтении его из пе-файла (через пе-тулз тогда прогони). Сформулируй вопрос конкретно и кодес дай.




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

Создано: 24 января 2009 17:55
· Личное сообщение · #6

Archer пишет:
чтении его из пе-файла

имено, нужно его прочесть с файла

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





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 24 января 2009 17:56
· Личное сообщение · #7

Опишу ситуацию - вопрос заключается именно в получении импорта из стаба пакера. Это анализатор
файлов, который читает импорт из файла. Видать стаб упака работает без импорта - бинарно находит
функции LoadLibrary/GetProcAddress и с их помощью динамически подгружает все остальные функции.
Пните, если я не прав

-----
Research For Food




Ранг: 1045.7 (!!!!), 31thx
Активность: 0.570
Статус: Участник

Создано: 24 января 2009 18:07
· Личное сообщение · #8

daFix пишет:
Видать стаб упака работает без импорта - бинарно находит
функции LoadLibrary/GetProcAddress

;) В табличке упака как раз только эти функи и есть




Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 24 января 2009 18:36
· Личное сообщение · #9

Спасибо, тихий гром тоже уже тыкнул носом... Остальсь только подумать что же с хидером там. Мож кто сталкивался?

-----
Research For Food





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

Создано: 24 января 2009 18:52 · Поправил: Hellspawn
· Личное сообщение · #10

daFix пишет:
Спасибо, тихий гром тоже уже тыкнул носом... Остальсь только подумать что же с хидером там. Мож кто сталкивался?


а что с ним не так то?
для примера возьмём файл WinUpackR 0.39
Code:
  1. DataDirectory[1].VirtualAddress  := 0001E1EE
  2. DataDirectory[1].Size            := 00000014
  3. ...
  4. ImageImportDescriptor:
  5. 0041E1EE  00 00 00 00 00 00 00 00 00 00 00 00 | 02 00 00 00
  6. 0041E1FE  E8 11 00 00 | 00 00 00 00
  7. ...
  8. Name:
  9. 00400002  4B 45 52 4E 45 4C 33 32 2E 44 4C 4C 00        KERNEL32.DLL.
  10. ...
  11. FirstThunk:
  12. 004011E8: 28 00 00 00 | BE 00 00 00
  13. ...
  14. Hint + Api:
  15. 00400028  0B 01 4C 6F 61 64 4C 69 62 72 61 72 79 41 00     ..LoadLibraryA.
  16. 004000BE  00 00 47 65 74 50 72 6F 63 41 64 64 72 65 73 73  ..GetProcAddress

ну как-то так

-----
[nice coder and reverser]





Ранг: 529.0 (!), 110thx
Активность: 0.290.04
Статус: Участник
5KRT

Создано: 24 января 2009 19:18
· Личное сообщение · #11

Hellspawn
Продуктивно! Спасибо)) Сейчас покопаю в чём косяк. Кстати, CFF Explorer тоже не видет там импорта

-----
Research For Food





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

Создано: 24 января 2009 22:38
· Личное сообщение · #12

ключевое слово: выравнивание
перепиши свой преобразователь виртуальных адресов в файловые офсеты с учётом выравнивания!
тогда и импорт увидишь

тема поднималась неоднократно

-----
EnJoy!





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

Создано: 24 января 2009 22:41
· Личное сообщение · #13

если файл мапится с флагом SEC_IMAGE то перевод в оффсеты не нужен

-----
[nice coder and reverser]





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

Создано: 24 января 2009 22:51 · Поправил: borov
· Личное сообщение · #14

Jupiter пишет:
перепиши свой преобразователь виртуальных адресов в файловые офсеты

имено здесь и был баг, переписал щас нормально

Hellspawn пишет:
если файл мапится с флагом SEC_IMAGE то перевод в оффсеты не нужен

не знал, запомню

спс всем, но тему пока закрывать не буду, вдруг еще что-то найду (все мы допускаем ошиПки)

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





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

Создано: 28 января 2009 17:27
· Личное сообщение · #15

borov пишет:
Jupiter пишет:
перепиши свой преобразователь виртуальных адресов в файловые офсеты
имено здесь и был баг, переписал щас нормально

да, нормально но не все, потом начило падать на экспорте файлов накрытых PECompact'ом, но ...
Hellspawn пишет:
если файл мапится с флагом SEC_IMAGE то перевод в оффсеты не нужен

вот это спасло, вобще прелесть

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





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

Создано: 28 января 2009 20:57
· Личное сообщение · #16

borov пишет:
вот это спасло, вобще прелесть


на самом деле написать корректную rvatofileoffset и обратно не так уж и сложно

-----
[nice coder and reverser]




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

Создано: 28 января 2009 21:10
· Личное сообщение · #17

Хороший пример RVAToOffset приведен в статье про написание UnScrambler для UPX - www.azsoft.nm.ru/art/n0.htm.

Code:
  1. function RVAToOffset(Header: PIMAGENTHEADERS;
  2.                     FileMap: pointer;
  3.                     RVA: dword):dword;
  4. var
  5.   Sec: PIMAGESECTIONHEADER;
  6. begin
  7.   //ImageRvaToSection укажет на секцию, которой принадлежит RVA.
  8.   Sec:=ImageRvaToSection(Header, FileMap, RVA);
  9.   Result:=RVA - Sec.VirtualAddress + Sec.PointerToRawData;
  10. end;

Только надо подключить imagehlp.pas))




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

Создано: 28 января 2009 21:18
· Личное сообщение · #18


это прокатит на всем кроме FSG 2.0 и WinUPack 0.39

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





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

Создано: 28 января 2009 21:25
· Личное сообщение · #19

SVIN95

нету выравнивания =\ ужс.

-----
[nice coder and reverser]





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

Создано: 30 января 2009 11:46
· Личное сообщение · #20

Вопрос скорее к Hellspawn'у, но если еще кто-то знает выслушаю, почему файлы под некоторыми пакерами не хотят мапится с параметром SEC_IMAGE
Code:
  1. hMap := CreateFileMapping(hFile, nil, PAGE_READONLY or SEC_IMAGE, 0, 0, nil);
  2. после этого hMap = 0


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





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

Создано: 30 января 2009 13:13
· Личное сообщение · #21

гетластеррор что возвращает?

-----
[nice coder and reverser]





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

Создано: 30 января 2009 14:15
· Личное сообщение · #22

ERROR_BAD_EXE_FORMAT

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




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

Создано: 30 января 2009 16:02
· Личное сообщение · #23

Hellspawn пишет:
если файл мапится с флагом SEC_IMAGE то перевод в оффсеты не нужен


А hMap надо прибавлять?




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

Создано: 30 января 2009 16:07
· Личное сообщение · #24

SVIN95 пишет:
А hMap надо прибавлять?


конечно, это же база, по который смаплен файл.

borov пишет:
ERROR_BAD_EXE_FORMAT


ой хз, походу обламывается CreateSection а вот почему не знаю.

-----
[nice coder and reverser]




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

Создано: 30 января 2009 16:16 · Поправил: SVIN95
· Личное сообщение · #25

Hellspawn
Я что-то туплю. Поставил:
Code:
  1. LPVOID hMap = MapViewOfFile(hFileMapping, FILE_MAP_WRITE | SEC_IMAGE, 0, 0, 0); //Это на С++

но все-равно приходится конвертить в оффсеты (если RVA подсунуть вылетит exception). Что не так?




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

Создано: 30 января 2009 16:27
· Личное сообщение · #26

SVIN95

есть не много:
Code:
  1. PE:=CreateFile(...);
  2. FM:=CreateFileMapping(PE, nil,PAGE_READONLY or SEC_IMAGE, 0, MEMSZ, nil);
  3. MEMPTR:=MapViewOfFile(FM,FILE_MAP_READ, 0, 0, MEMSZ);


-----
[nice coder and reverser]




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

Создано: 30 января 2009 16:36 · Поправил: SVIN95
· Личное сообщение · #27

Hellspawn
Ну у меня и стояло:
Code:
  1. hFile = CreateFile(OpenDialog1->FileName.c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
  2. HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, 0, NULL);
  3. LPVOID hMap = MapViewOfFile(hFileMapping, FILE_MAP_WRITE | SEC_IMAGE, 0, 0, 0);

Я тебе тогда только 1 строку кинул
Почему-то не работает... (с оффсетами норм, а с RVA...)




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

Создано: 30 января 2009 16:44
· Личное сообщение · #28

ты действительно не видишь разницы между моим кодом и твоим?? ))) SEC_IMAGE - у тебя не там стоит.

-----
[nice coder and reverser]




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

Создано: 30 января 2009 16:48
· Личное сообщение · #29

Блин, действительно!
Спасибо.




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

Создано: 30 января 2009 16:53 · Поправил: borov
· Личное сообщение · #30

SVIN95, SEC_IMAGE нужно добавлять не MapViewOfFile, а в CreateFileMapping

add:
опоздал

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



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


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