Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[Win32] запуск exe из памяти...2 31.10.08 22:52 Число просмотров: 2937
Автор: 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;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
- [Win32] запуск exe из памяти...2 - Tamas 31.10.08 22:52 [2937]
|
|
|