Поиск скрытых процессов. Тест.

Тема в разделе "WASM.NT.KERNEL", создана пользователем haxorart, 15 май 2011.

  1. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Протестируйте, пожалуйста, мой дипломный проект на разных ядрах. При тестировании обнаружилась странная вещь: у тестера на железе продукт падает, у меня на виртуалке работает нормально(Причем падение на KiReadyList). Чем это может быть вызвано?

    Код (Text):
    1. PLIST_ENTRY GetXPDispatcherReadyList(){
    2.     int sigReadyList[] = {0x0F, 0xBE, 0x46, 0x33,
    3.                          0x8D, 0x04, 0xC5, -2,  -2, -2, -2
    4.                         };
    5.     DWORD offset = FindDataBySignature(sigReadyList,Proc,11,1000);
    6.     PLIST_ENTRY ReadyList = *mkptr(PLIST_ENTRY*,Proc,offset); */
    7.     PVOID Proc =  GetKernelProc(L"KiDispatchInterrupt");
    8.     int sigProc[] = {0xC6, 0x47, 0x50, 0x01,
    9.                      0xE8, -2, -2, -2, -2,
    10.                      0xB1, 0x01};
    11.     DWORD offset = FindDataBySignature(sigProc,Proc,10,1000);
    12.     PBYTE Proc2 = (PVOID)(*(PULONG)((ULONG)Proc + offset) + (ULONG)Proc + (ULONG)offset + 4);
    13.     DWORD offset1=0;
    14.     DWORD offset2=0;
    15.     PLIST_ENTRY ReadyList;
    16.     for(offset1=0x70;(Proc2[offset1] != 0x83) && (Proc2[offset1+1] != 0xc0) && (Proc2[offset1+2] != 0x60);offset1++);
    17.     for(offset2=offset1+5;(Proc2[offset2] != 0x8D) && (Proc2[offset2+1] != 0x14) && (Proc2[offset2+2] != 0xCD);offset2++);
    18.  
    19.  
    20.     ReadyList = *(PLIST_ENTRY*)((UINT)Proc2 + offset2 + 3);
    21.     return ReadyList;
    22. }
    Так ищу ReadyListHead для всех ХР. Далее алгоритм везде одинаковый. Может кто найдёт ещё какие проблемы. Заранее спасибо.

    http://www.sendspace.com/file/brekfy - ссылка на продукт.

    P.S. если нужно могу выложить исходники
     
  2. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    Упал здесь: .00401954
     
  3. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Какая винда?
     
  4. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    XP SP3. Минидамп надо?
     
  5. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    00401954 /72 02 jb short 00401958 - Jcc не может вызывать исключение, так как ссылок на эту инструкцию нет и ветвление в пределах страницы.
     
  6. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    gaeprust
    Я про драйвер.
     
  7. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    rmka
    Этот адрес в пользовательском ап, причём тут драйвер ?

    И вобще такие методы поиска следует откатывать в юзермоде. Берёте ядро от всех версий NT и тестируете на них свой парсер(Loadlibrary() etc).

    Хотел спросить у вас на счёт детекта. Дупустим мой код запустил есчо одну копию например svchost от имени другого системного процесса. При этом образ svchost не изменный. В этом процессе исполняется мой код. Как определить что это какойто левый процесс, тоесть паразитный. Если никак, то зачем скрывать процессы, если по факту сокрытия(в одних списках есть запись об процессе, в других нет - значит он скрыт) выполняется детект ?
     
  8. rmka

    rmka Member

    Публикаций:
    0
    Регистрация:
    22 окт 2010
    Сообщения:
    108
    gaeprust
    Ладно, тогда такой адрес B6733954
     
  9. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Моя задача - поиск скрытых процессов. Поиск паразитных процессов совсем другая задача, и решается она по-другому.

    Код (Text):
    1. .text:00401945                 call    _GetDispatcherReadyList@0 ; GetDispatcherReadyList()
    2. .text:0040194A                 mov     [ebp+end], eax
    3. .text:0040194D                 mov     [ebp+var_14], 20h
    4. .text:00401954
    5. .text:00401954 loc_401954:                      
    6. .text:00401954                 mov     esi, [eax]                      <---------------падает здесь
    7. .text:00401956                 cmp     esi, eax
    8. .text:00401958                 jz      loc_401A15
    Падает потому что неверный указатель возвращается, GetDispatcherReadyList. GetDispatcherReadyList вызывает у меня для ХР только ф-ю из первого поста. Я ищу KiReadyList для ХР так: KiDispatchInterupt -> KiReadyThread -> далее ищу lea edx, _KiDispatcherReadyListHead[ecx*8]. Тут проблема ядра разные в зависимости от сервис паков:



    пример
    Код (Text):
    1. sp3
    2.  
    3. .text:00404749                 mov     byte ptr [eax+2Dh], 1
    4. .text:0040474D                 add     eax, 60h
    5. .text:00404750                 test    bl, bl
    6. .text:00404752                 lea     edx, _KiDispatcherReadyListHead[ecx*8]
    7. .text:00404759                 jnz     loc_401F0D
    8. .text:0040475F                 mov     esi, [edx+4]
    9. .text:00404762                 mov     [eax], edx
    10. .text:00404764                 mov     [eax+4], esi
    11. .text:00404767                 mov     [esi], eax
    12. .text:00404769                 mov     [edx+4], eax
    13.  
    14.  
    15. sp1
    16.  
    17. .text:0041A425                 mov     eax, [ebp+var_8]
    18. .text:0041A428                 mov     byte ptr [eax+2Dh], 1
    19. .text:0041A42C                 mov     eax, [ebp+var_8]
    20. .text:0041A42F                 add     eax, 60h
    21. .text:0041A432                 cmp     [ebp+var_1], bl
    22. .text:0041A435                 lea     edx, _KiDispatcherReadyListHead[ecx*8]
    23. .text:0041A43C                 jz      short loc_41A45A
    24. .text:0041A43E                 mov     esi, [edx]
    25. .text:0041A440                 mov     [eax], esi
    26. .text:0041A442                 mov     [eax+4], edx
    27. .text:0041A445                 mov     [esi+4], eax
    28. .text:0041A448                 mov     [edx], eax
    29.  
    30. То есть общии части у них только
    31.  
    32. .text:0041A42F                 add     eax, 60h
    33. команда
    34. .text:0041A435                 lea     edx, _KiDispatcherReadyListHead[ecx*8]
    Сигнатуру составить трудно, поэтому я сначала искал add eax, 60h, затем lea(Код поиска в 1ом посте). Но видимо сигнатуры слабые. Есть ли способ найти KiDispatcherReadyListHead легче и для ХР(в prcb на сколько я знаю нет на него ссылок)?
     
  10. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    скачать символы с symbol server, получить адрес по имени
     
  11. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    Нужно универсально под все ядра ХР. Неужели нет другого способа кроме жесткой зашивки?
     
  12. fsd

    fsd New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2010
    Сообщения:
    353
    вам и предлагается, написать код который будет скачивать символы, обрабатывать их и создавать базу этих смещений под текущее ядро, на машине пользователя
    конечно требуется доступ к интернет, либо локальное хранилище с набором необходимых вам данных
     
  13. expert

    expert New Member

    Публикаций:
    0
    Регистрация:
    19 янв 2009
    Сообщения:
    151
    gaeprust
    а если jb находится в конце страницы? :lol:
     
  14. Velheart

    Velheart New Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    526
    На него же куча ссылок в ядре, и везде почти юзается как lea reg1, KiDispatcherReadyListHead[reg2*8] можно вообще просканить дизасмом длин 2 функции какие-нибудь на наличие соотв инструкции и сравнить потом полученные адреса для надежности, на сп2, например есть ссылки из KeDelayExecutionThread и NtYieldExecution, обе функции находятся без проблем: одна экспорт, вторая - из сдт, я полагаю, что и в остальных сп ссылки будут тоже, хотя нужно конечно проверить, а вообще мне кажется и одной функции скана будет достаточно..
     
  15. haxorart

    haxorart New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    123
    А на других осях норм работает?
     
  16. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    haxorart, дизасм - сила.
     
  17. gaeprust

    gaeprust New Member

    Публикаций:
    0
    Регистрация:
    2 май 2011
    Сообщения:
    188
    expert
    Память гранулярна. Не может пол страницы быть RE, а остальная часть NA :lol:
    Если ветвление в другую страницу, то может быть фолт. Или если есть ссылка на ветвление, которое в NA странице, тогда будет фолт. А если нет ссылок, то предыдущая инструкция была исполнена. Значит инфа про фолт инвалидная.

    Velheart
    Одного LDE не достаточно. Ссылок то куча, но они не сгрупированы в пределах одной процедуры, а размазаны по всему модулю. И чтобы отделить их нужно описать код графом. Иначе никак.