Инжект ДЛЛ.Есть ли у кого 100% полноценный рабочий код?

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

  1. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    http://www.wasm.ru/forum/viewtopic.php?id=22171
    У меня такая же проблема.. Перехватываю в длл,которая уже внедрена в эксплорер.
    Ставлю перехват для глобализации,как в
    http://www.wasm.ru/article.php?article=apihook_1
    И вылетаю через раз,на CreateRemoteThread. Где-то в целевом процессе. Регистры нулевые.Главное,что не всегда. Жаль,что постят статьи без нормального тестинга.
    Так вот-в предыдущей теме,которая выше,это обсуждалось.Но к сожалению я там видел только обрывки кода на С++.И В АСМе не шарю.
    У меня большая просьба-есть ли у кого РАБОЧИЙ пример инжектирования длл в процесс?
    Огромное,заранее,спасибо!
     
  2. hwegh

    hwegh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    54
    У меня есть большая просьба - начинай думать головой, и нехрен создавать тупые посты на форумах. Если мозга нет, то статьи тебе не помогут.
     
  3. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    В статье написанна полная дребедень, отлавливать первый поток в системе надо по eip в контексте потока, если он = BaseThreadStart - то это просто поток в уже созданном процессе, а если = BaseProcessStart то первый поток в новом процессе. Т.е. мы создаем в длл поток, смотрим адрес начала и запоминаем его, дальше ловим все потоки с адресом начала не равным сохраненному.
     
  4. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    насколько я понял по твоему ответу-ты и понятия не имеешь о чем речь идет :)
    Если бы был "умный"-ответил бы :)
    Если ваш ГУРУ допускает ошибки в коде,то что уж мне ,смертному... ;)
    tylerdurdenСпасибо,что отозвался.
    Насколько я понял нужно создать любой поток в длл,получить структуру CONTEXT по GetThreadContext и посмотреть и запомнить значение DWORD Eip ?
    Затем если Eip перехваченого не совпадает с Eip,тогда только запускаем CreateRemoteThread?
    Я так все понял?
     
  5. hwegh

    hwegh New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    54
    Детка, не с твоими куриными мозгами судить о том, много ли я понимаю. Могу лишь с увереностью сказать, что гораздо больше тебя, но я не стану опускаться до разжевывания RTFM всяким малолетним дебилам.
     
  6. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    coocky
    Да, но дело в том что ты сможешь "глобализировать" свй перехват и на других юзеров только если твоя длл использует только ntdll и ничего боле, т.к. иначе ты не заинжектишь ее в smss.exe = потеряешь процессы при switch user. Я отказался от этого метода и сделал драйвер+сервис. Драйвер ставит процедуру нотификации на создание процесса и на загрузку длл, на старте процесса выделяю память (т.к. на нотификации о загрузке "image" стоит блокировка), на загрузке kernel32 шлю через LPC запрос сервису, и сервис инжектит длл через APC.
     
  7. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    tylerdurden
    Я видел твои топики,где ты используешь механизм APC . К сожалению у меня не работает :)
    Я,увы,не могу использовать драйвер,т.к. пишу только для работы из юзер-моде.Таковы требования на работе. :dntknw:

    Только что сделал предложеный выже вариант.
    Итак. В DLL_PROCESS_ATTACH делаю
    Код (Text):
    1.           DWORD dwThreadId;
    2.       HANDLE thrd =CreateThread(
    3.           NULL,              // default security attributes
    4.           0,                 // use default stack size  
    5.           MyThreadProc,        // thread function
    6.           NULL,             // argument to thread function
    7.           0,                 // use default creation flags
    8.           &dwThreadId);  
    9.       CONTEXT cnt;
    10.       cnt.ContextFlags = CONTEXT_FULL;
    11.       SuspendThread(thrd);
    12.       GetThreadContext(thrd,&cnt);
    13.       ResumeThread(thrd);
    14.      myEips= cnt.Eip;
    Все ок. Получил Eip.
    Затем ставлю перехват на ZwCreateThread и ZwResumeThread

    Запускаю блокнот.
    Попадаю в функцию перехватчик Создания потока
    Там код такой
    Код (Text):
    1. // Снимаю перехват ZwCreateThread и ZwResumeThread
    2.  
    3. if ((GetCurrentProcessId()!= ClientId->UniqueProcess)&&Eips!=ThreadContext->Eip)
    4.     {
    5.         //устанавливаем флаг создания нового процесса
    6.         NewProcess= TRUE;
    7.     }
    8.     //если надо, то запускаем нить
    9.     if (CreateSuspended==0 )
    10.  
    11.     {
    12.         ResumeThread(*ThreadHandle);
    13.     }
    14.  
    15. // Ставлю перехват ZwCreateThread и ZwResumeThread
    Затем попадаю на перехватчик возобновления потока
    Код (Text):
    1. // Снимаю перехват ZwCreateThread и ZwResumeThread
    2.  
    3.                   PTHREAD_BASIC_INFORMATION pki = NULL;
    4.                   pki=(PTHREAD_BASIC_INFORMATION) new THREAD_BASIC_INFORMATION ;
    5.    
    6. //получаю информацию о процессе владеющем этой нитью
    7.  
    8.         ULONG rl;
    9.     NTSTATUS st=pNtZwQueryInformationThread(ThreadHandle, 0, pki, sizeof(THREAD_BASIC_INFORMATION), &rl);
    10.     if(st==STATUS_SUCCESS)
    11.     {
    12.         if (pki->ClientId.UniqueProcess!= GetCurrentProcessId()&& (NewProcess==TRUE))
    13.  
    14.         {
    15.                           //Инжектирую через CreateRemoteThread
    16.             InjectProcess(pki->ClientId.UniqueProcess,szLibFile);
    17.             NewProcess= FALSE;
    18.  
    19.         }
    20.     }
    21.    
    22.     if(pki)
    23.     {
    24.         delete []pki;
    25.     }
    26.  
    27.     //вызываем оригинальную функцию
    28. NTSTATUS Result = pNtResumeThread(ThreadHandle, PreviusSuspendCount);
    29.  
    30. // Ставлю перехват ZwCreateThread и ZwResumeThread
    31.     return Result;
    Один хрен падаю.. Незнаю..:dntknw: Что делать. Вроде как все правильно понял
     
  8. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Причем падаю в kernell32.dll вот в таком месте 7C882FC4 add byte ptr [eax],al
    еах равен нулю
     
  9. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Нафига ты хукаешь CreateThread ? И зачем саспендишь поток ? Ты же создаешь его не саспендед... Ужас :) Да прямо в нем и сохраняй адрес BaseThreadStart, и id процесса сравнивать зачем... И не существует нормального способа снять перехват, говорю тебе забей ты на эту статью, там полный бред написан.
     
  10. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Сорри.Признаюсь.Для меня это новое.Я таким не занимался раньше,вот и вынужден был извращаться :)

    Я вроде как нашел статью (опять же здесь ),что для выполнения GetThreadContext нужно ,что б поток был Suspend
    Хорошо,я это вырежу.
    Да забил уже..Я немного не пойму твою методу.Можешь схематично обьяснить,что мне нужно делать.Код я не прошу..Просто 1. 2. 3.4. и т.д. Я совсем запутался...
     
  11. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Хорошо. Я немногу начну.Просьба только закончить.
    Итак.
    1. В DLL_PROCESS_ATTACH получаю Eip запущеного мной потока (любого).Запоминаю его.
    2.Ставлю перехват на ZwResumeThread.
    3. В функции перехватчике получаю Eip перехваченого потока.Сверяю его со своим myEip.
    4. Если не совпадает,тогда делают инжект через CreateRemoteThread

    ТАК?
     
  12. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Один фиг валится на CreateRemoteThread... :dntknw:(
    Неужели никто не может подсказать? Неужели так много прошу?
     
  13. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    coocky
    В общем проблема кода в статье, как и твоего кода в том, что CreateRemoteThread выполняется на процессе который еще не инициализирован, или мог еще не инициализироваться. Поэтому и через раз. Проблема известная и попадались на нее наверное уже все. Тебе надо при выполнении CreateRemoteThread быть 100% уверенным, что процесс инициализирован. Как именно, придеться придумать самому.
     
  14. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    Mental_Mirror
    Спасибо..
    Кстати,я заметил одну особенность (уже эксперементировал много раз) проблема происходит почти всегда,если сделать CreateRemoteThread FreeLibrary из своего приложения.
    Т.е как происходит
    1. Делаю CreateRemoteThread LoadLibrary из своего приложения-все отлично
    2. Нормально выполняется CreateRemoteThread из перехваченной функцией (кстати,попробуйте запустить дефрагментатор-и вы увидите,как пропадет меню,которое не инициализируется и вылетит ошибка)
    3. Выгружаю либу из своего приложения CreateRemoteThread FreeLibrary-все ок.Только вот трабла в том,что сделав снова пункт 1, CreateRemoteThread упадет.Причем падает всегда и на всех приложениях стабильно в одном месте -в kernell32.dll вот в таком месте 7C882FC4 add byte ptr [eax],al ..еах равен нулю

    Использую библиотеку Detours- никаких проблем нет, правда прийдется поднятся выше NativeApi. ЧТо уже для моего проекта ни есть хорошо. И еще-я не могу выгрузить либу,которая внедрена Detours через CreateRemoteThread
    Код выгрузки я использую,как у Рихтера.. Может у него не правильно,раз падает после него загрузка
    Жаль,что поделится идеями не могут.А многие кроме оскорблений ,ничего не знают.
    Ну что ж,спасибо и на этом..
    ?
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    coocky
    Ты прав, у Рихтера тоже не правильно.
     
  16. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
  17. coocky

    coocky New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2007
    Сообщения:
    195
    nester7,Mental_Mirror
    Я уже смотрел тот код,который на рутките.Однако у меня возник вопрос-а что надо засунуть в том злополучный файл shellcode.txt ? Подскажите хотя б это,дальше буду рыть сам..
     
  18. bolkin

    bolkin New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    34
    Адрес:
    Israel
    Не пробовал, насколько я понимаю там должен быть код который исполнится. Например 0xCC.
     
  19. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Mental_Mirror, а где этот кривой пример рихторовский? Что-то не вкурю...

    Да что тут рыть? Тебе уже дали ссылку где всё описано:

     
  20. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    coocky
    Пишешь на асме код в шел-код стиле и после компиляции вырезаешь его из EXE в shellcode.txt.

    nester7
    Тут имеется ввиду как раз момент в котором процесс открывается, а он может быть SUSPENDED изначально. Вот эта тонкость и не описывается. Он то глобализацию делает через SetWindowsHookEx.