| 
 
 
 
 Легенда:
  новое сообщение 
  закрытая нитка 
  новое сообщение 
  в закрытой нитке 
  старое сообщение   | 
Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
Новичкам также крайне полезно ознакомиться с данным документом.
| [Win32] запуск exe из памяти...2  31.10.08 22:52 Автор: Tamas Статус: Member
 |  
| вот написал  такую вещь... она загружает в память образ exe... теперь вопрос а как теперь это запустить ??? как обратится к AddressOfEntryPoint ???
 
 и вот ещё виликие Гуру я всё правильно написал ??? или  сточки зрения теории... что то
 нужно делать по другому ???
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 #define RVATOVA(base,offset)(((unsigned long)(base)+(unsigned long)(offset)))
 
 unsigned long Protect(unsigned long characteristics)
 {
 static const unsigned long Mapping[]={PAGE_NOACCESS,PAGE_EXECUTE,PAGE_READONLY,PAGE_EXECUTE_READ,PAGE_READWRITE,PAGE_EXECUTE_READWRITE,PAGE_READWRITE,PAGE_EXECUTE_READWRITE};
 return Mapping[characteristics >> 29];
 }
 
 void* LoadExe(unsigned char *ExeImage)
 {
 IMAGE_DOS_HEADER *ImageDosHeader;
 IMAGE_NT_HEADERS *ImageNtHeaders;
 IMAGE_SECTION_HEADER *ImageSectionHeader;
 IMAGE_IMPORT_DESCRIPTOR *ImageImportDescriptor;
 IMAGE_THUNK_DATA *OriginalFirstThunk;
 IMAGE_THUNK_DATA *FirstThunk;
 IMAGE_IMPORT_BY_NAME *ImageImportByName;
 unsigned long SectionIndex;
 unsigned long ImportDllIndex;
 unsigned long OldProtect;
 void *ImageBase;
 void *ImportDll;
 void *FunctionAddress;
 
 if(ExeImage==NULL)return false;
 
 //Получаем заголовки.............
 
 ImageDosHeader=ExeImage;
 ImageNtHeaders=ExeImage+ImageDosHeader->e_lfanew;
 ImageSectionHeader=ExeImage+ImageDosHeader->e_lfanew+sizeof(IMAGE_NT_HEADERS);
 
 //Выделяем память под Image base.......
 
 if((ImageBase=VirtualAlloc((void*)NULL,ImageNtHeaders->OptionalHeader.SizeOfImage,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE))==NULL)return NULL;
 
 //Копируем заголовки в память....................
 
 CopyMemory(ImageBase,ExeImage,ImageNtHeaders->OptionalHeader.SizeOfHeaders);
 
 //Копируем секции в память
 
 for(SectionIndex=0;SectionIndex<ImageNtHeaders->FileHeader.NumberOfSections;SectionIndex++)
 {
 CopyMemory((void*)RVATOVA(ImageSectionHeader[SectionIndex].VirtualAddress,ImageBase),ExeImage+ImageSectionHeader[SectionIndex].PointerToRawData,ImageSectionHeader[SectionIndex].SizeOfRawData);
 }
 
 //читаем IMAGE_DIRECTORY_ENTRY_IMPORT загружаем DLL через LoadLibrary и получам адреса функций по GetProcAddress
 //ну и записаваем адреса в ImageImportDescriptor[ImportDllIndex].FirstThunk(памяти)
 
 ImageImportDescriptor=(IMAGE_IMPORT_DESCRIPTOR*)RVATOVA(ImageNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress,ImageBase);
 
 for(ImportDllIndex=0;ImageImportDescriptor[ImportDllIndex].Characteristics;++ImportDllIndex)
 {
 if((ImportDll=LoadLibrary((unsigned char*)RVATOVA(ImageImportDescriptor[ImportDllIndex].Name,ImageBase)))==NULL)
 {
 VirtualFree(ImageBase,ImageNtHeaders->OptionalHeader.SizeOfImage,MEM_DECOMMIT|MEM_RELEASE);
 return NULL;
 }
 
 OriginalFirstThunk=(IMAGE_THUNK_DATA*)RVATOVA(ImageImportDescriptor[ImportDllIndex].OriginalFirstThunk,ImageBase);
 FirstThunk=(IMAGE_THUNK_DATA*)RVATOVA(ImageImportDescriptor[ImportDllIndex].FirstThunk,ImageBase);
 
 for(;OriginalFirstThunk->Ordinal;++OriginalFirstThunk,++FirstThunk)
 {
 ImageImportByName=(IMAGE_IMPORT_BY_NAME*)RVATOVA(OriginalFirstThunk->AddressOfData,ImageBase);
 
 if(0xF0000000&OriginalFirstThunk->Ordinal)
 {
 FunctionAddress=GetProcAddress(ImportDll,MAKEINTRESOURCE(OriginalFirstThunk->Ordinal));
 }
 else
 {
 FunctionAddress=GetProcAddress(ImportDll,ImageImportByName->Name);
 }
 
 if(FunctionAddress!=NULL)FirstThunk->Function=FunctionAddress;
 }
 
 FreeLibrary(ImportDll);
 }
 
 //Устанавлеваем разрешение на секции по VirtualProtect...........
 
 for(SectionIndex=0;SectionIndex<ImageNtHeaders->FileHeader.NumberOfSections;SectionIndex++)
 {
 if(!VirtualProtect((void*)RVATOVA(ImageSectionHeader[SectionIndex].VirtualAddress,ImageBase),ImageSectionHeader[SectionIndex].Misc.VirtualSize,Protect(ImageSectionHeader[SectionIndex].Characteristics),&OldProtect))
 {
 VirtualFree(ImageBase,ImageNtHeaders->OptionalHeader.SizeOfImage,MEM_DECOMMIT|MEM_RELEASE);
 return NULL;
 }
 }
 
 return ImageBase;
 }
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 |  
 
 
 |  |