exe из памяти падает а x64

Тема в разделе "WASM.BEGINNERS", создана пользователем not1, 14 мар 2012.

  1. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    Всем привет в чем может быть проблема? на хп32 все норм отрабатывает на х64 вылетает с ошибкой
    Взял кусок кода из книги Gary Nebbett'a
    Код (Text):
    1. HANDLE hFile=CreateFile("test.exe",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    2. if(hFile==INVALID_HANDLE_VALUE) return 0;
    3. DWORD hSize=GetFileSize(hFile,&hSize);
    4. HANDLE hHeap=HeapCreate(NULL,hSize,hSize);
    5. DWORD btRead;
    6. ReadFile(hFile,hHeap,hSize,&btRead,0);
    7. CloseHandle(hFile);
    8. PROCESS_INFORMATION pi;
    9. STARTUPINFO si = {sizeof si};
    10. CreateProcess(0, "cmd", 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &si, &pi);
    11. CONTEXT context = {CONTEXT_INTEGER};
    12. GetThreadContext(pi.hThread, &context);
    13. PVOID x;
    14. ReadProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &x, sizeof x, 0);
    15. HMODULE hNtDll = LoadLibrary("ntdll.dll");
    16. ZwUnmapViewOfSection = (LONG (NTAPI *)(HANDLE,PVOID))GetProcAddress(hNtDll,"ZwUnmapViewOfSection");
    17. ZwUnmapViewOfSection(pi.hProcess, x);
    18. PVOID p=hHeap;
    19. PIMAGE_NT_HEADERS nt = PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p)->e_lfanew);
    20. PVOID q = VirtualAllocEx(pi.hProcess,PVOID(nt->OptionalHeader.ImageBase),nt->OptionalHeader.SizeOfImage,
    21.                              MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    22. WriteProcessMemory(pi.hProcess, q, p, nt->OptionalHeader.SizeOfHeaders, 0);
    23. PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt);
    24. for (ULONG i = 0; i < nt->FileHeader.NumberOfSections; i++) {
    25.   WriteProcessMemory(pi.hProcess,
    26.                            PCHAR(q) + sect[i].VirtualAddress,
    27.                            PCHAR(p) + sect[i].PointerToRawData,
    28.                            sect[i].SizeOfRawData, 0);
    29.  
    30.         ULONG x;
    31.  
    32.         VirtualProtectEx(pi.hProcess, PCHAR(q) + sect[i].VirtualAddress, sect[i].Misc.VirtualSize,
    33.                          protect(sect[i].Characteristics), &x);
    34.     }
    35.  
    36.     WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &q, sizeof q, 0);
    37.  
    38.     context.Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint;
    39.  
    40.     SetThreadContext(pi.hThread, &context);
    41.  
    42.     ResumeThread(pi.hThread);
    43. ......
     
  2. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    not1
    test.exe - 64 бита?
    А код из которого исполняете сколько бит?
    cmd.exe - 32 или 64 битный запускается?
     
  3. not1

    not1 Member

    Публикаций:
    0
    Регистрация:
    6 окт 2009
    Сообщения:
    137
    ziral2088 нет test.exe я открываю, потом получаю его размер выделяю в куче память и читаю в этот буфер файл, далее по примеру Гари, создаю процесс cmd и пишу этот буфер туда, на 32 битной винде все работает файл запускается из памяти, на х64 вылетает с ошибкой 5, я подозреваю что в х64 такой метод запуска не проконает, требуется обязательно образ файла на диске?...кстате падает на этой строке ResumeThread(pi.hThread) хз в чем проблема возможно выравнивание не правильное или еще что, вообще можно на х64 запустить файл из памяти?
    вообщем стоит задача в кратце
    я в сокет получаю некий буфер хочу его сразу в память передать и запустить не сохраняя этот буфер на диск, ес-но буфер который я получу это файл...вот погуглив набросал примерно как это должно быть на х64 это к сожалению не работает..
     
  4. ziral2088

    ziral2088 New Member

    Публикаций:
    0
    Регистрация:
    16 авг 2009
    Сообщения:
    283
    not1
    поставьте int3(0xCC) по EntryPointу, подключите olly\windbg и посмотрите, что не так.
    Гадать - очень тяжело.