пятница, 30 декабря 2011 г.

wincheck rc8.5

download mirror
Changelog:
  • add -sched option to dump threads from scheduler structures. Warning: since XP scheduler contains in wait list not all waiting threads
  • improved support of old wk2 (sp1/sp2/sp3)

четверг, 29 декабря 2011 г.

swapped worker threads

оказывается бывает и такое
Вот например system worker из тех что отсутствуют в KiWaitListHead:
dt -r1 _KTHREAD 8A8B1C98
ntdll!_KTHREAD
   +0x000 Header           : _DISPATCHER_HEADER
      +0x000 Type             : 0x6 ''
      +0x001 Absolute         : 0 ''
      +0x002 Size             : 0x70 'p'
      +0x003 Inserted         : 0 ''
      +0x004 SignalState      : 0
      +0x008 WaitListHead     : _LIST_ENTRY [ 0x8a8b1ca0 - 0x8a8b1ca0 ]
   +0x010 MutantListHead   : _LIST_ENTRY [ 0x8a8b1ca8 - 0x8a8b1ca8 ]
      +0x000 Flink            : 0x8a8b1ca8 _LIST_ENTRY [ 0x8a8b1ca8 - 0x8a8b1ca8 ]
      +0x004 Blink            : 0x8a8b1ca8 _LIST_ENTRY [ 0x8a8b1ca8 - 0x8a8b1ca8 ]
   +0x018 InitialStack     : 0xba4e0000
   +0x01c StackLimit       : 0xba4dd000
   +0x020 Teb              : (null)
   +0x024 TlsArray         : (null)
   +0x028 KernelStack      : 0xba4dfd24
   +0x02c DebugActive      : 0 ''
   +0x02d State            : 0x5 ''
   +0x02e Alerted          : [2]  ""
   +0x030 Iopl             : 0 ''
   +0x031 NpxState         : 0xa ''
   +0x032 Saturation       : 0 ''
   +0x033 Priority         : 13 ''
   +0x034 ApcState         : _KAPC_STATE
      +0x000 ApcListHead      : [2] _LIST_ENTRY [ 0x8a8b1ccc - 0x8a8b1ccc ]
      +0x010 Process          : 0x8a8b2830 _KPROCESS
      +0x014 KernelApcInProgress : 0 ''
      +0x015 KernelApcPending : 0 ''
      +0x016 UserApcPending   : 0 ''
   +0x04c ContextSwitches  : 0x6eb9
   +0x050 IdleSwapBlock    : 0 ''
   +0x051 Spare0           : [3]  ""
   +0x054 WaitStatus       : 0
   +0x058 WaitIrql         : 0 ''
   +0x059 WaitMode         : 1 ''
   +0x05a WaitNext         : 0 ''
   +0x05b WaitReason       : 0xf ''
   +0x05c WaitBlockList    : 0x8a8b1d08 _KWAIT_BLOCK
      +0x000 WaitListEntry    : _LIST_ENTRY [ 0x8a8b1a90 - 0x80564828 ]
      +0x008 Thread           : 0x8a8b1c98 _KTHREAD
      +0x00c Object           : 0x80564820
      +0x010 NextWaitBlock    : 0x8a8b1d08 _KWAIT_BLOCK
      +0x014 WaitKey          : 0
      +0x016 WaitType         : 1
   +0x060 WaitListEntry    : _LIST_ENTRY [ 0x0 - 0x8055c4a8 ]
      +0x000 Flink            : (null)
      +0x004 Blink            : 0x8055c4a8 _LIST_ENTRY [ 0x895aab20 - 0x89a43c28 ]
   +0x060 SwapListEntry    : _SINGLE_LIST_ENTRY
      +0x000 Next             : (null)
   +0x068 WaitTime         : 0x46a46
   +0x06c BasePriority     : 13 ''
   +0x06d DecrementCount   : 0x10 ''
   +0x06e PriorityDecrement : 0 ''
   +0x06f Quantum          : 3 ''
   +0x070 WaitBlock        : [4] _KWAIT_BLOCK
      +0x000 WaitListEntry    : _LIST_ENTRY [ 0x8a8b1a90 - 0x80564828 ]
      +0x008 Thread           : 0x8a8b1c98 _KTHREAD
      +0x00c Object           : 0x80564820
      +0x010 NextWaitBlock    : 0x8a8b1d08 _KWAIT_BLOCK
      +0x014 WaitKey          : 0
      +0x016 WaitType         : 1
   +0x0d0 LegoData         : (null)
   +0x0d4 KernelApcDisable : 0
   +0x0d8 UserAffinity     : 3
   +0x0dc SystemAffinityActive : 0 ''
   +0x0dd PowerState       : 0 ''
   +0x0de NpxIrql          : 0 ''
   +0x0df InitialNode      : 0 ''
   +0x0e0 ServiceTable     : 0x8055c700
   +0x0e4 Queue            : 0x80564820 _KQUEUE
      +0x000 Header           : _DISPATCHER_HEADER
      +0x010 EntryListHead    : _LIST_ENTRY [ 0x80564830 - 0x80564830 ]
      +0x018 CurrentCount     : 0
      +0x01c MaximumCount     : 2
      +0x020 ThreadListHead   : _LIST_ENTRY [ 0x8a8b1db0 - 0x89fadaa0 ]
   +0x0e8 ApcQueueLock     : 0
   +0x0f0 Timer            : _KTIMER
      +0x000 Header           : _DISPATCHER_HEADER
      +0x010 DueTime          : _ULARGE_INTEGER 0xa`644f6499
      +0x018 TimerListEntry   : _LIST_ENTRY [ 0x8055ce00 - 0x8a322670 ]
      +0x020 Dpc              : (null)
      +0x024 Period           : 0
   +0x118 QueueListEntry   : _LIST_ENTRY [ 0x8a8b1b38 - 0x80564840 ]
      +0x000 Flink            : 0x8a8b1b38 _LIST_ENTRY [ 0x8a8b18c0 - 0x8a8b1db0 ]
      +0x004 Blink            : 0x80564840 _LIST_ENTRY [ 0x8a8b1db0 - 0x89fadaa0 ]
   +0x120 SoftAffinity     : 3
   +0x124 Affinity         : 3
   +0x128 Preempted        : 0 ''
   +0x129 ProcessReadyQueue : 0 ''
   +0x12a KernelStackResident : 0 ''
   +0x12b NextProcessor    : 0x1 ''
   +0x12c CallbackStack    : (null)
   +0x130 Win32Thread      : (null)
   +0x134 TrapFrame        : (null)
   +0x138 ApcStatePointer  : [2] 0x8a8b1ccc _KAPC_STATE
      +0x000 ApcListHead      : [2] _LIST_ENTRY [ 0x8a8b1ccc - 0x8a8b1ccc ]
      +0x010 Process          : 0x8a8b2830 _KPROCESS
      +0x014 KernelApcInProgress : 0 ''
      +0x015 KernelApcPending : 0 ''
      +0x016 UserApcPending   : 0 ''
   +0x140 PreviousMode     : 0 ''
   +0x141 EnableStackSwap  : 0x1 ''
   +0x142 LargeStack       : 0 ''
   +0x143 ResourceIndex    : 0x1 ''
   +0x144 KernelTime       : 0x19
   +0x148 UserTime         : 0
   +0x14c SavedApcState    : _KAPC_STATE
      +0x000 ApcListHead      : [2] _LIST_ENTRY [ 0x8a8b1de4 - 0x8a8b1de4 ]
      +0x010 Process          : (null)
      +0x014 KernelApcInProgress : 0 ''
      +0x015 KernelApcPending : 0 ''
      +0x016 UserApcPending   : 0 ''
   +0x164 Alertable        : 0 ''
   +0x165 ApcStateIndex    : 0 ''
   +0x166 ApcQueueable     : 0x1 ''
   +0x167 AutoAlignment    : 0 ''
   +0x168 StackBase        : 0xba4e0000
   +0x16c SuspendApc       : _KAPC
      +0x000 Type             : 18
      +0x002 Size             : 48
      +0x004 Spare0           : 0
      +0x008 Thread           : 0x8a8b1c98 _KTHREAD
      +0x00c ApcListEntry     : _LIST_ENTRY [ 0x0 - 0x0 ]
      +0x014 KernelRoutine    : 0x80502f64        void  nt!KiSuspendNop+0
      +0x018 RundownRoutine   : 0x80502f6c        void  nt!PopDispatchProcessorPolicyCallout+0
      +0x01c NormalRoutine    : 0x80502f74        void  nt!KiSuspendThread+0
      +0x020 NormalContext    : (null)
      +0x024 SystemArgument1  : (null)
      +0x028 SystemArgument2  : (null)
      +0x02c ApcStateIndex    : 0 ''
      +0x02d ApcMode          : 0 ''
      +0x02e Inserted         : 0 ''
   +0x19c SuspendSemaphore : _KSEMAPHORE
      +0x000 Header           : _DISPATCHER_HEADER
      +0x010 Limit            : 2
   +0x1b0 ThreadListEntry  : _LIST_ENTRY [ 0x8a8b1bd0 - 0x8a8b2660 ]
      +0x000 Flink            : 0x8a8b1bd0 _LIST_ENTRY [ 0x8a8b1958 - 0x8a8b1e48 ]
      +0x004 Blink            : 0x8a8b2660 _LIST_ENTRY [ 0x8a8b1e48 - 0x8a8b2880 ]
   +0x1b8 FreezeCount      : 0 ''
   +0x1b9 SuspendCount     : 0 ''
   +0x1ba IdealProcessor   : 0x1 ''
   +0x1bb DisableBoost     : 0 ''
GetContextState failed, 0x80004001
Стека в памяти нету, State 5 - это WAIT
Можно даже посмотреть на чем оно ждет:

dt _DISPATCHER_HEADER 0x80564820
ntdll!_DISPATCHER_HEADER
   +0x000 Type             : 0x4 ''
   +0x001 Absolute         : 0 ''
   +0x002 Size             : 0xa ''
   +0x003 Inserted         : 0 ''
   +0x004 SignalState      : 0
   +0x008 WaitListHead     : _LIST_ENTRY [ 0x8a8b1d08 - 0x8a8b15a0 ]

4 - это Queue
Приехали

Offtopic: нашлась полезная дока по курсу на основе WRK. Universities of China, канешна же

вторник, 27 декабря 2011 г.

scheduling on xp - wtf ?

а вот например я сегодня написал код, проходящий по всяким глубоко внутренним структурам планировщика. Например на моей тестовой xp 32bit показывает примерно такое:

понедельник, 26 декабря 2011 г.

компутерная археология

завел давеча под VBox windows 2000 без sp с целью всяких бесчеловечных опытов над wincheck

Хер найдешь нынче дистрибутив w2k в этих ваших инторнетах - только набор service packs нашел. На msdn w2k давно выпилили. Пришлось лезть на антресоли - нашел дистрибутив где-то на копии msdn апреля 2000. cdr болванка как ни странно до сих пор читается, да, хотя мой бывший препод по сопромату мамой клялся что дольше 10 лет они не проживут

Пребываю в задумчивости

воскресенье, 25 декабря 2011 г.

scheduler structures on windows 64bit

а вот например как всем давно известно (c) под 64битными версиями windows все структуры планировщика теперь расположены в KPRCB. Соотв-но определение subj мистическим образом сводится все к той же задаче определения версии KPRCB
Нужны же нам смещения следующих полей:
  • список WaitListHead
  • ReadySummary
  • массив LIST_ENTRY DispatcherReadyListHead
  • список DeferredReadyListHead
Попробуем найти чего-нть из этого списка с помощью стат. анализа кода. Все примеры кода нагло позаимствованы из ядра windows 8, KPRCB он нее можно посмотреть тут

DeferredReadyListHead

Обращение к этому полю встречается примерно в 24 функциях, среди которых есть и немало экспортируемых. На мой вкус проще всего посмотреть начало KeAlertThread:
  mov     rbx, gs:20h
  xor     esi, esi
  lea     r13d, [rax-1]
  lock bts qword ptr [rdi+40h], 0
  jb      loc_140034F29
  mov     r8b, r14b
  mov     rdx, rdi
  mov     rcx, rbx
  call    KiAlertThread
  mov     qword ptr [rdi+40h], 0
  cmp     qword ptr [rbx+2C88h], 0 ;
KPRCB.DeferredReadyListHead
  mov     r15b, al
  jnz     short loc_140034E7B


Если поле DeferredReadyListHead содержит не NULL, то ниже по коду вызывается KiProcessThreadWaitList, из которой можно узнать еще и смещение KTHREAD.WaitListEntry:
     mov     r15, [rcx+2C88h] ; KPRCB.DeferredReadyListHead
     and     qword ptr [rcx+2C88h], 0 ; KPRCB.DeferredReadyListHead = NULL
     mov     r12d, r8d
     mov     r13, rcx
     lea     rsi, [r15-0D8h] ; offsetof(KTHREAD.WaitListEntry)

ReadySummary

Проще всего ищется в начале функции NtYieldExecution:
  sub     rsp, 20h
  mov     eax, gs:5218h   ; KPRCB.ReadySummary
  test    eax, eax
  jnz     short loc_14004A9EE

Поскольку в данном случае чтение идет не из KPRCB, то нужно вычесть размер KPCR

пятница, 23 декабря 2011 г.

СНАСХ

по результатам общения с Восторженными Поклонниками™ придумался термин - Совершенно Недетектируемая Абсолютно Секретная Хуйня. Полный аналог НЁХ, придает малограмотным пересыпанным матом сообщениям Воображаемых Авторов over9000 Многозначительности, бгг
За пределами мокрых фантазий Автора (в лучшем случае 486ой его бабушки) в диком виде не встречается

четверг, 22 декабря 2011 г.

wincheck rc8.4

download mirror
Changelog:
  • can dump all callback nodes from FltMgr (-fm option). Unlike fltkd.dll this code really works on xp/w2k3
  • add options -dsdt & -dssdt to dump SSDT & Shadow SSDT

llvm 3.0 vs w2k

и эти тоже:
On Win32(MinGW32 and MSVC), Windows 2000 will not be supported. Windows XP or higher is required
Вот уроды (c)

fltmgr callback nodes

microsoft все же никак не может удержаться от использования недокументированных вещей. Вот например в wdk в файле fltKernel.h объявлены всякие внутренние MJ_XXX до -6 и начиная с -13. Промежуток в -7..-12 не описан никак, в том числе и в ф-ции fltmgr!FltGetIrpName имена для них возвращаются как IRP_MJ_RESERVED-YY
И тем не менее:
  IRP_MJ_FAST_IO_CHECK_IF_POSSIBLE: FFFFFA800E0D4320
   PreOperation:            FFFFF880026D8414 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RESERVED-12: FFFFFA800E0D4350
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RESERVED-11: FFFFFA800E0D4380
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RESERVED-10: FFFFFA800E0D43B0
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RESERVED-9: FFFFFA800E0D43E0
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RESERVED-8: FFFFFA800E0D4410
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RESERVED-7: FFFFFA800E0D4440
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000
  IRP_MJ_RELEASE_FOR_CC_FLUSH: FFFFFA800E0D4470
   PreOperation:            FFFFF880026D82D8 \SystemRoot\system32\drivers\luafv.sys
   PostOperation:           0000000000000000


Как туда попали, чем питаются что делают - неизвестно (c)

вторник, 20 декабря 2011 г.

win32k!aatomSysLoaded 64bit

а вот например механизм поиска subj под 32битными windows давно известен
Под 64бита же на первый взгляд все выглядит намного грустнее - на aatomSysLoaded всего три ссылки вида lea и они крайне неудобны для поиска.
Однако если запустить мой замечательный IDA plugin, то ссылок на aatomSysLoaded становится уже целых пять штук ! И среди них есть например вот такой кусок кода в ф-ции xxxLoadHmodIndex:

                   lea     r14, cs:0FFFFF97FFF000000h
                   lea     rdx, [rsp+498h+SourceString]
41 B8 04 01 00 00  mov     r8d, 104h
41 0F B7 8C 76 40  movzx   ecx, word ptr [r14+rsi*2+2DA440h] ; 0FFFFF97FFF2DA440h
                   call    UserGetAtomName


FFFFF97FFF2DA440 - это например и есть нужный адрес. В rd8 загружается 3ий аргумент для вызова UserGetAtomName, а в rcx - атом из нужной нам таблички. Соотв-но поиск упрощается до сигнатуры
41 B8 04 01 00 00 41 0F B7 YY ZZ XX XX XX XX
Здесь байты XX дадут нам смещение на aatomSysLoaded от начала модуля win32k.sys. Легко можно убедиться что такая сигнатура является уникальной для всего модуля как под windows 7, так и под все версии vista

Точно так же можно найти subj под 64битными w2k3/xp - только сигнатура будет другой. Какой именно - оставляю вам в качестве домашнего задания, бгг

понедельник, 19 декабря 2011 г.

wincheck rc8.3

download mirror
Changelog:
  • add -kt option to dump all KTIMERs. Works on 32 & 64bit windows
  • add checking of FS_FILTER_CALLBACKS
  • add checking of callbacks which can be installed with ExRegisterAttributeInformationCallback function
  • add checking of KPRCB.WorkerRoutine (32bit only)

воскресенье, 18 декабря 2011 г.

make_pdmp.pl

по многочисленным просьбам - запчасть от моей системы тестирования, которая ездит по директориям, качает .pdb и делает .pdmp файлы
Модуль PEIdent я в силу врожденной паранойи выкусил - нечего вам знать какие файлы оно у меня знает, бгг
Батник get_pdb.bat идентичен приведенному ранее

про тестирование

а вот например меня тут давеча спросили - поскольку wincheck для извлечения смещений структур и адресов всякого использует статический анализ кода, то как происходит проверка стат. анализатора на куче версий windows ? Это хороший вопрос тащемта, тем более что ничего внятного про такую задачу в этих ваших интернетах по моему не написано и пришлось как обычно все делать на коленке самому.
Правильный ответ - Максимальная Автоматизация всего процесса с помощью адовой смеси perl/bat скриптов

Получаем pdb

Как известно microsoft в отличие от практически всех остальных софтоклепательных компаний предоставляет .pdb файлы от почти всех своих системных модулей. Было бы глупо не воспользоваться такой шикарной возможностью при создании эталонных данных для тестов. Соотв-но обработка любого файла начинается с получения его .pdb файла и последующего дампа этого .pdb с помощью пропатченной мною версии pdbdump

Cуществует множество способов получить .pdb. На мой вкус самый простой - использовать программу symchk.exe из Debugging Tools for Windows:
"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" %1  /s SRV*%tmp%\ida\*http://msdl.microsoft.com/download/symbols /v 2>log

В файле log интересна следующая строчка:
DbgSizeOfImage      0x0001d000
DbgChecksum         0x0001df9b
PdbFilename         C:\DOCUME~1\USER\LOCALS~1\Temp\ida\6to4svc.pdb\FD2DAD64D03E4365A5116D01DCB424031\6to4svc.pdb 

PdbSignature        {FD2DAD64-D03E-4365-A511-6D01DCB42403}

Простой perl script парзит данный log, и в случае успеха копирует скачанный .pdb файл рядом с исходным бинарным, после чего запускает pdbdump, перенаправляя его вывод в файл с именем исходного PE файла и расширением .pdmp

Формирование эталонных данных

Для проведения тестов нужны файлы с эталонными данными, которые мне лениво набивать для каждого файла вручную, поэтому они также генерятся полуавтоматически. Эти данные хранятся в файле с именем исходного PE файла и расширением .et. Файл .et выглядит примерно так (взято из 32/win7/nosp/ntkrnlpa.et):
KiDebugRoutine 1689BC
KdDebuggerDataBlock 128C08

M DbgkLkmd_cblist 12DB20
PspLegoNotifyRoutine 369EE0

EPROCESS.ObjectTable F4


Для получения .et файла нужно натравить на .pdmp файл perl script make_et.pl, который распарзит выход pdbdumpа и извлечет всякие нужные адреса и смещения нужных полей в нужных структурах и сохранит их . Этот скрипт крайне прост и практически не отличается от ранее публиковавшегося. Здесь есть один тонкий момент - некоторых имен в .pdb файле может не быть. Так например в pdb от ntkrnlpa.exe от windows 7 нет переменной DbgkLkmd_cblist - она должна быть добавлена вручную. Соотв-но скрипт сначала зачитывает из уже имеющегося файла .et все строчки с символом M в начале строки (флажок, означающий что данная строчка была добавлена вручную) и сохраняет их в новой версии .et файла. Так гарантируется что однажды вручную добавленные поля никогда не будут потеряны. Как вы можете догадаться, эта функциональность также была добавлена благодаря моей выдающейся лени например

Собственно тесты

Это самая скучная часть повествования. Из общей с wincheck кодовой базы была написана специальная программа с оригинальным именем test.exe, которая делает ровно то же что и анализатор в wincheck, только еще умеет распечатать результаты в stdout. Есс-но что программа имеет 32 и 64 битные версии. Далее запускается еще один perl script, который рекурсивно ездит с помощью модуля File::Find по директориям с тестовыми данными, находит все .et файлы, запускает test.exe для исходного PE файла и сравнивает получившиеся результаты с эталонными данными. Все не найденное или не совпавшее с эталонными данными пишется в лог.
Скрипт этот имеет два режима работы - проверить вообще все, либо (что бывает значительно чаще) совершенно конкретный модуль. Откуда он знает какой файл относится к какому модулю ? Ему говорит об этом отдельный perl package PEIdent, ф-ции в котором выглядят примерно так:

sub is_hal
{
  my $fname = lc(shift);
  return ($fname eq 'hal.dll')      ||

         ($fname eq 'halapic.dll')  ||
         ($fname eq 'halmps.dll')   ||
         ($fname eq 'halacpi.dll')  ||
         ($fname eq 'halaacpi.dll') ||
         ($fname eq 'halmacpi.dll')
 ;
}

Думаю что основная идея из этого кусочка понятна. Далее можно формировать кортежи из двух указателей на ф-ции - is_XX & do_XX, вторая вызывается если первая вернула не ноль. Еще далее из этих кортежей можно составить список кортежей, по которому можно пройтись с именем .exe/.dll/.sys файла, найти его тип модуля, вызвать нужную ф-цию для обработки. В эти списки можно добавить кортежи только для отдельных типов модулей или для всех pe файлов и так далее

Добавление нового эталонного значения

Изредка возникает необходимость добавить еще одно (или не одно) поле в .et файлы для определенного модуля. Поскольку лень моя чудовищна - это делается с помощью все того же make_et.pl. К нему дописывается еще одна (или не одна) строчка - имя переменной, которую мы хотим получить из .pdmp или поле и структура. Этот скрипт точно так же обходит рекурсивно директорию с тестовыми данными и делает свое грязное дело по изменению .et файлов, генерируя при этом отчет - для какого файла что не нашлось. По моему это единственное место когда требуется ручное вмешательство с помощью анализа кода в IDA Pro

Добавление нового файла

Бывает также иногда необходимость добавить либо файлы с какой-либо версии windows, либо совершенно новый тип модуля. Если нужно добавить новый тип модуля для анализа - правится PEIdent и прочие использующие его скрипты. Затем просто запускаются два скрипта:
  1. make_pdmp.pl - рекурсивно ездит по директориям с тестовыми данными, ищет файлы, у которых отсутствуют .pdb/.pdmp файлы, скачивает все недостающее и вызывает pdbdump, при этом пишется два лога - для тех файлов, скачать .pdb к которым не удалось, и для всех вновь добавленных. Я думал что можно было бы make приспособить для этого дела - но тогда пришлось бы руками в нем прописывать все добавленные файлы с полными путями. Ручной рекурсивный обход дерева каталогов оказался намного проще
  2. все тот же make_et.pl для получения эталонных данных для вновь добавленных файлов
Как следует из описания если нужно просто добавить некоторое количество файлов (например давеча я добавил файлы от 32битной w2k3 sp1) - их нужно просто скопировать в нужную директорию и запустить простой .bat файл

Организация каталогов

Чтобы не потеряться в куче файлов - .exe/.dll/.sys, а также соотв-щих им .pdb/.pdmp/.et (размер этого добра сейчас составляет что-то около 6Gb) - нужна правильная организация каталогов. Директорий с тестовыми данными две - одна для 32бит, другая для 64 (и на самом деле эти директории могут лежать на разных машинах). В каждой директории есть папки с именем версии windows, откуда был взят набор файлов, примерно такие:
32/w2k/sp4
32/xp/sp1
32/xp/sp2
32/xp.64/sp1
и так далее

В каждой папке лежит весь наборчик файлов данной битности от данной версии windows. Благодаря тому что любой скрипт для манипуляции с файлами ездит по директориям рекурсивно - всегда можно задать директорию, в которой нужно отработать - например тестировать только xp версии, скачать pdb от 32/w2k3/sp1 etc etc

Должен заметить что подобная организация тестов значительно ЗНАЧИТЕЛЬНО МЕГАЗНАЧИТЕЛЬНО экономит время тестирования/поиска багов/добавления новых переменных/новых типов модулей/новых версий windows

суббота, 17 декабря 2011 г.

KTIMERs with DPC per processor

а вот например как всем давно известно (c) начиная с windows 7 KTIMERs хранятся в KPRCB per processor (в поле KPRCB.TimerTable). Соотв-но я сегодня отладил таки код, вытаскивающий все KTIMERs для всех камней и вот что получилось на моей восьмиголовой windows 7 64bit:

AffinityMask

а вот например windows7 (и соотв-но w2008r2) могут поддерживать более 64 камней
А как известно ф-ция SetThreadAffinityMask в качестве маски имеет аргумент типа DWORD_PTR, что позволяет задать маску ровно для 64 камней. Если же на машине больше - то предлагают использовать всякие ритуальные пляски с бубном типа SetThreadIdealProcessorEx и заданием т.н. processor group.
Предположим (потому что у меня банально нету такого железа) что мы запущены на машине, где больше 64 камней. Количество камней я как-нть из kernel-mode узнать могу (KeNumberProcessors например). Соотв-но дальше я хочу свой поток подключить к каждому имеющемуся камню и достать всякое из KPRCB например. Ясно что я должен использовать кроме subj еще и processor group. А вот дальше непонятно - а сколько таких групп в системе ? А сколько в каждой камней (а системы бывают например на 96 камней - не кратные 64) ? А как можно провернуть такой трюк в kernel mode ?
Кто-нть имел подобный опыт ?

Update: вдумчивое разглядывание msdn подсказывает, что нужные ф-ции называются примерно так:
Наверняка все реализовано через какие-нть плохо документированные Information Classes NtQuerySystemInformation

вторник, 13 декабря 2011 г.

определение версии KPRCB 2

я тут писал уже как-то про сие невинное занятие, но внезапно выяснилось что метод не работает например под windows 8 - под ней KeIsExecutingDpc выглядит так:
  mov     eax, large fs:2354h
  and     eax, 10001h
  retn

это дает нам смещение на DpcRoutineActive равным 0x2234, что неверно

Но есть и еще один способ - например можно узнать смещение поля WorkerRoutine. В экспортируемой ф-ции KiIpiServiceRoutine есть примерно такой кусочек кода:
  mov     eax, [edx+2170h]
  mov     edx, [esp+24h+arg_0]
  mov     [esi+2128h], edx
  call    eax

0x2170 - это и есть наше искомое смещение. К недостаткам метода относится его применимость только для 32 бит, потому что под 64битными системами ф-ция KiIpiServiceRoutine не экспортируется
Также работает он только начиная с xp - под w2k ф-ция KiIpiServiceRoutine пуста

илита вирмейкинга недовольна

wincheckом:
Например есть у нас детектор типо wincheck. Вроде кошерная поделка, анализирует стопяцот внутренних структур, как юзермодных, так и нейтивных. Но это аверское дерьмо выпиливается через маршрутизацию. Что толку от мониторинга LdrpDllNotificationList, если я юзаю ShowSnaps и S/W переключение на код
это успех (c) ящетаю. Особенно угарно что wincheck на всю катушку использует анализ графа codeflow - не GPE™ понятно, а более пригодную для использования самописную либу, но идея таки да, ровно та же самая, бгг

пятница, 9 декабря 2011 г.

wincheck rc8.2

download mirror
Changelog:
  • add dumping of handlers from LdrpDllNotificationList. Example output looks like:
    LdrpDllNotificationList: 1
     6CE16512 C:\Program Files\Internet Explorer\IEShims.dll
  • add dumping of callbacks which can be installed with DbgkLkmdRegisterCallback
  • add checking of functions imported from imm32.dll inside user32.dll

среда, 7 декабря 2011 г.

IDA 5.60 PICode analyzer plugin for win64

а вот например под 64битной windows есть собственный вариант position-independent code, который выглядит приблизительно так (примерчик выдран из win32k.sys):
   lea     rax, cs:0FFFFF97FFF000000h
   mov     edx, r11d
   call    qword ptr [rax+r10*8+2C59A0h] ; 0FFFFF97FFF2C59A0h


здесь адрес FFFFF97FFF000000h указывает на самое начало PE модуля, т.е. в оригинале данная инструкция скорее всего выглядела как (использован синтаксис yasm):
lea rax, qword [ImageBase wrt rip]

IDA Pro например такой код не распознает и соотв-но не показывает ни адресов, ни cross-refs, что представляет собой некоторую проблему при анализе всякого. Поскольку perl под ida64 я так и не удосужился завести, а IDC считаю адовой упячкой (практически такой же как писон), пришлось вспомнить молодость и написать очередной native plugin таки на C++

Собственно алгоритм работы прост - проходимся по всем секциям, содержащим исполнимый код, ищем загрузку в некий регистр адреса начала PE модуля, и далее ищем в некотором количестве нижеследующих инструкций те, что используют этот регистр как base register или как index register с нулевым SIB scale. Для найденных проставляем cross ref и новый вычисленный адрес в комментарии. Все происходит за один проход, поэтому работает относительно быстро (на файле размером 3.8Mb порядка 40 секунд на моей рабочей машине)

Поскольку старые добрые надежные компиляторы с IDA Pro 5.60 работать перестали, собирается все богатство на vs2008

вторник, 6 декабря 2011 г.

ida 560 sdk vs bcc 5.5

а вот например после некоторого перерыва решил пересобрать один plugin под subj на Borland C++ 5.5 for Win32. Сделал все как в install_make.txt описано - пофиксал всякое в allmake.mak и запустил make - разнообразные .cfg создались и на первый взгляд даже правильные вроде. Запускаю конпеляцию и получаю:

Error E2326 c:\ida560\sdk\include\pro.h 445: Use __declspec(spec1[, spec2]) to combine multiple __declspec's
Error E2141 c:\ida560\sdk\include\pro.h 445: Declaration syntax error
Error E2268 c:\ida560\sdk\include\pro.h 450: Call to undefined function 'vinterr' in function cdecl interr(const char *,int,cont char *,...)
Error E2326 c:\ida560\sdk\include\pro.h 749: Use __declspec(spec1[, spec2]) to combine multiple __declspec's
Error E2141 c:\ida560\sdk\include\pro.h 749: Declaration syntax error


wtf ? в readme.txt английским по синему написано:
To create 32bit or 64bit Win32 modules:    Borland C++ Builder >= 5.0
                                        or free BCC v5.5
 вот у меня как раз он и есть - free BCC v5.5. И не собирается нифига

Update: на старом добром Visual C++ 6.0 тоже больше не собирается ничего - выдало простыню из 135 ошибок на какие-то templates типа вот такого:

c:\ida560\sdk\include\pro.h(1830) : warning C4003: not enough actual parameters for macro 'DEFINE_LIST_ITERATOR'
c:\ida560\sdk\include\pro.h(1830) : error C2143: syntax error : missing ')' before ';'
        c:\ida560\sdk\include\pro.h(1966) : see reference to class template instantiation 'qlist' being compiled

Придется окончательно перелезть на vs2008

воскресенье, 4 декабря 2011 г.

Анальный туннель реальности

детский юмористический журнал ксакеп снова отжигает
Перехват ключевых функций в структуре NDIS_MINIPORT_BLOCK может гарантировать твоей зверюшке уверенный контроль или модификацию сетевого трафика, если бы не одно "но" — заполучить указатель на NDIS_MINIPORT_BLOCK ой как непросто
Дико непросто, угу. Александр Эккерт опять показывает свою выдающуюся компетентность - даже имя списка ndisMiniportList не привел, но с серьезной рожей маститого касперски эксперта рассуждает о вещах, в которых не смыслит совершенно, бгг

суббота, 3 декабря 2011 г.

Boost

а вот например нам тут давеча разъяснили что полная поддержка языка в компиляторе вовсе и не нужна. Речь шла про c++11 есличо
а вот если подсчитать количество использований костыля BOOST_WORKAROUND в boost (например версии 1.47), то получим 540 файлов. Для языка, которому уже 28 лет. Наверняка потому что авторы отдельных компиляторов тоже полной поддержкой себя не утруждали

Думаю для c++11 и через 28 лет ситуация будет ничуть не лучше чем сейчас для "обычного" c++. А прямо сегодня его могут позволить себе использовать только конченные психи крайне безответственные граждане, бгг

wincheck rc8.1

Download mirror
Changelog:
  • New -st option to check System Threads. Print ETHREAD, ETHREAD.StartAddress, Y if this thread is worker thread, KTHREAD.InitialStack and KTHREAD.StackLimit. Example output for my xp 32bit machine looks like:
    Thread 867C5020 Start 80683528 N stack F79FC000 limit F79F9000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C5BD8 Start 80533CD0 Y stack F7A08000 limit F7A05000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C5960 Start 80533CD0 Y stack F7A0C000 limit F7A09000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C56E8 Start 80533CD0 Y stack F7A10000 limit F7A0D000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C5470 Start 80533CD0 Y stack F7A14000 limit F7A11000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C4020 Start 80533CD0 Y stack F7A18000 limit F7A15000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C4DA8 Start 80533CD0 Y stack F7A1C000 limit F7A19000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C4B30 Start 80533CD0 Y stack F7A20000 limit F7A1D000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C48B8 Start 80533CD0 Y stack F7A24000 limit F7A21000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C4640 Start 80533CD0 Y stack F7A28000 limit F7A25000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C43C8 Start 80533CD0 Y stack F7A2C000 limit F7A29000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C3020 Start 80533CD0 Y stack F7A30000 limit F7A2D000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C3DA8 Start 80533CD0 Y stack F7A34000 limit F7A31000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C3B30 Start 80533CD0 Y stack F7A38000 limit F7A35000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867C38B8 Start 806091A8 N stack F7A3C000 limit F7A39000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867BF020 Start 80508898 N stack F7A40000 limit F7A3D000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867BFDA8 Start 8064226E N stack F7A44000 limit F7A41000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867BFB30 Start 8053B3E8 N stack F7A48000 limit F7A45000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867BF8B8 Start 8053B6DE N stack F7A4C000 limit F7A49000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867EAA20 Start 804EC6E8 N stack F7A50000 limit F7A4D000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867EA7A8 Start 804EC6E8 N stack F7A54000 limit F7A51000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867A5BC8 Start 8050AC2A N stack F7A58000 limit F7A55000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 867A5530 Start F74BDB10 N stack F7A5C000 limit F7A59000 ACPI.sys
    Thread 867325C0 Start F739C91E N stack F7A64000 limit F7A61000 dmio.sys
    Thread 86740DA8 Start F72DBB40 N stack F7A68000 limit F7A65000 PGPwded.sys
    Thread 8672E9E0 Start F72DBB40 N stack F7A6C000 limit F7A69000 PGPwded.sys
    Thread 86717A40 Start F720DB85 N stack F7A70000 limit F7A6D000 NDIS.sys
    Thread 865BB458 Start F77D1F90 N stack F7A90000 limit F7A8D000 \SystemRoot\system32\DRIVERS\redbook.sys
    Thread 86482DA8 Start F5F8381A N stack F7AA4000 limit F7AA1000 \SystemRoot\system32\DRIVERS\rdpdr.sys
    Thread 86482B30 Start F5F8381A N stack F7AA8000 limit F7AA5000 \SystemRoot\system32\DRIVERS\rdpdr.sys
    Thread 864828B8 Start F5F8381A N stack F7AAC000 limit F7AA9000 \SystemRoot\system32\DRIVERS\rdpdr.sys
    Thread 86482640 Start F5F6CCFA N stack F7AB0000 limit F7AAD000 \SystemRoot\system32\DRIVERS\rdpdr.sys
    Thread 863DE7D8 Start F781C92D N stack F7AC8000 limit F7AC5000 \SystemRoot\system32\DRIVERS\raspptp.sys
    Thread 863E9020 Start F781D103 N stack F7AC4000 limit F7AC1000 \SystemRoot\system32\DRIVERS\raspptp.sys
    Thread 86143598 Start F64B9E96 N stack F7166000 limit F7163000 \SystemRoot\system32\DRIVERS\USBPORT.SYS
    Thread 86395020 Start F64B9E96 N stack F716E000 limit F716B000 \SystemRoot\system32\DRIVERS\USBPORT.SYS
    Thread 86371B18 Start F64B9E96 N stack F7172000 limit F716F000 \SystemRoot\system32\DRIVERS\USBPORT.SYS
    Thread 85CC16F0 Start F60156D0 N stack F1D37000 limit F1D34000 \SystemRoot\system32\DRIVERS\parport.sys
    Thread 862B1AC0 Start F1D2C038 N stack F1D2B000 limit F1D28000 \SystemRoot\system32\DRIVERS\rasacd.sys
    Thread 85C636F0 Start F72DBB40 N stack F1D23000 limit F1D20000 PGPwded.sys
    Thread 86310B70 Start EEF75A99 N stack F1D1F000 limit F1D1C000 \SystemRoot\system32\DRIVERS\rdbss.sys
    Thread 85C366F0 Start EEF75A99 N stack F1D13000 limit F1D10000 \SystemRoot\system32\DRIVERS\rdbss.sys
    Thread 85C356F0 Start EEF5D8AF N stack F177D000 limit F177A000 \SystemRoot\system32\DRIVERS\rdbss.sys
    Thread 86616A78 Start 805EE5B8 N stack F7AC0000 limit F7ABD000 \WINDOWS\system32\ntkrnlpa.exe
    Thread 862A4308 Start EEF679C1 N stack EE2D0000 limit EE2CD000 \SystemRoot\system32\DRIVERS\rdbss.sys
    Thread 863B7DA8 Start F733D2A6 N stack F5EEA000 limit F5EE7000 PGPfsfd.sys
    Thread 862D8DA8 Start EB1AC7D8 N stack EF223000 limit EF220000 \SystemRoot\system32\DRIVERS\mrxdav.sys
    Thread 86600598 Start EB1AC7D8 N stack F0A1B000 limit F0A18000 \SystemRoot\system32\DRIVERS\mrxdav.sys
    Thread 86312580 Start EB1AC7D8 N stack EB320000 limit EB31D000 \SystemRoot\system32\DRIVERS\mrxdav.sys
    Thread 862F7B38 Start EB18E82C N stack EB300000 limit EB2FD000 \SystemRoot\system32\DRIVERS\mrxdav.sys
    Thread 8636F220 Start EB18BD18 N stack F5EFA000 limit F5EF7000 \SystemRoot\system32\DRIVERS\mrxdav.sys
    Thread 865FDDA8 Start F5195A48 N stack F5F06000 limit F5F03000 \??\C:\WINDOWS\system32\drivers\hcmon.sys
    Thread 85E03798 Start EB260B32 N stack EB16F000 limit EB16C000 \SystemRoot\system32\DRIVERS\srv.sys
    Thread 85E51798 Start EB260B32 N stack EB177000 limit EB174000 \SystemRoot\system32\DRIVERS\srv.sys
    Thread 861EC718 Start EBA847B6 N stack EBB1B000 limit EBB18000 \SystemRoot\System32\Drivers\HTTP.sys
    Thread 861BA8E8 Start EBA847B6 N stack EBAE7000 limit EBAE4000 \SystemRoot\System32\Drivers\HTTP.sys
    Thread 861BA670 Start EBA847B6 N stack EBCB7000 limit EBCB4000 \SystemRoot\System32\Drivers\HTTP.sys
    Thread 862409E0 Start EBA847B6 N stack EBCBB000 limit EBCB8000 \SystemRoot\System32\Drivers\HTTP.sys
    Thread 861F9A98 Start EBA81DDA N stack EBCA7000 limit EBCA4000 \SystemRoot\System32\Drivers\HTTP.sys

    This new option is supported on both 32 and 64 bit platforms. It does not work on w2k only bcs of strange global processes locking policy on this ancient windows
  • From Unknown Executable Memory (-uem option) are excluded ranges used by PEB.ApiSetMap and PEB.ReadOnlySharedMemoryBase (windows 7 & 8)
  • Fixed some misprints in output

среда, 30 ноября 2011 г.

wincheck rc8

download mirror
Changelog:
  • пофиксал неверное определение IAT hooks в kernel mode, о чем нам тактично сообщил Dmitry Varshavsky
  • добавлена опция -uem для поиска в процессах всяких странных регионов памяти, имеющих флаг executable. В них попадают все области памяти, не принадлежащие загруженным модулям, PEB.GdiSharedHandleTable & SHAREDINFO.aheList. Для каждого региона выдается примерно такое:
    00530000   Mapped      80000     2  ER--
      00530000 Mapped       6000        ER-- ---
      00536000 Reserve     7A000        ER-- ---

    Тут все понятно по моему - адрес, размер, атрибуты, детализация
  • несколько изменен формат вывода для driver hooks

w8 KPRCB 64bit

subj

w8 KPRCB

subj

размер KiTimerTableListHead

а вот например вижу я под vista sp2 примерно такой замечательный кусок кода в ф-ции KeSetTimerEx:

  movzx   edi, byte ptr [esi+2] ; KTIMER.Header.Hand
  mov     eax, large fs:20h ; KPCR.Prcb
  mov     ecx, edi
  and     ecx, 1Fh ;
KTIMER.Header.Hand & 0x1F
  lea     ebx, [eax+ecx*8+4A0h] ; somewhere inside KPRCB.LockQueue
  mov     ecx, ebx
  call    KeAcquireQueuedSpinLockAtDpcLevel
  mov     byte ptr [esi+3], 0
  mov     eax, [esi+18h]
  mov     ecx, [esi+1Ch]
  cmp     eax, ecx
  mov     [ecx], eax
  mov     [eax+4], ecx
  jnz     short loc_4ABC30
  shl     edi, 4 ;
KTIMER.Header.Hand * sizeof(KTIMER_TABLE_ENTRY)
  add     edi, offset _KiTimerTableListHead ;
KiTimerTableListHead[KTIMER.Header.Hand]
  cmp     edi, [edi]

Во всех источниках сказано что размер таблицы KiTimerTableListHead под vista равен 512 элементов. Собственно проверить это легко - адрес KiTimerTableListHead 0x4FCB80, адрес следующей за ней структуры AlpcpNPLookasides 0x4FEB80. Размер 0x2000 / 0x10 = 512 элементов. Еще одна проверка - ф-ция KiComputeTimerTableIndex возвращает результат как маску с 0x1FF
В приведенном же коде мы видим что в регистре edi хранится байт, взятый из KTIMER.Header.Hand и используется как индекс в KiTimerTableListHead для проверки всякого. В байте однако число 512 никак не может уместиться. Соотв-но wtf ?

воскресенье, 27 ноября 2011 г.

vs2010 vs w2k

а вот например одна и та же прога собирается на vs2008 & vs2010 (так бывает, бгг)
Собранная на vs2008 вполне себе работает под w2k (пионэры поди и не знаю уже что это такое, бгг)
Собранная же на vs2010 не работает - при запуске гордо сообщает "этот файл не является приложением win32"
Это все отчего например ? Никакими опциями линковщика сие нельзя поправить ?

суббота, 26 ноября 2011 г.

восторженные поклонники

набижали давеча внезапно. Как всем давно известно © антивирусная индустрия™ отличается сильной аргументацией, критическим взглядом на свои продукты и высокой оценкой продуктов конкурентов, а также ведением конструктивных бесед.
Хвалебные отзывы содержат в себе следующие выражения:
  • унылое поделие
  • божественный огрызок
  • лошить несчастных пользователей
  • ваши mini balls
  • пришлите мне дамп !
До лучших образцов Истинной Питерской Интеллигенции далеко канешна, но тоже ничего. Нужно поработать немного над стилем и никогда, вы слышите - никогда не следует качать и тем более запускать какие-либо осуждаемые продукты - очевидно же что они говно !

К несчастью лишен возможности аргументированно ответить в симметричном стиле - их собственный Продукт у меня не запустился под 32 битами, а под 64 бита и вовсе в природе не существует, о чем кстати даже Написано В Хэлпе ©, бгг

Пора делать фан-клуб имени меня ящетаю

wincheck rc7

download
Changelog:
  • поскольку отдельные граждане не умеют правильно редиректить stdout - добавил опцию -f для задания имени logfile
  • добавил также опцию -k для убийства всяких залипших процессов
  • добавлена проверка handlers, установленных с помощью RegisterApplicationRecoveryCallback
  • добавлена проверка ф-ций, установленных с помощью RegisterMessagePumpHook
  • пофикшен баг, выводящий надоедливое сообщение Unknown apfnDispatch size
  • добавлены всякие devinterfaces, встречающиеся на ноутах
  • и пара-тройка rpc interfaces от 64битной windows 7 sp1
  • ну и еще кое-что исправлено

четверг, 24 ноября 2011 г.

Vba32 AntiRootkit 3.12.5.5

решил затестить давеча сей чрезвычайно широко разрекламированный ARK например
Виснет на моей машине наглухо после нажатия кнопачьки Start, и еще не дает себя прибить никак. Следы жизнедеятельности примерно такие:

SDT entry 13 (ZwAssignProcessToJobObject) hooked \SystemRoot\system32\drivers\httz32lu.sys!
SDT entry 89 (ZwProtectVirtualMemory) hooked \SystemRoot\system32\drivers\httz32lu.sys!
SDT entry D5 (ZwSetContextThread) hooked \SystemRoot\system32\drivers\httz32lu.sys!
SDT entry 101 (ZwTerminateProcess) hooked \SystemRoot\system32\drivers\httz32lu.sys!
SDT entry 102 (ZwTerminateThread) hooked \SystemRoot\system32\drivers\httz32lu.sys!
...
win32k_sdt[355] (NtUserDestroyWindow) hooked, addr A6FB299E \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[378] (NtUserFindWindowEx) hooked, addr A6FB2624 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[404] (NtUserGetForegroundWindow) hooked, addr A6FB26BE \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[460] (NtUserMessageCall) hooked, addr A6FB2866 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[475] (NtUserPostMessage) hooked, addr A6FB2912 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[476] (NtUserPostThreadMessage) hooked, addr A6FB27D8 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[483] (NtUserQueryWindow) hooked, addr A6FB258E \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[549] (NtUserSetWindowsHookEx) hooked, addr A6FB2A20 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[552] (NtUserSetWinEventHook) hooked, addr A6FB2B3A \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[570] (NtUserUnhookWindowsHookEx) hooked, addr A6FB2B20 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[571] (NtUserUnhookWinEvent) hooked, addr A6FB2C40 \SystemRoot\system32\drivers\httz32lu.sys
win32k_sdt[592] (NtUserWindowFromPoint) hooked, addr A6FB2748 \SystemRoot\system32\drivers\httz32lu.sys

Пришлось сочинить по быстрому опцию к wincheck для убийства подобных "продуктов". Убилось канешна, только драйвер егойный например так и не понял что процесса больше нету и остался висеть, не соизволив почистить все свои хуки. Отличный, просто отличный продукт, чо там

Update: авторы посоветовали использовать недокументированный ключик /nodmsa
Те же яйца, вид в профиль - снова повисло все

Doom 3 sources

если кто не видел еще например
внутри всякий треш-угар-содомия - например curl версии 7.11.1 и куча комментов FIXME, бгг

perl rulez

а вот например я сегодня убедился в очередной раз что perl внутри IDA Pro давно перестал быть гиковской игрушкой
Например мне нужно узнать какие инструкции в модуле передают управление через указатель
Собственно их две всего: call [mem] (ff 15 xx xx xx xx) & jmp [mem] (ff 25 xx xx xx xx)
Дело осложняется тем что таких очень дофига - например ссылки на import table. Пришлось скрипт написать, который проходит по списку сегментов, ищет те, что содержат импорты и код и ищет всякое по двум сигнатурам. Работает пару секунд даже на ntoskrnl.exe

среда, 23 ноября 2011 г.

Carberp with rootkit for w7 64bit

был пойман например сегодня с помощью wincheck
собс-но вот по этой строчке:
Image notifiers:
[0] FFFFF800039EF7C0 \SystemRoot\system32\ntoskrnl.exe
[1] FFFFFA800360B6C8 UNKNOWN

отлично-отлично ящетаю, бгг
Дроппер залит на vt - не ловит практически никто. продолжение ждите через месяц, как обычно

вторник, 22 ноября 2011 г.

wincheck doc

A long time ago, in a galaxy far far away...
I promised to write some nice documentation about wincheck


Wincheck is a tool that inspects undocumented or not enough documented Windows internal structures. Note that Wincheck is NOT an anti rootkit (ARK) software. Also it does NOT support disinfection or automatic analysis. Mainly because many offiical commercial products also set lots of hooks in system and full list of such hooks don`t exists

