Хай. Изучая импортирование функций наткнулся на прикольную ситуацию, в связи с чем совсем завис )) Вот дамп на то что указывает: - #define IMAGE_DIRECTORY_ENTRY_IAT и -#define IMAGE_DIRECTORY_ENTRY_IMPORT Код (Text): .00402000: 7A 20 00 00¦8E 20 00 00¦6C 20 00 00¦00 00 00 00 z О l .00402010: AE 20 00 00¦00 00 00 00¦54 20 00 00¦00 00 00 00 о T .00402020: 00 00 00 00¦A0 20 00 00¦00 20 00 00¦64 20 00 00 а d .00402030: 00 00 00 00¦00 00 00 00¦BC 20 00 00¦10 20 00 00 - > .00402040: 00 00 00 00¦00 00 00 00¦00 00 00 00¦00 00 00 00 .00402050: 00 00 00 00¦7A 20 00 00¦8E 20 00 00¦6C 20 00 00 z О l .00402060: 00 00 00 00¦AE 20 00 00¦00 00 00 00¦80 00 45 78 о А Ex .00402070: 69 74 50 72¦6F 63 65 73¦73 00 09 01¦47 65 74 4D itProcess 0OGetM .00402080: 6F 64 75 6C¦65 48 61 6E¦64 6C 65 41¦00 00 1F 01 oduleHandleA ЎO .00402090: 47 65 74 50¦72 6F 63 41¦64 64 72 65¦73 73 00 00 GetProcAddress .004020A0: 6B 65 72 6E¦65 6C 33 32¦2E 64 6C 6C¦00 00 9D 01 kernel32.dll ЭO .004020B0: 4D 65 73 73¦61 67 65 42¦6F 78 41 00¦75 73 65 72 MessageBoxA user .004020C0: 33 32 2E 64¦6C 6C 00 00¦00 00 00 00¦00 00 00 00 32.dll Прошу обратить внимание на поля IMAGE_IMPORT_DIRECTORY.OriginalFirstThunk и IMAGE_IMPORT_DIRECTORY.FirstThunk. Все так как надо и как должно быть в идеале. Пробую извращаться: - обнуляю поля IMAGE_IMPORT_DIRECTORY.OriginalFirstThunk и вижу, что файл запускается, PEtools,HIEW кажут нормально, а pedump(pitreck) не хочет работать, ну и фиг с ним. Теперь же беру и делаю последний dword в массиве двойных слов для kernel32.dll не нулевым: Код (Text): .00402000: 7A 20 00 00¦8E 20 00 00¦6C 20 00 00¦[b]7A 20 00 00[/b] и файл перестает запускаться виндой! Не хотят с ним работать и утилиты. Следовательно нулевой дворд есть конец массива двойных функций. Ладно теперь обратно обнуляем и начинаем эксперементировать с массивом OriginalsFirstThink для этого делаю следующее: Код (Text): .00402050: 00 00 00 00¦[b]8E 20 00 00[/b]¦8E 20 00 00¦6C 20 00 00 .00402060: 00 00 00 00¦[b]7A 20 00 00[/b]¦00 00 00 00¦80 00 45 78 и получаю в PEtools, что GetModuleHandle оказывается не в kernel32.dll, а в user32.dll! )) Зачем закладываться только на один массив, когда есть еще и второй? Для чего вообще вводить два дублирующих друг друга массива? p.s: На что вообще закладываться, чтобы сделать вывод список импортируемых файлом функций?
Если есть OrginalFirstThunk то нужно использовать его, если нету - тогда FirstThink. > Зачем закладываться только на один массив, когда есть еще и второй? FirstThunk может быть уже заполнен адресами, и тогда если совпадет time-data-stamp в таблице импорта и в таблице экспорта dll загрузчик будет считать что все уже настроено и не будет заного связывать импорт. А если не совпадет, тогда он будет заново настраивать массив FirstThunk на основании инфы из OriginalFirstThunk
Спасибо! Буду соображать. А можете посоветовать сорец по pe-просмотру, только не питрека, плиз. А то, что я накачал мне не нравится