Здравствуйте, gear nuke, Вы писали:
GN>А в чём проблема, разобрался? Я сначала подумал, что возникает гонка подобная FreeLibrary & ExitThread, но в коде её не увидел. А про отладчик ты и сам должен знать
ExitProcess не должен возвращаться в тело вызывающего, иначе на висте все падает. Почему до конца не понятно, буду в исходниках Винды ковырять, наверное.
гонка подобная FreeLibrary & ExitThread
— речь про critical section или чего? непонятно, да и потоки я не создаю, и про отладчик... ???
GN>Что не понравилось — VirtualAlloc на каждую секцию PE, на каких-то образах это сработает, на каких-то нет, из-за разной гранулярности VirtualAlloc и выравнивания секций. Ну это, как оказывалось, наследие статьиАвтор(ы): Максим М. Гумеров
Дата: 20.03.2003
Не вдаваясь в подробности, скажу лишь, что исследование было начато ради сокрытия использования программой на Delphi некоей DLL (написанной на VC++). То есть оператор видит один только Exe-файл, запускает его, а тот каким-то образом подключает функции, содержащиеся изначально (при компиляции проекта) в некоторой DLL.
. И выгрузка в статье сделана (почти) как в последнем твоем варианте.
Конструктивная критика всегда принимается!!!
Это тестовое приложение, файл не диска будет грузиться, а по частям в виртуальную память, сперва заголовок, потом все остальное... Про гранулярность не совсем понятно, это что за выравнивание такое должно быть, чтоб VirtualAllloc не сработал, можно примерчик?
GN>И так есть файл на диске, и так есть MapViewOfFile — можно добавить SEC_IMAGE, и выкинуть половину кода
Добавить что, что это? Пля, моя жена щас прочитала весь этот пост, покрутила у виска и поперлась дальше тупить у телика...
GN>Или можно вычитывать файл сразу в образ в памяти, как сделано здесь в load_image.
E>>решение простое: VirtualFree( g_hLoadedModule, 0, MEM_DECOMMIT | MEM_RELEASE );
E>>я сперва перемудрил немного
GN>MSDN о MEM_RELEASE -Do not use this value with MEM_DECOMMIT
GN>Возвращаемые API значения не проверяются, поэтому исправление вероятно аналогичноесли закоментарить строчку с VirtualFree( g_hLoadedModule, 0, MEM_RELEASE ); тогда все работает
Про MEM_DECOMMIT | MEM_RELEASE согласен — тут лажа. Мне нужно обязательно ресурсы высвобождать, поскольку загружаться в памяти должно несколько мелких утилит, и после их работы высвобождать ресурсы.
сырцы обязательно гляну, спасиб
В ближайшее время попробую переделать...