There are several reasons why I wrote this tool
1)  Many existing commercial and free ARK tools can't display or check multiple important Windows structures that modern rootkits use
2)  There is an option to check these structures using WinDbg (with pykd perhaps) and a bunch of different scripts. But this requires additional steps while I was looking for a tool that can be easily started without any installation (from a flash drive, for example). Moreover WinDbg is not very useful without symbols available and symbols can be missing on suspicious system if network support doesn't work. Wincheck does not use symbols and it detects addresses and functions with static code analysis only.
3) hard NIH syndrome

Supported Windows versions
32bit:
  • w2k
  • xp
  • w2k3
  • vista
  • windows 2008
  • windows 7
  • windows 8 dev preview
  • windows 8 consumer preview
  • windows 8 release preview
  • windows 8 rtm 
  • windows 8.1 preview
  • windows 8.1 rtm
  • windows 10 builds 9926, 9879, 10041 & 10074
64bit:
  • xp
  • w2k3
  • vista
  • windows 2008
  • windows 7
  • windows 2008r2
  • windows 8 consumer preview
  • windows 8 server consumer preview
  • windows 8 release preview 
  • windows 8 rtm
  • windows server 2012 rtm 
  • windows 8.1 preview
  • windows 8.1 rtm 
  • windows 10 builds 9926, 9879, 10041 & 10074
