перехват CreateProcess =\

Тема в разделе "WASM.BEGINNERS", создана пользователем LazzY, 29 мар 2007.

  1. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    Great
    Я думал про r3 разговор )
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    PS. Отладчик не нужен, достаточно глянуть на экспорт ntdll ;)
     
  3. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    говоришь |= CREATE_SUSPENDED
    вызываешь настоящий CreateProcess, получаешь Handle процесса
    с помощью последовательности ReadProcessMemory в основном модуле по PE-хедеру находишь EntryPoint, запоминаешь ее
    копируешь ( WriteProcessMemory ) код такой же как для RemoteThread-а
    пишешь вместо оригинального EntryPoint адрес этого кода
    говоришь ResumeThread - при этом управление передается на этот твой код
    в конце его делаешь jump на сохраненный EntryPoint

    короче - все как ты делал но без CreateRemoteThread
    лично я так делал и все работало
     
  4. Enils

    Enils New Member

    Публикаций:
    0
    Регистрация:
    30 авг 2007
    Сообщения:
    1
    Думаю обсуждение уже закрыто, судя по дате, но хочу добавить кое-что для тех, кто будет писать код основываясь на приведенных здесь. Дело в том, что была упушена одна маленькая, но немаловажная деталь. Суть в изменении флагов:
    В конце приведенных здесь процедур безусловно вызывается ResumeThread, совершенно не учитывая тот факт, что вызывающий процесс (не знающий о перехвате) мог создавать процесс с УЖЕ УСТАНОВЛЕННЫМ флагом CREATE_SUSPENDED. Для него (процесса) будет неприятной неожиданностью (которая возможно приведет к нарушению работы), что "функция kernel32" полностью проигнорировала его запрос и создала запущеный процесс. Помимо всего выше сказанного, надо внести следующие изменения в приведенный код:
    Код (Text):
    1. DWORD  SaveFlags = dwCreationFlags; //сохраняем оригинальное значение флагов
    2. dwCreationFlags|=CREATE_SUSPENDED;
    3. ... //здесь выполняем все прочие действия
    4. if (! (SaveFlags && CREATE_SUSPENDED) ) //Запускаем поток только если об этом "просили"
    5.   ResumeThread(lpProcessInformation->hThread);
     
  5. Atlantic

    Atlantic Member

    Публикаций:
    0
    Регистрация:
    22 июн 2005
    Сообщения:
    322
    Адрес:
    Швеция
    Enils
    С этим ответом ты действительно припозднился :) Все уже было разжевано вдоль и поперек в этом же топике на сорцах.ру: http://forum.sources.ru/index.php?showtopic=177691&st=15
     
  6. bolkin

    bolkin New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    34
    Адрес:
    Israel
    Посмотри здесь
    http://www.defendion.com/EliCZ/bugs/WinBugs.htm

    Remote thread into not-yet-initialized process causes various failures in that process