перехват CreateProcess =\

Discussion in 'WASM.BEGINNERS' started by LazzY, Mar 29, 2007.

  1. TermoSINteZ

    TermoSINteZ Синоби даоса Staff Member

    Blog Posts:
    2
    Joined:
    Jun 11, 2004
    Messages:
    3,568
    Location:
    Russia
    Great
    Я думал про r3 разговор )
     
  2. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Joined:
    Nov 24, 2006
    Messages:
    5,582
    PS. Отладчик не нужен, достаточно глянуть на экспорт ntdll ;)
     
  3. z0mailbox

    z0mailbox z0

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

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

    Enils New Member

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

    Atlantic Member

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

    bolkin New Member

    Blog Posts:
    0
    Joined:
    Jul 5, 2005
    Messages:
    34
    Location:
    Israel
    Посмотри здесь
    http://www.defendion.com/EliCZ/bugs/WinBugs.htm

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