Wincheck implementation uses unsigned driver so starting from Windows Vista it requires system boot with "Disable Driver Signature Enforcement" option (use F8 boot menu).

Supported Modes
Wincheck can analyze kernel mode structures or user mode processes. It has to be run with Administrator privileges in both cases.

Kernel Mode
  • code sections integrity checks for kernel, some vital drivers and their import/export tables
  • IDT ('-idt' option)
  • SSDT. '-sdt' option enables ETHREAD.ServiceTable checks for all threads. 32bit only
  • process/thread/image/registry/session notificators and fs change notifiers
  • PnP notificators
  • tables registered with ExRegisterExtension  ('-ext' option)
  • registered callbacks
  • bugcheck callbacks
  • OBJECT_TYPE_INITIALIZER handlers for all registered object types
  • g_CiEnabled & g_CiCallbacks
  • HAL tables, for example, HalAcpiDispatchTable and HalPrivateDispatchTable ('-hal' option)
  • NDIS structures & WFP callouts ('-ndis' option)
  • netio.sys NPI clients & providers, WFP callouts, NsiRegisterChangeNotification(Ex) callbacks ('-ndis' option)
  • RPC interfaces in user mode ('-rpc' option) .  '-npo' option displays process owner for all RPC enpoints (ALPC ports/named pipes)
  • CmControlVector content ('-kopts' option)
  • registered WMI providers ('-wmi' option)
  • IopNotifyShutdownQueueHead and IopNotifyLastChanceShutdownQueueHead ('-shutntfy' option)
  • KTIMERs ('-kt' option) 
  • FltMgr guts ('-fm' option) 
  • WdfFunctions for KMDF-based drivers ('-wdf' option) 
  • CrashdmpCallTable
  • callbacks registered with IoRegisterIoTracking (windows 8 only)
  • CLASS_INIT_DATA & CLASS_DRIVER_EXTENSION
  • win32k!gahti ('-gahti' option)
  • sockets and established connections from tcpip.sys ('-sockets' option. for xp/w2k3 only)
  • sockets and established connections from tcpip6.sys ('-sockets6' option. for xp/w2k3 only)
  • and many others.

