информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsПортрет посетителяГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[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;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach