|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 23, 2004 17:23:15 Друзья! Я пишу свой PE-протектор. На WinXP всё работает отлично, на 98 exe/dll не загружаются. GetLastError() выдаёт 11 "An attempt was made to load a program with an incorrect format". В чем может быть дело ? Спасибо. |
|
|
Дата: Окт 23, 2004 18:49:22 В плохой погоде. В направлении ветра. Что еще можно ответить, видя этот вопрос? |
|
|
Дата: Окт 23, 2004 22:33:45 А в win декларациях ошибок написано, что это проблемы с форматом, а именно то, что это вовсе не тот формат, не PE. Но различия... есть ли они? Формат то один, какие могут быть различия. |
|
|
Дата: Окт 23, 2004 22:36:08 Magic Number PE Format 0x10b PE32 0x20b PE32+ Но это так, для красоты... |
|
|
Дата: Окт 23, 2004 22:39:43 Сообщаю что стало известно на текущий момент: 1. Загрузчик win98 отказывается загружать dll без релоков (IMAGE_DIRECTORY_ENTRY_BASERELOC). Необходимо чтобы присутсвовала хотя-бы нулевая строка таблицы релоков (ImageBaseRelocation). 2. В win98 нельзя убирать ресурсы(IMAGE_DIRECTORY_ENTRY_RESOURCE). Если лоадер восстанавливает вручную адрес ресурсов при загрузке PE, ни одна функция обращения к ресурсам работать не будет, несмотря на то, что GetLastError() возвращает 0. К сожалению это ещё не всё, постараюсь держать в курсе. |
|
|
Дата: Окт 23, 2004 22:40:42 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. Глупо что либо советовать человеку который должен теоретически знать больше чем я. У меня вообще депрессняк постоянно, но это тоже не стоило говорить. |
|
|
Дата: Окт 24, 2004 22:14:56 Похоже что загрузчик Win98 требует чтобы DllMain при возврате очищал стек от переданных параметров, т.е. лоадер должен завершаться RET 0Ch Иначе LoadLibrary() возвращает 0, а GetLastError() 1114. XP/2000 - нет, что непонятно :( Во всяком случае я в самом начале допустил такую ошибку -- RET без 0Сh, когда исправил -- заработало на обеих системах.. |
|
|
Дата: Окт 25, 2004 12:56:57 · Поправил: bogrus RET без 0Сh, когда исправил -- заработало на обеих системах.. Оно не должно было работать, ни на какой системе. Протестируй, bad не должен нигде работать, т.к. ret передает управление чёрти-куда. И протестируйте good на w98, интересно, как она ведет себя при одной секции в dll 1081648068__exedll.zip |
|
|
Дата: Окт 25, 2004 16:02:16 4. Если стереть адрес таблицы экспорта (в лоадере восстановить само-собой), под win98 GetProcAddress() всегда возвращает 0. Если не стирать (при этом по адресу таблицы будут упакованные данные) -- всё ок. С ресурсами такой фокус не проходит -- по адресу ресурсов должны лежать именно ресурсы. В общем граблей с защитой dll по самые края :) |
|
|
Дата: Окт 25, 2004 17:29:05 по адресу ресурсов должны лежать именно ресурсы. С чего бы вдруг, туда можно напихать что угодно. Может проблема в другом? http://wasm.ru/forum/index.php?action=vthread&forum=4&topic=6897 Глянь в отладчике, что там у тебя, а то так и будем ходить вокруг, да около |
|
|
Дата: Окт 25, 2004 19:16:20 Напихать можно чего угодно, но ресурсы загружаться не будут:) Во всяком случае у меня CreateDialog, FindResource и т.п. после распаковки ресурсов работают. Подозреваю что win98 загрузчик обрабатывает директории перед передачей управления в точку входа. Поэтому изменения полей директорий в лоадере ни на что не влияют. В целом разобрался, всё работает, если кому интересно: вот причины по которым защищенная exe/dll не работает в win98 1. в директориях стёрт адрес таблицы релоков 2. в директориях стёрт адрес таблицы экспорта 3. ресурсы упакованы 4. лоадер завершается ret а не ret 0Ch Насколько я знаю, UPX может паковать таблицу экспорта и частично ресурсы, но дальше разбираться нет времени :( |
|
|
Дата: Окт 25, 2004 19:41:03 Упаси меня господь от такого протектора :) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.053 |