User Mode
Checks all or specific (see '-pid ProcessID' option) process.  This check can take significant time to execute but '-p' option can be used to run these checks in parallel on available CPUs. The number of threads used won't exceed KeNumberProcessors.

In this mode the application can check:
 - memory content in all executable sections
 - export table
 - import table
 - delayed import table
 - TLS callbacks
 - different structures that use function pointers including:
  • ntdll.dll callbacks like PFNCLIENT tables, RtlpUnhandledExceptionFilter,  LdrpManifestProberRoutine, CsrServerApiRoutine, RtlpDebugPageHeapXXX handlers etc.
  • shim handlers
  • apfnDispatch, InitializeLpkHooks and WOW callbacks from user32.dll
  • wow64win.dll  function tables (64-bit only)
  • wow64.dll service tables (64-bit only)
  • WNF notifiers ('-wnf ' option)
  • EventCallbacks registered with SetTraceCallback function call ('-traces' option)
  • WMI callbacks/trace guids ('-wmi' option)
  • LSA Security Providers table functions
  • handlers installed with LsaIRegisterPolicyChangeNotificationCallback
  • CSR_SERVER_DLL handlers
  • ole32!IMallocSpy
  • ole32!ChannelHooks
  • AppHelp.dll functions in kernel32.dll
  • yet over 9000
