PDA

View Full Version : سوال: اجرای یک فایل exe از روی ram



alirezabe
پنج شنبه 03 بهمن 1392, 16:15 عصر
سلام

من کد یک برنامه اجرایی را بر روی ram دارم (به صورت یک *char) و می خواهم بدون ساختن فایل آنرا اجرا کنم
کد به زبان ++C می باشد

در اینترنت تابع CreateProcess را معرفی کرده بود ولی برای این تابع باید برنامه به صورت یک فایل بر روی هارد ذخیره شده باشد

لطفا من را راهنمایی کنید


با تشکر
علیرضا

بهروز عباسی
پنج شنبه 03 بهمن 1392, 17:54 عصر
http://www.emoticode.net/c-plus-plus/run-a-portable-executable-image-from-memory.html



#define IS_ALIGNED(x) ( ( (x) % sNtHeaders.OptionalHeader.SectionAlignment ) == 0 )

bool ExecutePeFromMemory( PBYTE pImage, const char* szFakePath )
{
bool ret = false;

DWORD dwWritten = 0,
dwHeader = 0,
dwImageSize = 0,
dwSectionCount = 0,
dwSectionSize = 0,
dwFirstSection = 0,
dwPrevProtection = 0,
dwJmpSize = 0;

IMAGE_NT_HEADERS sNtHeaders;
IMAGE_DOS_HEADER sDosHeader;
IMAGE_SECTION_HEADER Sections[1000];

PROCESS_INFORMATION sProcInfo;
STARTUPINFO sStartupInfo;
CONTEXT sContext;
SECURITY_ATTRIBUTES sSecAttrs;

PBYTE pMemory;
PBYTE pFile;

// start reading PE headers
memcpy( &sDosHeader, pImage, sizeof(sDosHeader) );
memcpy( &sNtHeaders, (void*)((DWORD)pImage + sDosHeader.e_lfanew), sizeof(sNtHeaders) );

dwImageSize = sNtHeaders.OptionalHeader.SizeOfImage;
pMemory = (PBYTE)malloc(dwImageSize);

ZeroMemory( pMemory, dwImageSize );

pFile = pMemory;
dwHeader = sNtHeaders.OptionalHeader.SizeOfHeaders;
dwFirstSection = (DWORD)(((DWORD)pImage + sDosHeader.e_lfanew) + sizeof(IMAGE_NT_HEADERS));

// get first section header
memcpy( Sections, (PBYTE)(dwFirstSection), sizeof(IMAGE_SECTION_HEADER) * sNtHeaders.FileHeader.NumberOfSections );
memcpy( pFile, pImage, dwHeader);

if( IS_ALIGNED( sNtHeaders.OptionalHeader.SizeOfHeaders ) )
{
dwJmpSize = sNtHeaders.OptionalHeader.SizeOfHeaders;
}
else
{
dwJmpSize = sNtHeaders.OptionalHeader.SizeOfHeaders / sNtHeaders.OptionalHeader.SectionAlignment;
dwJmpSize += 1;
dwJmpSize *= sNtHeaders.OptionalHeader.SectionAlignment;
}

// loop each section
pFile = (PBYTE)((DWORD)pFile + dwJmpSize);

for( dwSectionCount = 0; dwSectionCount < sNtHeaders.FileHeader.NumberOfSections; ++dwSectionCount )
{
dwJmpSize = 0;
dwSectionSize = Sections[dwSectionCount].SizeOfRawData;

memcpy( pFile, (PBYTE)(pImage + Sections[dwSectionCount].PointerToRawData), dwSectionSize );

if( IS_ALIGNED( Sections[dwSectionCount].Misc.VirtualSize ) )
{
dwJmpSize = Sections[dwSectionCount].Misc.VirtualSize;
}
else
{
dwJmpSize = Sections[dwSectionCount].Misc.VirtualSize / sNtHeaders.OptionalHeader.SectionAlignment;
dwJmpSize += 1;
dwJmpSize *= sNtHeaders.OptionalHeader.SectionAlignment;
}

pFile = (PBYTE)((DWORD)pFile + dwJmpSize);
}

ZeroMemory( &sStartupInfo, sizeof(STARTUPINFO) );
ZeroMemory( &sProcInfo, sizeof(PROCESS_INFORMATION) );
ZeroMemory( &sContext, sizeof(CONTEXT) );

sStartupInfo.cb = sizeof(sStartupInfo);

// create the fake suspended process
if( CreateProcess(NULL,szFakePath ,&sSecAttrs,NULL,false,CREATE_SUSPENDED, NULL,NULL,&sStartupInfo,&sProcInfo))
{
// obtain main thread context
sContext.ContextFlags = CONTEXT_FULL;

GetThreadContext(sProcInfo.hThread,&sContext);

// (un)protect process address space
VirtualProtectEx( sProcInfo.hProcess,(void*)((DWORD)sNtHeaders.Optio nalHeader.ImageBase),dwImageSize,PAGE_EXECUTE_READ WRITE,&dwPrevProtection);

// write image
WriteProcessMemory( sProcInfo.hProcess,(void*)((DWORD)sNtHeaders.Optio nalHeader.ImageBase),pMemory,dwImageSize,&dwWritten);
WriteProcessMemory( sProcInfo.hProcess,(void*)((DWORD)sContext.Ebx + 8),&sNtHeaders.OptionalHeader.ImageBase,4,&dwWritten);

sContext.Eax = sNtHeaders.OptionalHeader.ImageBase + sNtHeaders.OptionalHeader.AddressOfEntryPoint;

// restore context
SetThreadContext(sProcInfo.hThread,&sContext);

// finally start the new process
ResumeThread(sProcInfo.hThread);

ret = true;
}

free(pMemory);

return ret;
}

alirezabe
جمعه 04 بهمن 1392, 08:50 صبح
آرگومان دوم createProcess نمی تواند char* باشد

چه طوری درستش کنم؟

alirezabe
شنبه 05 بهمن 1392, 17:03 عصر
یه سوال دیگه
این کار برای Exe های با حجم بالای 35 مگ کار نمی کند