Может ли процесс "размапить" сам себя?

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 16 дек 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Допустим
    1.Есть длл с каким то кодом ,который "размапливает" область памяти.
    2.Процесс грузит эту длл,и передает в ф-цию с этим кодом свою базу и размер занимаемый образом.
    3.Этот код стирает образ процесса из его АП,и нормально дорабатывает до конца.И при этом у системы невозникакет никаких исключений.

    Собственно вопрос - В винде пункт 3 возможен?Или такое можно сделать только со своим дочерним процессом?
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    возможен... если не будет потоков, которые будут пытаться исполнить размаппенный код...
     
  3. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Rel
    получается достаточно лишь заморозить потоки? %)
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Clyde
    убить тогда уж, да хоть на цикл бесконечный отправить, главное чтобы не обратились куда не надо.
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    В ф-ции дллки использую для анмапа ZwUnmapViewOfSection.Но как только она вызывается все валится.Что я не учел?
    ЗЫ:стек ф-ции в длл,и вызывающей её из основного имиджа не шарятся между собой?
     
  6. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    дык, ты хоть причину падения посмотри.
     
  7. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Всмысле причину???Я смотрел в ольке.Исключение генерится где то внутри ntdll.dll.Точнее в обертке ZwUnmapViewOfSection,если мои скромные познания ассемблера меня не подвели.А от чего оно так ,или нельзя так вообще делать.Или я что то не то передал этой ф-ции.Я хз :dntknw:
     
  8. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    покажи как вызываешь ZwUnmapViewOfSection верней ты должен был это сделать первым делом.
     
  9. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    как то вот так
    Код (Text):
    1. typedef LONG (NTAPI *ZwUnmapViewOfSection)(HANDLE, PVOID);
    2. .....................................................
    3. HMODULE ntll= LoadLibraryA("ntdll.dll");
    4. ZwUnmapViewOfSection _ZwUnmapViewOfSection=(ZwUnmapViewOfSection)GetProcAddress(ntll,"ZwUnmapViewOfSection");
    5. _ZwUnmapViewOfSection(GetCurrentProcess(),(void*)(имидж_база_процесса));
     
  10. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    надо анализировать. например пробуйте PEB поменять перед вызовом.
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    _nic
    Размапить, вроде, можно. Но закрыть файл, чтоб можно было удалить - нет

    В смысле? Это же один стек)
     
  12. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    _nic
    ZwUnmapViewOfSection вызывается из тогоже модуля, который анмапится? :))
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Код размапливания в дллки.Или его что надо вызывать отдельным потоком?
     
  14. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    да ек макарек, ты хоть код приведи где ошибка.
     
  15. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
  16. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    _nic
    Если ты размапливаешь сам себя, то на стеке для возврата из ZwUnmapViewOfSection у тебя останется адрес, который станет невалидным после размапливания. Другими словами - если модуль размапливает себя сам, то он должен это делать в памяти, НЕ принадлежащей образу файла (в заранее выделенной для этого памяти).
     
  17. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Значит все таки практически не возможно :dntknw: А если размапить дочерний процесс?Как в нем выполнение кода зафризить?Или он всеравно при анмапе крашнется ?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    _nic
    Да что ж вы за бред несёте)
    Почему невозможно? Элементарно ведь. Да и к тому же, у вас не тот случай - у вас же длл размапивает ехе, верно?

    И опять стопицотый раз повторяю, КОД В СТУДИЮ!
     
  19. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Код (Text):
    1. typedef LONG (NTAPI *ZwUnmapViewOfSection)(HANDLE, PVOID);
    2. typedef DWORD(*_EntryPointW)();
    3. _EntryPointW EntryPointW;
    4. extern "C" __declspec(dllexport) void SwapImage(char *img,DWORD sz)
    5. {
    6.     SetLastError(0);
    7.     DWORD szimg;
    8.     memcpy(&szimg,&sz,sizeof(DWORD));
    9.     char *dbgmsg=new char[1024];
    10.     char *Image=new char[(DWORD)szimg];
    11.     memcpy(Image,img,(DWORD)szimg);
    12.     delete []img;
    13.     HMODULE ntll= LoadLibraryA("ntdll.dll");
    14.     ZwUnmapViewOfSection _ZwUnmapViewOfSection=(ZwUnmapViewOfSection)GetProcAddress(ntll,"ZwUnmapViewOfSection");
    15.     DWORD toNT=( (IMAGE_DOS_HEADER*) Image)->e_lfanew;
    16.     IMAGE_NT_HEADERS *nt;
    17.     Image+=toNT;
    18.     nt=(IMAGE_NT_HEADERS *)Image;
    19.     Image-=toNT;
    20.     _ZwUnmapViewOfSection(GetCurrentProcess(),(void*)(nt->OptionalHeader.ImageBase));
    21.     if(GetLastError()!=0)
    22.     {
    23.         //wsprintfA(dbgmsg,"%d",GetLastError());
    24.         //MessageBoxA(0,dbgmsg,"!",MB_OK);
    25.     }
    26.     DWORD adr=(DWORD)VirtualAlloc((void*)(nt->OptionalHeader.ImageBase),(DWORD)szimg, MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN, PAGE_EXECUTE_READWRITE);
    27.     if(GetLastError()!=0)
    28.     {
    29.         //wsprintfA(dbgmsg,"%d",GetLastError());
    30.         //MessageBoxA(0,dbgmsg,"!",MB_OK);
    31.     }
    32.     memcpy((void*)adr,Image,(DWORD)szimg);
    33.     //MessageBoxA(0,"OK","",MB_OK);
    34.     EntryPointW=( DWORD(*)() )(nt->OptionalHeader.AddressOfEntryPoint);
    35.     delete []Image;
    36.     EntryPointW();
    37. }
     
  20. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    _nic
    еще желательно место где вылетает программа