Command Line Options

Common options:
 -f logfile name
 -k Process PID to kill
 -ha - turn off hook analyzer
 -wmi- report WMI entries
Process options:
 -all - check all processes
 -pid Process PID - check process with specific Process PID
 -mods - dump loaded modules
 -pp - dump print providers
 -t - dump threads
 -traces - dump all registered trace callbacks
 -p N - number of threads to use for processes check
 -uem  - check for Unknown Executable Memory
 -wnf - check WNF notifiers
System options:
 -acpi - check some ACPI tables
 -alldrv - check all (known to me) drivers
 -alpc - dump clients of RPC ALPC ports
 -dump_patched - dump patched sections
 -dsdt  - dump SDT
 -dssdt - dump SSDT
 -dext - dump driver extensions
 -emp  - dump EMP callbacks
 -ext   - dump tables registered with ExRegisterExtension
 -fm    - dump FltMgr callback nodes
 -full  - add kernel checks (except RPC & WMI)
 -gahti - dump win32k!gahti table
 -hal  - check HAL tables
 -idt  - check IDT
 -kdmask - dump KD masks set
 -kopts  - dump kernel options (CmControlVector)
 -kshims - dump registered kernel shims (w8 only)
 -kt   - dump KTIMERs
 -ndis - check NDIS
 -nopads - check that all code located only in section content
 -npo - dump RPC Named Pipes Owner
 -obcb - dump object types callbacks
 -pofx  - check PoFxPlugins
 -rdata - check .rdata sections too
 -rdbss to dump rdbss registered devices
 -rpc - report RPC interfaces
 -sched - dump threads from scheduler
 -sdt - check SSDT for all threads
 -shutntfy - check for drivers shutdown notificators
 -sockets - dump tcpip sockets
 -sockets6 - dump tcpip6 sockets
 -st - check system threads
 -timp - dump threads with impersonation token
 -usbport - check USB ports
 -wdf - check WdfFunctions for KMDF-based drivers

