Здравствуйте, господа. Как известно, немалая часть проблем с запуском приложений под Vista/W7 связана с тем, что старый механизм получения адресов API "напрямую" более не работает. Пример: недавняя демка Elevated, упакованная 4kb-пакером Crinkler, падение при запуске на W7 build 7127: Комментарий автора пакера: Всё это хорошо... но не решит проблем с существующим софтом, не желающим работать в новых ОС. Идеальным решением, как мне кажется, будет написание wrapper'а для ntdll и других системных библиотек, который будет корректно возвращать адреса API вызывающей программе. Предлагаю поделиться мыслями по данному вопросу.
Я сам код не смотрел, но интересно, как он получает обратный адрес. Если он берет вторую запись в ПЕБ (или первую? или третью? не помню просто) - это одно. Если он перечисляет все записи и сравнивает по именам - это другое. Вообще, надо глянуть самому, что там в пеб не так. Как вариант, можно составлять случайный импорт с кернелом, брать оттуда адрес любой апи и уже исходя из этого отталкиваться в поиске базы. П.С.: сам пока не смотрел, но может кто в курсе - на торрентах есть в7?
SubV По вашему PE-формат столь сильно изменили что старый код парсинга таблиц экспорта уже не работает ? Причём PEB к экспорту вобще ?
Clerk Чтобы до таблицы экспорта добраться, надо еще до модуля добраться. Раз вопрос в os.kernel'e, предлагаю искать через idt.
censored Кого через IDT, нтдлл ?? ntdll грузится всегда по адресу из заголовка. Зачем в ядре лезть в юзермодный лодер, чтоб этот модуль найти. Он в ядро промаплен. Ну или с диска считать и базу найти. В юзермоде могут отличаться структуры, что они там с KernelBase.dll сделали не знаю.
Вот набросал пикод для вызова трёх процедур(LdrFindEntryForAddress, LdrEnumerateLoadedModules, LdrQueryProcessModuleInformation). Остальное быстро дописать можно при необходимости(хз что вам нужно).