В ресурсы своей проги я прошил чужой EXE файл. И в определенные моменты, мне нужно запускать его из памяти без сохранения на диск. Может у кого нибудь есть EXE лоадер в виде DLL ? Лоадер должен получать указатель на первый байт загруженного EXE, и запускать его из массива или переменной не сохраняя на диск.
вот вроде что хотел.. 29a-7_full_edition\Binaries\yoda\INCONEX е-зин бери на h††p://vx.netlux.org/ --------------------------------------------------------- InConEx - executing PE files in the own process memory context -------------------------------------------------------------- by yoda This program tries to load a target PE image into some memory in its own memory context and execute it there. Only PE files can be executed that have RelocationInformation included. The ImportTable is initialized, the Relocation items are applyed to the image and at the end also the windows internal stuff is adjusted, i.e. fixing calling process module information (ImageBase, ImageSize, module path, command line, current directory). The built virtual module image is executed in an own thread, so the server gets back execution control after the client thread terminates. To avoid that the client applications will terminate the whole process on the end of its execution, we simply hook the ExitProcess API. Every process has to use this API to finish its execution, also if it's not visible in the ImportTable because it's called by stubs (MFC, VB, .NET, MSVCRT,...). InConEx basically supports 9x and NT based operation systems but it doesn't work on 9x as good as on NT. E.g. on 9x the DialogBoxParam calls fail
Только не забудь что "пришитый" ехе надо грузить в память по нужному ему адресу, иначе потребуются релоки. И еще надо будет фиксить PEB, чтобы GetModuleHandle() возвращала нужный адрес, а не твой host. Ну и еще куча всего остального =)
Посмотрел код лоадера InConEx, к сожалению он не подходит к моей задаче. Мне нужно запускать EXE из памяти, а не с диска. Вообще, я не понимаю смысла этого исходника, зачем так извратился товарисщ yoda? Хотел показать, что может написать аналог виндосовского загрузчика, который может запускать экзешники с диска? Так я тоже это умею, и мне только одна API функция понадобится - CreateProcess. Короче, не спасет InConEx отцов русской демократии...
Приложил PE лоадер в виде DLL. К сожалению он запускает только EXE с релоками. Фиксит GetModuleHandle, ресурсы у EXE не теряет... Написан на PowerBASIC for Windows. Короче в примере запустите START.BAT и все поймете А мне надо запустить, VB экзешник в нем нет секции .rloc ! Если у кого-нибудь есть лоадер который может запускать экзешник без релоков,заверните его в DLL и выложите сюда пожалуйста, очень нужно... _1470862357__loader.zip
Чтобы запустить .exe без релоков, он должен грузиться по iamgebase. Так что тебе наверное придется поменять imagebase у своего .exe(того, который будет "родителем")
to ssx: Можно поменять iamgebase в уже откомпилированном EXE? Просто не каждый компилятор при сборке EXE позволяет указывать iamgebase
Попробовал заменит BASE с 40000 на 10000 при старте проги получил GPF. Какой диапазон можно указывать в BASE?
Из Рихтера: "Базовый адрес, но которому загружается приложение, определяется компоновщиком. Разные компоновщики выбирают и разные (no умолчанию) базовые адреса. Ком поновщик Visual С++ использует по умолчанию базовый адрес 0x00400000 — самый нижний в Windows 98, начиная с которого в ней допускается загрузка образа испол няемого файла. Указав параметр /BASE: адрес (в случае компоновщика от Microsoft), можно изменить базовый адрес, по которому будет загружаться приложение. При попытке загрузить исполняемый файл в Windows 98 по базовому адресу ниже 0x00400000 загрузчик переместит его на другой адрес. Это увеличит время загрузки приложения, но оно по крайней мере будет выполнено. Если Вы разрабатываете программы и для Windows 98, и для Windows 2000, сделайте так, чтобы приложение загружалось по базовому адресу не ниже 0x00400000." Смотри в отладчике, что не так
ImageBase нельзя менять в экзешнике тк все обрящения к памяти идут не по относительным адресам, а по абсолютным (это в случае отсутствия релоков). Единственный выход - писать базонезависимый код.
Отставить единственный. Моча в голову ударила - придумал другой способ. Запустить любой процесс (типа Calc.exe) c флагом CREATE_SUSPENDED, потом сделать WriteProcessMemory, те скопировать нужный кусок в чужой процесс и потом продолжить выполнение. В принципе должно работать, только надо не забыть поставить права доступа на страницы в чужом процессе PAGE_EXECUTE_READWRITE
Отставить единственный. Моча в голову ударила - придумал другой способ. Запустить любой процесс (типа Calc.exe) c флагом CREATE_SUSPENDED, потом сделать WriteProcessMemory, те скопировать нужный кусок в чужой процесс и потом продолжить выполнение. В принципе должно работать, только надо не забыть поставить права доступа на страницы в чужом процессе PAGE_EXECUTE_READWRITE
alix Всё там нормально работает с BASE 10000, на w2k так точно (w98 у меня нету) Vb оказывается ещё и ассемблерные листинги может генерить _1046699318__loader.zip