пятница, 18 ноября 2011 г.

занимательная компьютерная проктология

интересно что скажут практикующие психиатры про человека, употребляющего данный термин, бгг ? ссылку открывать крайне осторожно - внутри множество инфантильных фантазий например

среда, 16 ноября 2011 г.

совсем отупел

А расскажите мне например про легкий и быстрый способ бросить курить пить и жить узнать, работает ли мой код внутри сервиса (который как известно запрещает по умолчанию общаться с пользовательским десктопом, но может и разрешить посредством флага SERVICE_INTERACTIVE_PROCESS) или внутри обычной пользовательской проги и я могу соотв-но показывать всякое ?

Есличо я в курсе за ф-цию WTSGetActiveConsoleSessionId - это совсем не про то что нужно. Начиная с висты в user32.dll есть также малодокументированная ф-ция _UserTestTokenForInteractive - оно уже больше на правду похоже, но мне и под xp/w2k3 нужно и еще для Terminal Server

понедельник, 14 ноября 2011 г.

откопал

чудесное (из питера, что характерно, бгг)
Каким образом мотивировать с помощью зарплаты, не повышая ее?
Как смотреть в глаза, когда увольняешь?
Должен признаться - последний пункт особенно вызывает у меня некоторые сложности. Обычно хочется просто уебать с ноги причинить телесные повреждения средней степени тяжести напоследок, бгг
И еще внезапно в тему: ein zwei

суббота, 12 ноября 2011 г.

замутил опрос

например поскольку bug reports мне практически никто не пишет, я самонадеянно считаю что wincheck (особенно rc6) является Абсолютно Бесполезной Совершенной и Безглючной прогой (типа linux, бгг)

Сам я проголосовал за п.3 есс-но
Update: я смотрю sww проголосовал уже, бгг

утечка пара

я надеюсь все уже читали
C нетерпением ожидаем привычного завывания из каждого утюга от Спасателей Вселенной™ на предмет "скоро смерть интернета !" "анальный паспорт для каждого !" "kaspersky911 !" "покупайте наших слонов !" и все такое, бгг

среда, 9 ноября 2011 г.

MS11-083

думаю все уже видели
This security update resolves a privately reported vulnerability in Microsoft Windows. The vulnerability could allow remote code execution if an attacker sends a continuous flow of specially crafted UDP packets to a closed port on a target system
Чак Норрис нашел, не иначе

вторник, 8 ноября 2011 г.

wincheck rc6

скачать
в честь первого снега например
Изменений не особо много:
  • был отловлен и пофикшен злостный memory corruption bug, иногда приводящий к падению
  • имена WMI providers зачитываются из реестра (thanks 3jg13)
  • исправлен еще один bug, из-за которого не проверялись таблицы ф-ций в user32.dll. Проверяются apfnDispatch из PEB, callbacks из InitializeLpkHooks & WOW callbacks
  • и еще всякое по мелочи исправлено

воскресенье, 6 ноября 2011 г.

Microsoft Fix it 50792

заключается вот в такой примерно строчке кода на vbs:
cacls %WINDIR%\SYSTEM32\t2embed.dll /E /P """ & Everyone &  """:N"
под вистой и выше:
icacls %WINDIR%\SYSWOW64\t2embed.DLL /deny """ & Everyone & """:(F)"
В переводе на линуксячий - chmod -x
И этот шедевр они рожали всей могучей корпорацией аж целых две недели ! Мде...

пятница, 28 октября 2011 г.

перевод с касперского

читая выл от вострога ! там прекрасно решительно все
В общем, мы тут напряглись, посчитали и обалдели. В результате появился апдейт: 70 тысяч
а почему не 100500 миллионов ? доказательств все равно нет никаких
у нас уже год не меняется количество сотрудников в вирлабе
кризис посетил внезапно и найм заморожен ?
У нас уже много лет как на боевом дежурстве … авто-дятлы! Человеческому фактору достаётся только самая интеллектуальная работа – разбирать самые сложные образцы, исследовать ботнеты, следить, чтобы авто-дятлы не фолсили
ололо, автодятел виноват в необнаружении stuxnetа, ога
Сигнал поступает в KSN, где система автоматически вычисляет репутацию файла (веса всех признаков и действий) и принимает решение о детекте...Разумеется, чем больше сообщений об одном и том же файле с разных компьютеров, тем более высокий приоритет обработки и выше точность и критичность вердикта
а мы типа не при делах - 30 миллионов мух хомячков в нашем облаке не могут ошибаться - у твоего файла реальне плохая репутация. Кто сразу вспомнил про цензуру ?

C другой стороны какие богатые возможности к накрутке репутации открываются - читайте в ближайших выпусках сми - ботнет KSN большинством голосов забанил KIS 2012 как fake av, бгг

concurrent_queue::clear bug

все неделю проебвозился с одной крайне муторной багой
Есть например некий объект, использующий concurrent_queue из номоводного Concurrency от vs2010. В деструкторе зовется как положено метод clear. И падает иногда. Очень хитро падает, тварь - только на smp машинах с xp. Под другими (проверялось на w7 & ws2008r2) не падает
Оказалось что subj глючен:

char _Buf[sizeof(_Ty)]; // <-- тут создаем неинициализированный буфер
if (!_Internal_pop_if_present(reinterpret_cast<_Ty*>(_Buf)))


virtual void _Assign_and_destroy_item( void* _Dst, _Page& _Src, size_t _Index )
{
_Ty& _From = _Get_ref(_Src,_Index);
_Destroyer _D(_From);
*static_cast<_Ty*>(_Dst) = _From; // а тут присваиваем неинициализированному объекту по адресу
_Buf. Соотв-но оператор = тошнит
}

лучше всего использовать простой но рабочий код вроде
while(queue.try_pop(dst)){}

Ненависть, ненависть, ненависть

понедельник, 24 октября 2011 г.

bundestrojaner

если кто не читал например:
Особенное возмущение общественности вызвало то, что "бундестроян" может не только скачивать данные с зараженных компьютеров, но и загружать их туда. Таким образом, законность тех или иных доказательств, впоследствии представленных полицией в суд, оказывается сомнительной. При этом следы собственного пребывания в чужом ПК программа умеет стирать
Разработчики антивирусных программ F-Secure и Sophos заявили, что обновляют базы и добавляют защиту от "бундестрояна". Ожидается, что и другие компании последуют их примеру
Надо полагать Спасатели Вселенной™ не добавят, ибо социально близкие, бгг

пятница, 21 октября 2011 г.

RegisterApplicationRecoveryCallback

