Как запустить на выполнение ЕХЕ, находящийся в памяти?(без записи в файл)

Тема в разделе "WASM.WIN32", создана пользователем IgorOK, 1 мар 2005.

  1. IgorOK

    IgorOK New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    12
    Адрес:
    Ukraine
    Как запустить на выполнение ЕХЕ, находящийся в памяти?(без записи в файл)
     
  2. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    нужен файл, временный, какой угодно - только не своп.

    http://rsdn.ru/Forum/Message.aspx?mid=739280

    обратите внимание на посты участника Злость



    PS: Естественно, при помощи топора в ядре можно попытаться сделать все, что угодно :)
     
  3. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Файл не нужен, нужно настроить импорт, релоки и пустить трэд на oep. А чтобы файл корректно работал скажем со своими ресурсами немного подправить PEB. Реализацию под НТ можно посмотреть в сорцах морфина (hXXp://hxdef.czweb.org/download/Morphine27.zip).
     
  4. TarasCo

    TarasCo New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2005
    Сообщения:
    106
    Этак можно exe запустить из своего процесса другим потоком. А создаить изолированныей процесс не получится. Чтобы создать процесс - нужна секция с правами на исполнение. А ядро отказывается создавать такую секцию на своп файле. В результате нужен некий файл на диске - стартовая площадка, на которой создается такая секция. После отображения ее на память, туда можно записать чего угодно, но файл все равно нужен
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    есть пример от Garry Nebbet - там все получается. Достает файл из ресурсов и пускает. Создает левый процесс, тормозит его, правит образ в памяти на свой и резюмит. Все работает. Ссылка есть в треде на рсдн.
     
  6. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    infern0



    ;)
     
  7. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    infern0

    да, но этот пример почему то у мня корректно работает только под 2к, выше - безбожно глюкает. Не разбирался ещё в чем причина пока
     
  8. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    CARDINAL

    имхо, руки.

    у меня на XP и на 2K все ок.
     
  9. IgorOK

    IgorOK New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    12
    Адрес:
    Ukraine
    Следуя примеру от Garry Nebbet написал код, который при запуске процесса выдает ошибку:

    "cmd.exe - Application Error"

    "The application failed to initialize properly (0x0000018)"

    Что может быть не то? Ниже приведен код который я использую, платформа ХР.


    Код (Text):
    1.  
    2. #include <windows.h>
    3. #include <conio.h>
    4.  
    5. typedef  LONG (NTAPI * ZWUNMAPVIEWOFSECTION) (HANDLE, PVOID);
    6. static ZWUNMAPVIEWOFSECTION  ZwUnmapViewOfSection=NULL;
    7. char * lpcTheFile = "C:\\1\\HELLO_W.EXE";
    8.  
    9. ULONG protect(ULONG characteristics)
    10. {
    11.     static const ULONG mapping[]
    12.         = { PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,
    13.             PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE,
    14.             PAGE_EXECUTE_READWRITE};
    15.  
    16.     return mapping[characteristics >> 29];
    17. }
    18.  
    19. int main(int argc, char* argv[])
    20. {
    21.     HINSTANCE hDll;
    22.     hDll=LoadLibrary("ntdll.dll"); 
    23.     if (!hDll)
    24.     {
    25.         printf("Error load dll");
    26.         return 0;
    27.     }
    28.     ZwUnmapViewOfSection = (ZWUNMAPVIEWOFSECTION) GetProcAddress(hDll,"ZwUnmapViewOfSection");
    29.  
    30.     PROCESS_INFORMATION pi;
    31.     STARTUPINFO si = {sizeof si};
    32.  
    33.     CreateProcess(NULL, "cmd", 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &si, &pi);
    34.  
    35.     printf("pi.hProcess=%d\n",pi.hProcess);
    36.     CONTEXT context = {CONTEXT_INTEGER};
    37.     GetThreadContext(pi.hThread, &context);
    38.  
    39.     PVOID x;    
    40.     ReadProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &x, sizeof x, 0);
    41.  
    42.     ZwUnmapViewOfSection(pi.hProcess, x);
    43.  
    44.     // Загружаем файл в память
    45.         HANDLE P;
    46.     HANDLE hFile;
    47.    
    48.     hFile = CreateFile(lpcTheFile, GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    49.    
    50.     if (hFile == INVALID_HANDLE_VALUE)
    51.     {    printf("hFile is NULL\n");      
    52.          getch();
    53.         return 4;
    54.     }
    55.     DWORD dwFileSize = GetFileSize(hFile,  NULL);
    56.  
    57.      P=GlobalAlloc(GMEM_FIXED, dwFileSize);
    58.      LPVOID p= P;//GlobalLock(P);
    59.     DWORD nBytesRead;
    60.     int bResult=ReadFile(hFile, p, dwFileSize, &nBytesRead, NULL);
    61.     if (hFile) CloseHandle(hFile);
    62.     printf("nBytesRead=%d\n",nBytesRead);      
    63.     if (!bResult || !p) printf("BAD_READ.....=%d \n",nBytesRead);
    64.     //  кончили загрузку файла
    65.  
    66.     PIMAGE_NT_HEADERS nt;
    67.  
    68.     nt = PIMAGE_NT_HEADERS(PCHAR(p)+ PIMAGE_DOS_HEADER(p)->e_lfanew);  
    69.    
    70.     PVOID q=NULL;
    71.  
    72.     q = VirtualAllocEx(pi.hProcess,PVOID(&nt->OptionalHeader.ImageBase),nt->Option alHeader.SizeOfImage,
    73. MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    74.    
    75.     WriteProcessMemory(pi.hProcess, q, p, nt->OptionalHeader.SizeOfHeaders,0);
    76.  
    77.     PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt);
    78.  
    79.     for (ULONG i = 0; i < nt->FileHeader.NumberOfSections; i++)
    80.     {
    81.         WriteProcessMemory(pi.hProcess,
    82.                            PCHAR(q) + sect[i].VirtualAddress,
    83.                            PCHAR(p) + sect[i].PointerToRawData,
    84.                            sect[i].SizeOfRawData, 0);
    85.  
    86.         ULONG x;
    87.  
    88.         VirtualProtectEx(   pi.hProcess,
    89.                             PCHAR(q) + sect[i].VirtualAddress,
    90.                             sect[i].Misc.VirtualSize,
    91.                             protect(sect[i].Characteristics),
    92.                             &x);
    93.     }
    94.  
    95.     WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &q, sizeof q,0);
    96.  
    97.     context.Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint;
    98.  
    99.     SetThreadContext(pi.hThread, &context);    
    100.  
    101.     printf("END OF START OTHER PROC----!= %d\n",ResumeThread(pi.hThread));
    102.     getch();
    103.  
    104.     return 0;
    105. }
    106.  
     
  10. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    IgorOK

    запусти _оригинальный_ пример - он работает ?
     
  11. IgorOK

    IgorOK New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    12
    Адрес:
    Ukraine
    TarasCo

    Может у Вас найдется пару строчек готового кода, для решения дайной проблемы, предложенным Вами способом?
     
  12. IgorOK

    IgorOK New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    12
    Адрес:
    Ukraine
  13. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    IgorOK

    странно. У меня на VC .NET собралось с полпинка без проблем. Глянь какимнить reshacker-ом что у тебя с ресурсами происходит. По идее и твой пример должен работать. Попробуй не с cmd а с explorer (как в оригинале).



    ps: надеюсь ты ресурс создаешь как RCData ?
     
  14. IgorOK

    IgorOK New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    12
    Адрес:
    Ukraine
    ресурс создаю как RCData. Reshacker-ом смотрел тоже ок все... Полдня потратил, а результата нет.. наверное что-то очень простое и очевидное, а я не вижу!
     
  15. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    давай мыло
     
  16. _animaTOR_

    _animaTOR_ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    58
  17. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    остальные желающие стучатся к _animaTOR_...
     
  18. _animaTOR_

    _animaTOR_ New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    58
    infern0



    Спасибо и ...

    ... ййййЕСТЬ товарищь капитан ! :)
     
  19. IgorOK

    IgorOK New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2005
    Сообщения:
    12
    Адрес:
    Ukraine
    Большое спасибо всем! Пример от Garry Nebbet

    http://www.google.ru/groups?selm=3e7f8d41%240%24227%24cc9e4d1f%40news. dial.pipex.com&output=gplain

    действительно рабочий



    если строку PVOID p = LockResource(LoadResource(0, FindResource(0, "Image","EXE")));

    заменить на

    P=GlobalAlloc(GMEM_FIXED, dwFileSize);

    LPVOID p= GlobalLock (P);

    и туда записать код ЕХЕ, то тоже работает ок...



    Хочу заметить, что этот пример загружает только ехе-файлы под винду. Если надо DOS-exe, то надо переделывать немного.





    А как таким-же способом загрузить DLL??
     
  20. Max

    Max Member

    Публикаций:
    0
    Регистрация:
    22 май 2003
    Сообщения:
    192
    _animaTOR_

    можно примерчик кинуть на 2demax@мэйл.ру, а то по ссылке не качается :dntknw: