Harry Nebbet's code

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

  1. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Воспроизвожу функциональность http://groups.google.com/group/comp.os.ms-windows.programmer.win32/msg /dc50c11b65252f37

    на дельфе.



    1) Так ли нужен ZWUnMapViewOfFile? Этот вызов я опустил для совместимости с win9x



    2) Вызов WriteProcessMemory(pi.hProcess­, PCHAR(context.Ebx) + 8, &q, sizeof q, 0) после загрузки новых секций. Что это вообще такое? Зачем и для чего?



    3) Почему Гарри не меняет еip, а лишь eax?



    4) Гарри аллоцирует память и считает,что вызов прошел удачно. Это потому,что cmd.exe имеет нестандартный BaseAddress? Или даже если программа-донор будет иметь тот же BaseAddress,то я смогу заново сделать VirtualAlloc на занимаемое ее имиджем место?



    5) Релоки. Необходимо ли их учитывать,или загрузчик после ResumeThread их самобработает? А их необходимо учитывать,если я попытаюсь запустить программу с BaseAddress $1000000 под Win98



    Благодарю за внимание )
     
  2. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    Во-первых, (все?) примеры Неббета только под NT. Что там будет под 9х, IMHO, никто не знает.



    1. Нужен. Он балансирует вызов ZwCreateSection, который делает CreateProcess. Если не будет ZwUnmapViewOfSection, то первоначальный образ процесса останется в памяти.



    2. Копирование нового адреса образа в целевой PEB. PEB.ImageBaseAddress = NewImageBase



    3. Это и есть косвенная установка eip. В eax помещается адрес новой точки входа.



    4. Да, из-за "нестандартного" ImageBase. Если базы совпадут, то естественно будет облом.



    5. Релоки загрузчик настраивает ещё до того, как вернётся CreateProcess. Если загрузка будет не по Preffered Image Base, то релоки надо настроить самому. И кажись с импортом тоже придется возиться.
     
  3. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Юлагодарю



    Кстати,по поводу импорта:

    Судя повсему,импорты загрузчик настраивает после ResumeThread. Имею основание так утверждать,потому что

    мой предыдущий проект раскриптовывал секцию импорта именно в таком вот процессе и затем делал ResumeThread.

    Из этого следует,чтопосле возврата управления в процесс загрузчик просматривал раскриптованную секцию импорта и настраивал таблицу импорта. В связи с этим вопрос:

    Кто-нибудь может сказатьполностью,какую работу загрузчик делает после ResumeThread в CREATE_SUSPENDED процессе?



    Далее, по пункту 1) Не понимаю. зачем нужно что-то балансировать? Какую роль играет эта секция в дальнейшей жизни процесса?



    2) Ясно. в Win9x какие из этапов загрузки требуют пристального внимания (в связи с отсутствием PEB) ?
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ SomeOne_TT</font><!--color--><font color="gray]: Судя повсему,импорты загрузчик настраивает после ResumeThread. ]</font><!--color-->



    Думаю, это исключено. После возврата из CreateProcess образ полностью настроен, т.е. загрузчик сделал всё что от него требовалось. Образ полностью готов к работе, а то что главный поток приостановлен - это совсем другая история и к загрузчику никакого отношения не имеет. В MSDN есть статья "What Goes On Inside Windows 2000: Solving the Mysteries of the Loader". Там даже исходники есть. Не помню, написано там об этом конкретно или нет, но по-любому почитать стОит.





    <font color="gray][ SomeOne_TT</font><!--color--><font color="gray]: Далее, по пункту 1) Не понимаю. зачем нужно что-то балансировать? Какую роль играет эта секция в дальнейшей жизни процесса? ]</font><!--color-->



    Для загрузки образов в память используется универсальная технология "Memory Mapped File". Разница только во флагах. Для образов SEC_IMAGE. Для просто MMF, этого флага не будет. Пока жив MMF или образ, должен существовать объект "секция", который является внутренней управляющей структурой. Если объект "умирает", то умирает и MMF или образ. Пока "жив" объект "секция", MMF или образ остается в памяти (подкачка не в счёт). Неббету нужно, чтобы изначальный образ был удален, поэтому он и закрывает объект. У того же Неббета в книге есть ещё один очень хороший пример - создание процесса с помощью native-функций. Посмотри его - станет понятнее.





    <font color="gray][ SomeOne_TT</font><!--color--><font color="gray]: 2) Ясно. в Win9x какие из этапов загрузки требуют пристального внимания (в связи с отсутствием PEB) ? ]</font><!--color-->



    Тут я пас. Как я уже говорил, пример изначально предназначен для линейки NT. К тому же используются чисто NT'шные недокументированные трюки. Так что говорить об Win9x, IMHO, вообще не приходится.
     
  5. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    (как делать цитирование - я не нашел ) )



    Забавно, но я в самом деле восстанавливал секцию импорта из каши и все работало. Почему? LoadLibrary и GetProcAddress я не юзал.



    Далее,зачем мне сдался этот файл образ? живет он в памяти - и пусть живет. Исполнять-то я буду код в других страницах. Или этот образ нужен для COPY-ON-WRITE'a ?



    Благодарю за ответы )
     
  6. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    С цитированием каждый извращается как может.



    Про секцию импорта и кашу я не понял ;)



    Старый образ больше ни для чего не нужен. Именно поэтому он и удаляется. Если тебе это не мешает, ну оставь, только в оригинальном примере если убрать ZwUnmapViewOfSection, то окно командной строки остается на экране. Что будет если для донора юзать другой exe, я не знаю, экспериментировать некогда. Я только не понимаю, если старый образ прекрасно удаляется одним вызовом, зачем это убирать. Если для совместимости с 9x... А что остальные фичи типа PCHAR(context.Ebx) + 8 там работают? Если всё работает и проблема только в ZwUnmapViewOfSection, ну убери её.
     
  7. SomeOne_TT

    SomeOne_TT New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2005
    Сообщения:
    39
    Увы,если бы все работало - меня бы здесь не было )



    Секция импорта:

    есть экзешник,у которого поксорена секция импорта и много чего другого. Я это .ехе загружаю с помощью CreateProcess+CREATE_SUSPENDED. Затем я повторно ксорю секцию импорта (восстанавливаю ее). Запускаю процесс. Процесс нормально отрабатывает.



    Вывод: после восстановления секции импорта виндовый лоадер настраивает импорт.

    P.S. релоки я фиксил сам.



    P.P.S. Видимо придется засучить руки и,не надеясь на простое решение Гарри, выстроить универсальное под все версии винды решение - перехват управления из EP, замена всей начинки .ехе своим,настройка импорта-экспорта-релоков ручками. Так-то работать будет? да еще предусмотреть два .ехе-донора - консольный и гуишный.
     
  8. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    <font color="gray][ SomeOne_TT</font><!--color--><font color="gray]: Так-то работать будет? ]</font><!--color-->



    Что делает Неббет я объяснил как мог, а что там будет... Пробуй.
     
  9. sl0n

    sl0n Мамонт дзена **

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

    есть экзешник,у которого поксорена секция импорта и много чего другого. Я это .ехе загружаю с помощью CreateProcess+CREATE_SUSPENDED. Затем я повторно ксорю секцию импорта (восстанавливаю ее). Запускаю процесс. Процесс нормально отрабатывает.



    Вывод: после восстановления секции импорта виндовый лоадер настраивает импорт.

    --------------------------------------------------------

    Вывод не верный, во многих экзешниках импорт изначально настроен, то есть заполнен адресами ... и если ты к примеру там проверяешь на каком нить системном екзешнике из винды , то вполне возможно что это будет работать .. но не факт что это будет работать везде