Друзья! Я пишу свой PE-протектор. На WinXP всё работает отлично, на 98 exe/dll не загружаются. GetLastError() выдаёт 11 "An attempt was made to load a program with an incorrect format". В чем может быть дело ? Спасибо.
А в win декларациях ошибок написано, что это проблемы с форматом, а именно то, что это вовсе не тот формат, не PE. Но различия... есть ли они? Формат то один, какие могут быть различия.
Сообщаю что стало известно на текущий момент: 1. Загрузчик win98 отказывается загружать dll без релоков (IMAGE_DIRECTORY_ENTRY_BASERELOC). Необходимо чтобы присутсвовала хотя-бы нулевая строка таблицы релоков (ImageBaseRelocation). 2. В win98 нельзя убирать ресурсы(IMAGE_DIRECTORY_ENTRY_RESOURCE). Если лоадер восстанавливает вручную адрес ресурсов при загрузке PE, ни одна функция обращения к ресурсам работать не будет, несмотря на то, что GetLastError() возвращает 0. К сожалению это ещё не всё, постараюсь держать в курсе.
ImageBase - Preferred address of first byte of image when loaded into memory; must be a multiple of 64K. The default for DLLs is 0x10000000. The default for Windows CE EXEs is 0x00010000. The default for Windows NT, Windows 95, and Windows 98 is 0x00400000. Глупо что либо советовать человеку который должен теоретически знать больше чем я. У меня вообще депрессняк постоянно, но это тоже не стоило говорить.
Похоже что загрузчик Win98 требует чтобы DllMain при возврате очищал стек от переданных параметров, т.е. лоадер должен завершаться RET 0Ch Иначе LoadLibrary() возвращает 0, а GetLastError() 1114. XP/2000 - нет, что непонятно Во всяком случае я в самом начале допустил такую ошибку -- RET без 0Сh, когда исправил -- заработало на обеих системах..
Оно не должно было работать, ни на какой системе. Протестируй, bad не должен нигде работать, т.к. ret передает управление чёрти-куда. И протестируйте good на w98, интересно, как она ведет себя при одной секции в dll 1081648068__exedll.zip
4. Если стереть адрес таблицы экспорта (в лоадере восстановить само-собой), под win98 GetProcAddress() всегда возвращает 0. Если не стирать (при этом по адресу таблицы будут упакованные данные) -- всё ок. С ресурсами такой фокус не проходит -- по адресу ресурсов должны лежать именно ресурсы. В общем граблей с защитой dll по самые края
С чего бы вдруг, туда можно напихать что угодно. Может проблема в другом? http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=6897 Глянь в отладчике, что там у тебя, а то так и будем ходить вокруг, да около
Напихать можно чего угодно, но ресурсы загружаться не будут Во всяком случае у меня CreateDialog, FindResource и т.п. после распаковки ресурсов работают. Подозреваю что win98 загрузчик обрабатывает директории перед передачей управления в точку входа. Поэтому изменения полей директорий в лоадере ни на что не влияют. В целом разобрался, всё работает, если кому интересно: вот причины по которым защищенная exe/dll не работает в win98 1. в директориях стёрт адрес таблицы релоков 2. в директориях стёрт адрес таблицы экспорта 3. ресурсы упакованы 4. лоадер завершается ret а не ret 0Ch Насколько я знаю, UPX может паковать таблицу экспорта и частично ресурсы, но дальше разбираться нет времени