А вот например начиная с висты появилась такая местами документированная ф-ция
Сохраняет она все что нужно в поле PEB.WerRegistrationData, тип и назначение которого нигде не описано. Но когда это кого останавливало, бгг ?
Краткий просмотр ф-ции WerpRegisterRecovery говорит нам, что поле это присваивается в ф-ции WerpInitPEBStore примерно таким кодом:

  push    4               ; flProtect
  push    3000h           ; flAllocationType
  push    8D0h            ; dwSize
  push    edi             ; lpAddress
  call    ds:__imp__VirtualAlloc@16 ; VirtualAlloc(x,x,x,x)
  mov     [esi+230h], eax ; PEB.WerRegistrationData


размер структуры чуть ниже кладется в ее первый dword:

  mov     dword ptr [eax], 8D0h

Размер зависит от версии windows - под vista (на всех sp) он равен 0x10c8 байт, на w7 & w8 0x8d0 байт
Вся структура впрочем не нужна - интересен только следующий кусочек:

  push    [ebp+pRecoveryCallback]
  call    ds:__imp__RtlEncodeSystemPointer@4 ; RtlEncodeSystemPointer(x)
  mov     [edi+830h], eax

Смещение, по которому хранится закодированный указатель на pRecoveryCallback на разных версиях windows также разное - на vista 0x1030, на w7 & w8 0x830

четверг, 20 октября 2011 г.

ненависти псто

мне тут давеча пришлось сопрягать свою замечательную прогу, написанную на устаревшем (как мне было замечено, бгг) visual c++ 2008 с внешней .dll, написанной на новомодной visual c++ 2010
Оно не сопрягается наглухо и вообще MS кажется полностью забили на обратную совместимость своих компиляторов. Например у них теперь std::string бинарно различаются в разных версиях. Что характерно names mangling при этом не поменялся и оно спокойно себе линкуется, только падает потом во всяких непредсказуемых местах. Коммерческий продукт, ага, хуже gcc.
API design for C++, угу-угу
Ненависть, ненависть, ненависть

суббота, 15 октября 2011 г.

кризис к ним приходит

кризиса вкус всегда настоящий
По моему они конкретно охуели code search все. Где же я теперь буду искать всякое полезное ?

четверг, 13 октября 2011 г.

wincheck rc5

скачать
Изменения делятся на две группы
Лучшая поддержка windows8
  • опция -ndis работает. По крайней мере в синяк не падает, бгг. Показывает всякий треш для FilterBlocks - я не буду доделывать пока хотя бы rc windows8 не выйдет
  • shim handlers показываются
  • windows8 specific RPC интерфейсы опознаются вроде бы все
Поддержка структур LSA
и прочих всяких мест, где теоретически можно поставить перехват и потырить ваши шестисимвольные пароли от порнухи, бгг
  • проверяются всякие таблицы ф-ций в ksecdd.sys. Не все есс-но - только те которые я смог достать
  • обработчики, поставленные с помощью LsaIRegisterPolicyChangeNotificationCallback
  •  всякие таблицы ф-ций, возвращаемые LSA Security Providers. С немалым удивлением обнаружил, что они почти все живут в секции данных и соотв-но их перехват не детектит никто например, бгг
Традиционно были добавлены пофикшены некоторые баги

среда, 12 октября 2011 г.

w8 DelayLoadFailureHookImplementation

а вот например я тут писал уже давеча про эту чудесную ф-цию
Намедни выяснилось что в windows 8 она живет в kernel32.dll и теоретически может вызываться из практически любого процесса
Под катом ужас и моральный террор (413 модулей !)

LsaIRegisterPolicyChangeNotificationCallback

а вот например в lsasrv.dll есть такая традиционно недокументированная ф-ция, которая умеет регистрировать указатель на ф-цию. Соотв-но было бы весьма неплохо посмотреть чего там зарегистрировано всякими разными
Например из дизасма очевидно что для хранения callbacks используется массив LsaPolicyChangeNotificationList, который состоит из 8 (под w7 & w8 - 9) структур

struct PolicyChangeNotification
{
  struct _LIST_ENTRY List;
  ULONG Count;
};

List соотв-но хранит уже непосредственно структуры, описывающие callback - примерно такие:

struct PolicyChangeNotification_item
{
/* Win32 Win64 */
/*  0x0  0x0  */  struct _LIST_ENTRY ListLink;
/*  0x8  0x10 */  PBYTE  function_cb;
/*  0xC  0x18 */  PBYTE  unk1;
/* 0x10  0x20 */  PBYTE  unk2;
/* 0x14  0x28 */  PBYTE  unk3;
};

По моему навигация по этим структурам представляет собой тривиальную задачу, так же как их нахождение
Результаты на моей рабочей машине например

воскресенье, 9 октября 2011 г.

ыыыы

Для лечения вируса были использованы инструкции по удалению вредоносного ПО с сайта Лаборатории Касперского, однако, это не помогло
отсюда. хабр, бывает, доставляет иногда
Есть мнение что Е.В. вкладывает немалые бабки не туда, иначе такого антипиара просто не могло бы случитца. Ничего, Люди поправят направление денежных потоков, бгг

суббота, 8 октября 2011 г.

внезапно

в продаже с 22 декабря


В пятом издании было 1232 страницы
в этом 1344
интересно там есть список глав, которые были полностью copy & pasted из предыдущего издания ? Вот почему бы им например не выпускать патчи к предыдущим изданиям ?

пятница, 7 октября 2011 г.

w8 kernel mode RPC

я тут писал уже как-то про msrpc например
А теперь дискотека список драйверов от windows 8 и используемые ими RPC interfaces

afd.sys - использует 30ADC50C-5CBC-46CE-9A0E-91914789E23C
appid.sys - использует 8A7B5006-CC13-11DB-9705-005056C00008
dfsc.sys - использует 7F1343FE-50A9-4927-A778-0C5859517BAC
FWPKCLNT.SYS - использует 2 интерфейса:
  1. IkeRpcIKE A398E520-D59A-4BDD-AA7A-3C1E0303A511
  2. BfeRpcBFE DD490425-5325-4565-B774-7E27D6C09C24
ksecdd.sys - использует 4F32ADC8-6052-4A04-8701-293CCF2096F0
mrxsmb.sys - использует F2C9B409-C1C9-4100-8639-D8AB1486694A
netio.sys - использует 2 интерфейса:
  1. WinNsi 7EA70BCF-48AF-4F6A-8968-6A440754D5FA
  2. BiSrvSigna C605F9FB-F0A3-4E2A-A073-73560F8D9E3E
ntfs.sys - использует 04EEB297-CBF4-466B-8A2A-BFD6A2F10BBA
srvnet.sys - использует 3 интерфейса:
  1. XactSrvRPC 98716D03-89AC-44C7-BB8C-285824E51C4A
  2. IdSegSrv 1A0D010F-1C33-432C-B0F5-8CF4E8053099
  3. и один неопознанный 9D5F40FF-F1C2-4394-8671-9E56427FCD70. Используется впрочем единственный метод NotifyGroveler
tunnel.sys - использует 6F201A55-A24D-495F-AAC9-2F4FCE34DF99

srvsvc.dll RPC interfaces

Server Service DLL

Например под windows 8 интерфейс srvsvc имеет версию 3.0 и 0x45 методов
Добавленные методы:
0x3A: LocalrSessionEnum
0x3B: LocalrSessionGetInfo
0x3C: LocalrSessionDel
0x3D: LocalrFileEnum
0x3E: LocalrFileGetInfo
0x3F: LocalrFileClose
0x40: LocalrShareEnum
0x41: LocalrShareGetInfo
0x42: LocalrShareSetInfo
0x43: LocalrShareAdd
0x44: LocalrShareDelEx


XactSrv 98716D03-89AC-44C7-BB8C-285824E51C4A version 1.0
регистрируется в epmapper с аннотацией XactSrv service
6 methods:
  • XsOpenPrinter
  • XsClosePrinter
  • XsAddJob
  • XsScheduleJob
  • XsProcessPnp
  • XsProcDownLevelAPI
 вызывается через msrpc из драйвера srvnet.sys

IdSegSrv 1A0D010F-1C33-432C-B0F5-8CF4E8053099 version 1.0
регистрируется в epmapper с аннотацией IdSegSrv service
2 methods:
  • IdSegRequestNextSequence
  • IdSegRequestNodeInvalidation
 вызывается через msrpc из драйвера srvnet.sys

wkssvc.dll RPC interfaces

Workstation Service DLL
кроме всем известного wkssvc под windows 8 имеет следующие RPC интерфейсы:

F2C9B409-C1C9-4100-8639-D8AB1486694A version 1.0
регистрируется в epmapper с аннотацией Witness Client Upcall Server
2 methods:
  • ClusterConnectUpcall
  • ClusterDisConnectUpcall
вызывается через msrpc из драйвера mrxsmb.sys

EB081A0D-10EE-478A-A1DD-50995283E7A8 version 3.0
регистрируется в epmapper с аннотацией Witness Client Test Interface
1 method:
  • GetWitnessNodes
7F1343FE-50A9-4927-A778-0C5859517BAC version 1.0
регистрируется в epmapper с аннотацией DfsDs service
4 methods:
  • DfsDsGetDcName
  • DfsDsIsDomainController
  • DfsCredWrite
  • DfsCredDelete
вызывается через msrpc из драйвера dfsc.sys

connhlp.dll RPC interface

Connectivity Helper API
cpprovider 6F201A55-A24D-495F-AAC9-2F4FCE34DF99 version 1.0
0xd methods:
  • SpiEstablishSession
  • SpiTerminateSession
  • SpiTransitionFromDormantToActive
  • SpiTransitionFromActiveToDormant
  • SpiAddTransportId
  • SpiRemoveTransportId
  • SpiIsRemoteTransportIdReachable
  • SpiSendData
  • SpiReceiveData
  • SpiReceiveAuthorizeCallback
  • SpiReceiveAuthorizeCallbackComplete
  • SpiQueryPeerLinkInformation
  • SpiQueryProviderSubscriptionInformation
 вызывается через msrpc из драйвера tunnel.sys

efssvc.dll RPC interfaces

EFS Service
efsrpc DF1941C5-FE89-4E79-BF10-463657ACF44D version 1.0
0x15 methods:
  • EfsRpcOpenFileRaw
  • EfsRpcReadFileRaw
  • EfsRpcWriteFileRaw
  • EfsRpcCloseRaw
  • EfsRpcEncryptFileSrv
  • EfsRpcDecryptFileSrv
  • EfsRpcQueryUsersOnFile
  • EfsRpcQueryRecoveryAgents
  • EfsRpcRemoveUsersFromFile
  • EfsRpcAddUsersToFile
  • EfsRpcSetFileEncryptionKey
  • EfsRpcNotSupported
  • EfsRpcFileKeyInfo
  • EfsRpcDuplicateEncryptionInfoFile
  • EfsUsePinForEncryptedFiles
  • EfsRpcAddUsersToFileEx
  • EfsRpcFileKeyInfoEx
  • EfsRpcGenerateEfsStream
  • EfsRpcGetEncryptedFileMetadata
  • EfsRpcSetEncryptedFileMetadata
  • EfsRpcFlushEfsCache
