GoldFinch Exe загружается также как и Dll. И на оборот, из Dll можно создать процесс. Если у вас с первым не будет проблем, то создать процесс средствами винапи из Dll не получится лишь по одной причине - перед созданием процесса выполняется проверка характеристик модуля. Юзается NtQuerySection(SectionImageInformation) и проверяется поле Characteristics на флаг IMAGE_FILE_EXECUTABLE_IMAGE. Соответственно это флаги из заголовка модуля с темже именем. Если этот флажёк сброшен - будет возвращена ошибка. Если эту проверку пропустить процесс будет создан.
Нее, не много не так. Забыл. Там проверка на флаг IMAGE_FILE_DLL - он должен быть сброшен, посмотрел. Сделойте возможность редактировать постенги, что это такое..
По мотивам kaspersky можно еще вот так извернуться: Код (Text): format PE at 0x0 include 'E:\Program Files\fasmw16729\INCLUDE\win32a.inc' push 0x0 push 0x0 push string push 0x0 call [MessageBox] ret string: db 'I am strange PE!', 0x0 data import library user,'USER32.DLL' import user,\ MessageBox,'MessageBoxA' end data section '.reloc' fixups data discardable Загрузчик все стерпит . Главное, чтобы релокации были.
Чччччерррррт, путь убрать забыл. Глас вопиющего в пустыне: Верните редактирование постов, пожалуйста.
Слагка запутался. И по сему уточню, что не имел ввиду изменение загрузчика. Просто длл и екзе могут быть одним м тем же файлом, изменив 1 бит которого можно превращать одну сущногсть в другую...
Хотя думаю что говорим всё же об одном) Код (Text): bool ConvertPE(PCHAR path) { IMAGE_DOS_HEADER* mz_head; IMAGE_FILE_HEADER* pe_head; char pe[] = "PE\0\0"; HANDLE hFile=CreateFile(path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (!hFile) { return false; } HANDLE hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,NULL); if (!hMap) { CloseHandle(hFile); return false; } PVOID hMapFile=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0); if (!hMapFile) { CloseHandle(hMap); CloseHandle(hFile); return false; } mz_head=(IMAGE_DOS_HEADER*)hMapFile; pe_head =(IMAGE_FILE_HEADER*)((char*)hMapFile + mz_head->e_lfanew); if ( strcmp(pe,(const char *)pe_head) != 0) { UnmapViewOfFile(hMapFile); CloseHandle(hMap); CloseHandle(hFile); return false; } pe_head =(IMAGE_FILE_HEADER*)((char*)hMapFile + mz_head->e_lfanew+sizeof(DWORD)); pe_head->Characteristics =IMAGE_FILE_32BIT_MACHINE|IMAGE_FILE_DLL|IMAGE_FILE_EXECUTABLE_IMAGE; UnmapViewOfFile(hMapFile); CloseHandle(hMap); CloseHandle(hFile); return true; } ----------- Код (Text): BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { hInstance=hModule; VirtualQuery(DllMain,&mbi,sizeof(mbi)); GetModuleFileName((HMODULE)mbi.AllocationBase,(LPCH)pPath,MAX_PATH); slen=lstrlen((LPCSTR)pPath); if (!lstrcmpi((LPCSTR)(pPath+slen-3),"exe")) { ConvertPE(траляля); return true; } switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: return true; case DLL_THREAD_ATTACH: return true; break; case DLL_THREAD_DETACH: return true; break; case DLL_PROCESS_DETACH: HeapFree(hHeap,0,txt); return true; } return true;
если исходник в 2-3 строки то может и такзагрузить вобщем то получается, но вот чтобы это все нормально работало - нет, видать и-за того что на колбек DllMain много ограничений наложено.
ohne Поспешные выводы. Если соблюдать все правила ДДЛ и в случае если мы не ДЛЛ,то только тогда вызывать 'точку входа' нашего 'приложения'. Из этого кода оставлен лишь каркас.
была на васме тема ищи например потоки создавать не безопасно - даже в мсдн об этом написано что если в екзе есть статическая тлс? попробуй там поюзать что то серъезное а не только инициализацию данных каких-то и рет - толку вобщем один буй никакого в конечном итоге ты прав - загрузить можно кое что - разница только 1 флаг но смысл возьми любую нормальную прогу добавь туда в экспорт директорию например экспорт baseofdata ну и флаг смени - работать не будет просто грязный хак и ничего более
Ограничений нет. Кто пишет код на пограничном уровне(Ki*), для тех нет никаких проблем. Другое если у вас проблемы со средой. ohne Имхо это только для вас границы.