Протестируйте, пожалуйста, мой дипломный проект на разных ядрах. При тестировании обнаружилась странная вещь: у тестера на железе продукт падает, у меня на виртуалке работает нормально(Причем падение на KiReadyList). Чем это может быть вызвано? Код (Text): PLIST_ENTRY GetXPDispatcherReadyList(){ int sigReadyList[] = {0x0F, 0xBE, 0x46, 0x33, 0x8D, 0x04, 0xC5, -2, -2, -2, -2 }; DWORD offset = FindDataBySignature(sigReadyList,Proc,11,1000); PLIST_ENTRY ReadyList = *mkptr(PLIST_ENTRY*,Proc,offset); */ PVOID Proc = GetKernelProc(L"KiDispatchInterrupt"); int sigProc[] = {0xC6, 0x47, 0x50, 0x01, 0xE8, -2, -2, -2, -2, 0xB1, 0x01}; DWORD offset = FindDataBySignature(sigProc,Proc,10,1000); PBYTE Proc2 = (PVOID)(*(PULONG)((ULONG)Proc + offset) + (ULONG)Proc + (ULONG)offset + 4); DWORD offset1=0; DWORD offset2=0; PLIST_ENTRY ReadyList; for(offset1=0x70;(Proc2[offset1] != 0x83) && (Proc2[offset1+1] != 0xc0) && (Proc2[offset1+2] != 0x60);offset1++); for(offset2=offset1+5;(Proc2[offset2] != 0x8D) && (Proc2[offset2+1] != 0x14) && (Proc2[offset2+2] != 0xCD);offset2++); ReadyList = *(PLIST_ENTRY*)((UINT)Proc2 + offset2 + 3); return ReadyList; } Так ищу ReadyListHead для всех ХР. Далее алгоритм везде одинаковый. Может кто найдёт ещё какие проблемы. Заранее спасибо. http://www.sendspace.com/file/brekfy - ссылка на продукт. P.S. если нужно могу выложить исходники
00401954 /72 02 jb short 00401958 - Jcc не может вызывать исключение, так как ссылок на эту инструкцию нет и ветвление в пределах страницы.
rmka Этот адрес в пользовательском ап, причём тут драйвер ? И вобще такие методы поиска следует откатывать в юзермоде. Берёте ядро от всех версий NT и тестируете на них свой парсер(Loadlibrary() etc). Хотел спросить у вас на счёт детекта. Дупустим мой код запустил есчо одну копию например svchost от имени другого системного процесса. При этом образ svchost не изменный. В этом процессе исполняется мой код. Как определить что это какойто левый процесс, тоесть паразитный. Если никак, то зачем скрывать процессы, если по факту сокрытия(в одних списках есть запись об процессе, в других нет - значит он скрыт) выполняется детект ?
Моя задача - поиск скрытых процессов. Поиск паразитных процессов совсем другая задача, и решается она по-другому. Код (Text): .text:00401945 call _GetDispatcherReadyList@0 ; GetDispatcherReadyList() .text:0040194A mov [ebp+end], eax .text:0040194D mov [ebp+var_14], 20h .text:00401954 .text:00401954 loc_401954: .text:00401954 mov esi, [eax] <---------------падает здесь .text:00401956 cmp esi, eax .text:00401958 jz loc_401A15 Падает потому что неверный указатель возвращается, GetDispatcherReadyList. GetDispatcherReadyList вызывает у меня для ХР только ф-ю из первого поста. Я ищу KiReadyList для ХР так: KiDispatchInterupt -> KiReadyThread -> далее ищу lea edx, _KiDispatcherReadyListHead[ecx*8]. Тут проблема ядра разные в зависимости от сервис паков: пример Код (Text): sp3 .text:00404749 mov byte ptr [eax+2Dh], 1 .text:0040474D add eax, 60h .text:00404750 test bl, bl .text:00404752 lea edx, _KiDispatcherReadyListHead[ecx*8] .text:00404759 jnz loc_401F0D .text:0040475F mov esi, [edx+4] .text:00404762 mov [eax], edx .text:00404764 mov [eax+4], esi .text:00404767 mov [esi], eax .text:00404769 mov [edx+4], eax sp1 .text:0041A425 mov eax, [ebp+var_8] .text:0041A428 mov byte ptr [eax+2Dh], 1 .text:0041A42C mov eax, [ebp+var_8] .text:0041A42F add eax, 60h .text:0041A432 cmp [ebp+var_1], bl .text:0041A435 lea edx, _KiDispatcherReadyListHead[ecx*8] .text:0041A43C jz short loc_41A45A .text:0041A43E mov esi, [edx] .text:0041A440 mov [eax], esi .text:0041A442 mov [eax+4], edx .text:0041A445 mov [esi+4], eax .text:0041A448 mov [edx], eax То есть общии части у них только .text:0041A42F add eax, 60h команда .text:0041A435 lea edx, _KiDispatcherReadyListHead[ecx*8] Сигнатуру составить трудно, поэтому я сначала искал add eax, 60h, затем lea(Код поиска в 1ом посте). Но видимо сигнатуры слабые. Есть ли способ найти KiDispatcherReadyListHead легче и для ХР(в prcb на сколько я знаю нет на него ссылок)?
вам и предлагается, написать код который будет скачивать символы, обрабатывать их и создавать базу этих смещений под текущее ядро, на машине пользователя конечно требуется доступ к интернет, либо локальное хранилище с набором необходимых вам данных
На него же куча ссылок в ядре, и везде почти юзается как lea reg1, KiDispatcherReadyListHead[reg2*8] можно вообще просканить дизасмом длин 2 функции какие-нибудь на наличие соотв инструкции и сравнить потом полученные адреса для надежности, на сп2, например есть ссылки из KeDelayExecutionThread и NtYieldExecution, обе функции находятся без проблем: одна экспорт, вторая - из сдт, я полагаю, что и в остальных сп ссылки будут тоже, хотя нужно конечно проверить, а вообще мне кажется и одной функции скана будет достаточно..
expert Память гранулярна. Не может пол страницы быть RE, а остальная часть NA Если ветвление в другую страницу, то может быть фолт. Или если есть ссылка на ветвление, которое в NA странице, тогда будет фолт. А если нет ссылок, то предыдущая инструкция была исполнена. Значит инфа про фолт инвалидная. Velheart Одного LDE не достаточно. Ссылок то куча, но они не сгрупированы в пределах одной процедуры, а размазаны по всему модулю. И чтобы отделить их нужно описать код графом. Иначе никак.