Здрасте. Постил уже этот вопос на кряклабе, но ответа так и не получил. Я написал упаковщик РЕ-файлов и вот появилась проблемка, выдает ошибку в Висте если ImageBasse упакованого файла не равен 400000h. Мой упаковщик работает по такому принципу: У стаба ImageBasse всегда 400000h. Стаб распаковывает в памяти файл по нужному адресу и передает управление на него. А если базы разные у стаба и у файла, то правит PE.ImageBasse и LDR_MODULE.BaseAddress, LDR_MODULE.EntryPoint, LDR_MODULE.SizeOfImage на тот который у оригинала должен быть. В ХР работает. В висте вываливается с ошибкой гдето в средине кернел при обработке уже оригинального файла. Ребята кто сталкивался подскажите че неправильно делаю. Если что могу дать ехе для наглядности.
Вот пример http://www.fileuploader.cn/download.php?0611507e222914a26f498c68acdda9fc В архиве два файла. Оригинал и покрытый упаковщиком. Для наглядности я упростил.. и выбросил процедуру упаковки. Падает при выполнении ф-ии MessageBox в оригинальном файле. Но если база пакуемого файла такая же как и у стаба - то все гуд.
litrovith Маладец, трассировать в ольге умеешь, видимо, кнопка F7 у тебя всё же работает. Фраза Как раз и говорит, что падает "там"
nester7, а там других функций нету . А что так сложно посмотреть в чём проблема? Самое простое решение - налету править свой стаб чтоб его ImageBasse совпадал с ImageBasse файла. nester7 Ctrl+F9
Так что же ты нажал Ctrl+F9? Он и без тебя знает, что оно падает, он не знает _почему_. Давай варианты, анализируй дамп, выдвигай теории и т.п. Я тож могу так тыкать Интересно, почему у него не работает (точнее, почему именно в висте, а он в 2к пробовал?). Я тут пас - сейчас не могу в силу эээ... некоторых причин.
Значится так. Когда твой код получает управление, карта памяти выглядит вот так: Код (Text): ... 00400000 00001000 pack_sim PE header Imag 01001002 R RWE 00401000 00001000 pack_sim .code code Imag 01001002 R RWE 00410000 0037F000 Map 00041002 R R \Device\HarddiskVolume1\Windows\System32\locale.nls 75E30000 00001000 kernel32 PE header Imag 01001002 R RWE ... Далее, в базонезависимом стабе, ты выгружаешь все, что находится в окресностях оригинальной базы, ака 0х500000. А там у нас locale.nls, в область которого, после вызова MessageBoxA, идет обращение: Код (Text): > kernel32.dll!_GetWindowsLocaleData@4() + 0x24 bytes kernel32.dll!_MakeLocHashNode@4() + 0xf bytes kernel32.dll!_SetupSystemLocaleHashNode@0() + 0x3e bytes kernel32.dll!_CheckSpecialLocales@4() - 0x1db70 bytes kernel32.dll!_NlsValidateLocale@12() + 0xf bytes kernel32.dll!_CompareStringW@24() + 0x1c bytes kernel32.dll!FSPErrorMessages::CConfig::IsRestrictedProcess() + 0x3e bytes kernel32.dll!FSPErrorMessages::CConfig::IsDisabled() + 0x6a bytes kernel32.dll!FSPErrorMessages::CMessageMapper::LazyInitialize() - 0x26af5 bytes kernel32.dll!FSPErrorMessages::CMessageMapper::NotifyLoadStringResource() + 0x76 bytes kernel32.dll!_RealWerpNotifyLoadStringResourceEx@20() + 0x27 bytes kernel32.dll!_RealWerpNotifyLoadStringResource@16() + 0x21 bytes kernel32.dll!_LoadStringBaseExW@20() + 0x9d bytes user32.dll!_MessageBoxWorker@4() + 0xc9 bytes user32.dll!_MessageBoxTimeoutW@24() + 0x7f bytes user32.dll!_MessageBoxTimeoutA@24() + 0xa1 bytes user32.dll!_MessageBoxExA@20() + 0x1b bytes user32.dll!_MessageBoxA@16() + 0x45 bytes 00501011() kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes В функции kernel32.dll!_GetWindowsLocaleData@4() идет обращение по адресу 0х006524СС.
Gefahrlich maestro-ant В данном случае после образа упаковщика загрузчик маппит что ему не лень (файл локали). Расширяй размер образа чтобы он был не меньше того что ты распаковываешь и не нужно никакого анмапа.
Я именно так и решил подобную проблему, за счет увеличения виртуального размера последней секции. Но все равно мне кажется что это не айс.