efskrpc 04EEB297-CBF4-466B-8A2A-BFD6A2F10BBA version 1.0
4 methods
  • EfsKRpcEstablishRpcConnection
  • EfsKRpcDecryptFek
  • EfsKRpcGenerateKey
  • EfsKRpcGenerateDirEfs
вызывается через msrpc.sys из драйвера ntfs например

ida 6.2

вышла например
changelog впрочем не впечатляет

wininet.dll RPC interfaces

CAD784CB-4C1B-4D96-B8F7-4716B568B13C version 1.0
0x37 methods:
  • s_UrlCacheGetManagerInterface
  • s_UrlCachePingServer
  • s_UrlCacheOpenContainer
  • s_UrlCacheCloseContainer
  • s_UrlCacheAddUrl
  • s_UrlCacheLookupUrl
  • s_UrlCacheCheckUrlsExist
  • s_UrlCacheGetUrlBinaryBlob
  • s_UrlCacheAddUrlBinaryBlob
  • s_UrlCacheDeleteUrl
  • s_UrlCacheUnlockUrl
  • s_UrlCacheUpdateUrl
  • s_UrlCacheEntryEnum
  • s_UrlCacheEntryEnumClose
  • s_UrlCacheEntryEnumNext
  • s_UrlCacheCleanupUrls
  • s_UrlCacheGetSize
  • s_UrlCacheGetLimit
  • s_UrlCacheSetLimit
  • s_UrlCacheGetBloomFilter
  • s_UrlCacheGetNextDirectory
  • s_UrlCacheAddLeakFile
  • s_UrlCacheCreateGroup
  • s_UrlCacheDeleteGroup
  • s_UrlCacheGetGroupIds
  • s_UrlCacheGetGroup
  • s_UrlCacheUpdateGroup
  • s_UrlCacheSetUrlGroup
  • s_UrlCacheGetContentContainerDirectories
  • s_UrlCacheCreateExtensibleContainer
  • s_UrlCacheDeleteExtensibleContainer
  • s_UrlCacheGetExtensibleContainersList
  • s_UrlCacheRpcSetGlobalLimit
  • s_UrlCacheRpcGetGlobalLimit
  • s_AppCacheOpenContainer
  • s_AppCacheCloseContainer
  • s_AppCacheRpcCheckManifest
  • s_AppCacheRpcLookup
  • s_AppCacheRpcDeleteGroup
  • s_AppCacheRpcDeleteIeGroup
  • s_AppCacheRpcGetFallbackUrl
  • s_AppCacheRpcGetDownloadList
  • s_AppCacheRpcCloseHandle
  • s_AppCacheRpcGetInfo
  • s_AppCacheRpcGetGroupsList
  • s_AppCacheRpcGetIeGroupList
  • s_AppCacheRpcFreeIeSpace
  • s_AppCacheRpcRetrieveUrl
  • s_AppCacheRpcCommitUrl
  • s_AppCacheRpcFinalize
  • s_DependencyStoreOpenContainer
  • s_DependencyStoreCloseContainer
  • s_DependencyStoreUpdateUrl
  • s_DependencyStoreRetrieveUrl
  • s_DependencyStoreDeleteContainer
7856FB07-7EFE-4029-A4CB-4848641C40FF version 1.0
0x1F methods:
  • s_IDBFactory_openDatabase
  • s_IDBFactory_deleteDatabase
  • s_IDBDatabase_createObjectStore
  • s_IDBDatabase_deleteObjectStore
  • s_IDBDatabase_setVersion
  • s_IDBDatabase_transaction
  • s_IDBDatabase_close
  • s_IDBTransaction_openObjectStore
  • s_IDBTransaction_abortAndClose
  • s_IDBTransaction_commitAndClose
  • s_IDBObjectStore_put
  • s_IDBObjectStore_add
  • s_IDBObjectStore_get
  • s_IDBObjectStore_getFromKeyRange
  • s_IDBObjectStore_delete
  • s_IDBObjectStore_clear
  • s_IDBObjectStore_openCursor
  • s_IDBObjectStore_createIndex
  • s_IDBObjectStore_openIndex
  • s_IDBObjectStore_deleteIndex
  • s_IDBObjectStore_close
  • s_IDBIndex_openCursor
  • s_IDBIndex_get
  • s_IDBIndex_getFromKeyRange
  • s_IDBIndex_getKey
  • s_IDBIndex_getKeyFromKeyRange
  • s_IDBIndex_close
  • s_IDBCursor_update
  • s_IDBCursor_continue
  • s_IDBCursor_delete
  • s_IDBCursor_close

четверг, 6 октября 2011 г.

appidsvc.dll RPC interface

Application Identity Service
8A7B5006-CC13-11DB-9705-005056C00008 version 1.0
2 methods:
  • AppIDRpcVerifyFile
  • AppIDRpcVerifyPackageMoniker
Регистрирует себя в epmapper с аннотацией AppIDSvc
Вызывается через msrpc из драйвера appid.sys

надо полагать

теперь в полночь все ваши айфоны превратятся в тыкву перейдут на windows 7 mobile, бгг

вторник, 4 октября 2011 г.

ViErrorDescriptions

и вот еще на сладкое - диагностические сообщения, которые driver verifier может выдать в ф-ции ViErrorDisplayDescription (в квадратных скобках внутренний код сообщения). По моему дают весьма наглядное представление о технологии

VerifierExt.sys

а вот например начиная с w8 driver verifier также содержит часть кода во внешнем драйвере VerifierExt.sys. Я понятия не имею зачем было так сделано - никакого механизма plugins в driver verifier по прежнему не предусмотрено и имя VerifierExt.sys жестко прошито в ntoskrnl.exe
Соотв-но интересен интерфейс сопряжения между этим драйвером и ядром
Например таблицы ф-ций driver verifierа в ядре имеют примерно такой формат:

struct THUNK_ITEM

{
  const char *func_name;
  PVOID verifier_thunk;
  PVOID unknown;
  ULONG index;
  PVOID *original_func;
};
Здесь интерес представляют три поля
  •  verifier_thunk - это собственно указатель на ф-цию, производящую разнообразные проверки параметров, уровень Irql и так далее
  • original_func - указатель на указатель на оригинальную ф-цию, перехват которой осуществлен driver verifier
  • index - просто некое уникальное число
 Драйвер VerifierExt.sys помимо всякого предоставляет экспортируемую ф-цию GetXdvDDIWrappers, которая возвращает примерно такую структуру:

struct ddi_wrappers

{
  DWORD version; // равен 4, что проверяется в ф-ции ViXdvBindXdvDDIWrappers
  DWORD tab_size;
  PVOID wrappers[tab_size];
};
Соотв-но связь между указателем на ф-цию верификации в wrappers и набором THUNK_ITEM в ядре происходит по полю THUNK_ITEM.index
Например ф-ция валидации ExCreateCallback лежит по индексу 24 в массиве wrappers. Она же имеет index 24 в VfXdvThunks
Список ф-ций из VerifierExt.sys:

понедельник, 26 сентября 2011 г.

w8 NTDLL kernel mode to user mode callbacks

а вот например я уже постил всякое на эту тему
в w8 таких ф-ций теперь 13 штук:
  • LdrInitializeThunk
  • RtlUserThreadStart
  • KiUserExceptionDispatcher
  • KiUserApcDispatcher
  • KiUserCallbackDispatcher
  • LdrHotPatchRoutine
  • KiRaiseUserExceptionDispatcher
  • ExpInterlockedPopEntrySListEnd
  • ExpInterlockedPopEntrySListFault
  • ExpInterlockedPopEntrySListResume
  • EtwpNotificationThread
  • RtlpWnfNotificationThread
  • LdrSystemDllInitBlock - не ф-ция
Соотв-но в 64битной версии w8 их уже 19 штук:
  • LdrInitializeThunk
  • RtlUserThreadStart
  • KiUserExceptionDispatcher
  • KiUserApcDispatcher
  • KiUserCallbackDispatcher
  • LdrHotPatchRoutine
  • KiRaiseUserExceptionDispatcher
  • RtlpExecuteUmsThread
  • RtlpUmsThreadYield
  • RtlpUmsExecuteYieldThreadEnd
  • ExpInterlockedPopEntrySListEnd
  • ExpInterlockedPopEntrySListFault
  • ExpInterlockedPopEntrySListResume
  • ExpInterlockedPopEntrySListEnd16
  • ExpInterlockedPopEntrySListFault16
  • ExpInterlockedPopEntrySListResume16
  • EtwpNotificationThread
  • RtlpWnfNotificationThread
  • LdrSystemDllInitBlock - не ф-ция

VfMandatoryThunks

продолжая тему
таблица одинакова в vista, w7 & w8

w8 VfXdvThunks

а вот например в ядре w8 driver verifier состоит нынче аж из четырех таблиц:
  1. VfXdvThunks
  2. VfPoolThunks
  3. VfMandatoryThunks
  4. VfRegularThunks
Соотв-но VfXdvThunks содержит в себе следующие ф-ции (303 штуки !):

w8 shim handlers

по сравнению с windows 7 добавилось еще несколько ф-ций:
  • SE_InitializeEngine
  • SE_ShimDllLoaded
  • SE_InstallBeforeInit
  • SE_InstallAfterInit
  • SE_DllLoaded
  • SE_DllUnloaded
  • SE_LdrEntryRemoved
  • SE_ProcessDying
  • SE_LdrResolveDllName
  • SE_GetProcAddressForCaller

пятница, 23 сентября 2011 г.

wincheck rc4 for windows 8

Скачать
32bit only, патамушта я так и не понял как в 64битной версии разрешить загрузку неподписанных драйверов
Изменений не особо много:
  • добавлен манифест, требующий запуска от имени администратора
  • добавлена опция -npo для показа владельцев named pipes RPC интерфейсов
  • и самое главное - оно вполне устойчиво работает на windows 8 developer preview
Под windows 8 не работают следующие вещи (из тех что я знаю):
  • опция -ndis. Там довольно много нужно дописывать - я лучше дождусь хотя бы beta версию w8
  • не показываются WMI regentries. Аналогично я подожду более другую версию w8
  • не показываются shim handlers
  • пара RPC интерфейсов из taskhost.exe осталась неопознанной
  • и еще наверняка over 9000 багов, бгг