суббота, 31 июля 2010 г.

Ищем в кернеле KdDebuggerDataBlock

Если вы не знаете что такое KdDebuggerDataBlock и зачем оно нужно - дальше лучше не читать. Если знаете - то наверняка и сами умеете находить эту структуру и дальше тоже можно не читать

pic.plw

Залил например на sourceforge сорцы очередного античного баяна - ida plugin для работы с unix x86 position independent code
Написано это было в те древние времена, когда Visual C++ 6.0 был крутейшей средой разработки IDA Pro еще не умела правильно работать с PIC. С тех пор мне под unix/linux ничего дизассемблировать особо не нужно, так что я даже не знаю, изменилось ли в IDA Pro с тех пор положение
Поскольку дока давно потеряна - писать новую мне лень тем более что код самодокументирован
Update: рукописи не горят - дока нашлась - спасибо отличному сайту idapalace.net !

четверг, 29 июля 2010 г.

sql затуп

Дальше интересно только гражданам, хорошо знающим sql вобще и mysql в частности

ndis!_NDIS_IF_BLOCK

Начало
Часть 1
Часть 2
Часть 3
В этой части даются определения структур ndis!_NDIS_IF_BLOCK, описывающих сетевые интерфейсы (доступны начиная с висты), как получить адреса ndisIfListLock и ndisIfList и почему windbg в данном случае врет

понедельник, 26 июля 2010 г.

McAfee

а вот стоит например у меня на машине McAfee 4.5 и решил я сегодня проверить, что же именно этот тормоз перехватывает.
SSDT не трогает, но угоняет сплайсом в ядре следующие функции:
ZwYieldExecution
NtCreateFile
NtMapViewOfSection
NtUnmapViewOfSection
NtProtectVirtualMemory
NtOpenProcess
NtOpenThread
NtSetInformationProcess
NtCreateProcessEx
NtCreateProcess
NtSetContextThread
NtTerminateProcess
NtQueryValueKey
NtSetValueKey
NtUnloadKey
NtQueryMultipleValueKey
NtRenameKey
NtCreateKey
NtDeleteKey
NtDeleteValueKey
NtEnumerateKey
NtEnumerateValueKey
NtOpenKey
NtQueryKey
NtRestoreKey
NtLoadKey2
NtReplaceKey
NtNotifyChangeKey
Ну что тут сказать - мало того что авторы не знают про древний трюк с AssignProcessToJobObject, так еще и не перехватывают загрузку драйверов - грабь-убивай грузи дрова-ставь руткиты - онтевирус даже ухом не моргнет

Отличный, просто отличный продукт, чо там

воскресенье, 25 июля 2010 г.

Ищем по metal-archives.com

Потребовалось мне тут давеча много и нудно искать всякие разнообразные альбомы на митал-архивах. И поскольку я обладаю всеми доблестями perl программиста (лень, нетерпимость, высокомерие, если кто не знал), то решил я это дело немножечко автоматизировать
Поиск по CPAN не дал ничего (Perl’s killer feature, ага), что очень странно - неужто никто из матерых perlовщиков не слушает металл например ? Пришлось писать самому. Сорец прилагается

суббота, 24 июля 2010 г.

Сплайсер для Windows x64

Disclaimer

Эту заметку я обещал еще ранней весной написать для третьего номера отличного журнала No Bunkum. Но получилось как обычно - сначала я был дико занят, а потом похоже у авторов издания бензина хватило только на два номера. Надеюсь они не сильно обидятся, если я опубликую эти малосвязные жалкие заметки в своем блоге

Крякер интернета

А признайтесь мне - бывало ли у вас так, что еще вчера вы бодро и бессмысленно посещали всякие нужные сайты, а после скачивания и запуска какого-нть широко разрекламированного "sms перехватчика" или прочей срани типа "взломщика водноклассников" некоторые сайты больше не открываются а там столько отличной порнушки с немецкими овчарками осталось, а то и вовсе заявляют что ваш аккаунт заблокирован -"дэнги давай" ?
Ладно, можете не признаваться, и не надеялся особо тащемта

Я тут составил небольшой списочек мест где надо побывать с мертвой принцессой посмотреть всякое чтобы может быть (ложная надежда) как-нибудь немножечко исправить положение

среда, 21 июля 2010 г.

win32k.sys system call tables

для 32 бит - nt, w2k, xp, w2k3, vista, w2008, w7
для 64 бит - xp, w2k3, vista, w2008, w7

Поставил сегодня vista 64bit

поймал сразу два bsod
один - потому что под вистой таки поменялась структура _KINTERRUPT
второй - потому что дебил неправильно итерировал по спискам _LIST_ENTRY - обычно раньше на всех виндах прокатывал следующий цикл:

  for ( iter = *List;
        (iter != NULL) && MmIsAddressValid(iter);
        iter = iter->Flink )


под вистой же все списки именно закольцованные - последний элемент содержит адрес List, а не треш какой-нть, т.е. нужно примерно так:
  for ( iter = *List;
        (iter != NULL) && MmIsAddressValid(iter) && (iter != (LIST_ENTRY*)List);
        iter = iter->Flink )


Итого оно бодро и весело сожрало весь и так не великий стек и свалилось в синяк. Забавно что под windows 7 64bit оно таки работало

Обновил кстати все ndis структуры версиями для vista 64 бита

воскресенье, 18 июля 2010 г.

IDA plug-in writing in C/C++

а вот если кто не знал например или такой же тормоз как я - оказывается есть в природе такая книжка, причем ее можно даже совершенно официально невозбранно скачать на сайте автора Steve Micallef.
Я пролистал ее бегло - на первый взгляд выглядит значительно более толково чем бесполезные чуть более чем полностью фолианты пыщъх криса касперски

Ксакеп

Давным давно в далекой галактике когда я только начал изучать внутренности NDIS, гугль выдал мне ссылку на детский юмористический журнал ксакеп - статья называлась Тушим огненные стены
И все там было понятно и доступно изложено, но была в ней одна маленькая но весьма чреватая падением в BSOD неточность - автор Александр Эккерт описывает структуру NDIS_PROTOCOL_BLOCK так:

typedef struct _NDIS_PROTOCOL_BLOCK {
  PNDIS_OPEN_BLOCK OpenBlock;
  REFERENCE Reference;
  UINT Length;
  NDIS50_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics;
  struct _NDIS_PROTOCOL_BLOCK *Next;
  ULONG MaxPatternSize;
} NDIS_PROTOCOL_BLOCK, *PNDIS_PROTOCOL_BLOCK;


Но мы-то знаем как они выглядят на самом деле - нету таких определений под всеми доступными мне windows. Опять же гугл (чтобы мы без него делали) сказал, что данное определение выдрано из Windows Me - prooflink. В самой же статье про это нет ни единого упоминания.

Вы бы это, тщательнее бы проверяли факты, г-н Александр Эккерт.

ndis!_NDIS_PROTOCOL_BLOCK

Начало
Часть 1
Часть 2
На сей раз попробуем достать ndisProtocolList вместе со смещением на поле NextProtocol (необходимое для итерации) по списку совершенно недокументированных структур _NDIS_PROTOCOL_BLOCK

RPat

Залил например на заведенный вчера прожект на sourceforge

RPat - тулза на основе binutils, предназначенная для генерации сигнатур для IDA Pro flair.
Flair поддерживает следующие форматы при создании сигнатур (взято из flair\readme):
plb            parselib  processes OMF  libraries and creates PAT file
pcf            parsecoff processes COFF libraries and creates PAT file
pelf           parseelf  processes ELF  libraries and creates PAT file
ppsx         parsepsx  processes PSX  libraries and creates PAT file (Sony Playstation)
ptmobj      parsetobj processes Trimedia libraries .... .... ....
pomf166   Keil C166 object files (old format)
Но как известно форматов объектных файлов существует гораздо больше, и в дикой природе даже уже существует инструмент, грозящийся поддерживать довольно много из них - это пакет GNU binutils. Соотв-но логично использовать его для грязной работы разбора форматов, а самому дописать только выходной генератор .pat файлов, что и было однажды проделано 11 лет назад

Если кто не знает например что такое .pat файлы и чего с ними дальше делать - дальше можете не читать

суббота, 17 июля 2010 г.

завел прожект на sourceforge

буду теперь туда opensource троянов на brainfuck заливать
сатанинская совершенно технология - почему-то залить файлы в SVN получилось только с третьего раза. Предназначение остальных ихних тысяч всяких кнопачек и ссылочек осталось пока загадочным

Пока залил туда с немалым трудом только сорцы плагина к IDA Pro для конвертации кириллических кодировок cyr.plw - в результате прожект тоже носит гордое и корявое название cyrplw. Впрочем тег idapro выставлен - думаю кому надо найдут
вступай и компелируй (c)
Если мне будет не сильно лень - можно будет в свободное от праздного безделья время залить туда же еще некоторые разной степени античной баянистости вещи для IDA Pro, ныне рассыпанные по всему инторнету

Умная мысль

как обычно чужая
Статья довольно длинная, так что я ключевой кусочек только процитирую:
серебряная пуля есть. Вот она:

  • Необходимо иметь либо работающий макет приложения, который устраивает заказчика, либо глубоко разбираться в предметной области и знать, что же требуется, а еще лучше – и то, и другое.

  • Надо хорошо знать инструмент, которым пользуешься – в нем не должно быть никаких темных мест и неожиданных свойств. Он должен быть известен досконально, все его сильные и слабые стороны

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

  • выберите любые два из трех пунктов
    Между прочим из вышесказанного можно по некотором размышлении сделать пару выводов.
    1. Программирование в вакууме - никому не нужно. Т.е. нужно сначала знать предметную область, а уже потом обладать навыками изложения своего желания компьютеру. Горячий привет факультетам computer science
    2. Имеет смысл писать максимально простые средства разработки для использования Обычными Средними Людьми, чтобы они сами ваяли себе чего им нужно, чем изобретать очередной Универсальный Мегаязык Программирования для гиков. Здравствуйте, генераторы сайтов и визуальные конструкторы форм a'la delphi или visual basic
    Не в том ли секрет грандиозного успеха 1С Бухгалтерии и одновременно ее выдающая кривизна с точки зрения программиста, что она написана бухгалтерами для бухгалтеров под мудрым руководством Самого Главного Бухгалтера ?

    ndis!_NDIS_COMMON_OPEN_BLOCK

    Продолжаем методичную вивисекцию NDIS
    Начало
    Часть 1
    На сей раз попробуем извлечь список ndisGlobalOpenList и смещение на его поле NextGlobalOpen (необходимо для итерации по списку из структур ndis!_NDIS_COMMON_OPEN_BLOCK)

    четверг, 15 июля 2010 г.

    Критика perl

    если кто не читал например сей античный баян: критический анализ языка perl
    вобщем-то ничего особо нового, предъявы в духе "а еще они строем не ходят", но дичайше позабавил следующий фрагмент:

    1.3. Числа


    И здесь не обошлось без сюрпризов. Кроме стандартных форм записи целых и вещественных чисел вроде
    123         # целое
    123.123   # вещественное
    .5           # при записи десятичных дробей ноль в целой части можно опускать
    .5E-10     # экспоненциальная форма
    0xABCD  # шестнадцатеричные числа записываются как в C
    0377        # если первая цифра - ноль, то это восьмеричное число
    PERL поддерживает и такую:
    9_123_456  # это, видимо, для "удобства чтения"
    и даже, как показывает практика, такую:
    9_1__2_3___456_____ # что сие означает, надо спросить у Larry Wall
     А теперь смотрим тут:
    This proposal suggests that Java follow the lead of the Ruby programming language in allowing the underscore character to be inserted into numbers in most positions, for readability purposes.
    
    ADVANCED EXAMPLE:
    
    long creditCardNumber = 1234_5678_9012_3456L;
    long socialSecurityNumbers = 999_99_9999L;
    float monetaryAmount = 12_345_132.12;
    long hexBytes = 0xFF_EC_DE_5E;
    long hexWords = 0xFFEC_DE5E;
    long maxLong = 0x7fff_ffff_ffff_ffffL;
    long alsoMaxLong = 9_223_372_036_854_775_807L;
    double whyWouldYouEverDoThis = 0x1_.ffff_ffff_ffff_fp10_23
     бгг

    среда, 14 июля 2010 г.

    ndis!_NDIS_MINIPORT_BLOCK

    Продолжаем дилетантские ковыряния отверткой в ухе в кишках ndis
    В этой заметке описываются структура _NDIS_MINIPORT_BLOCK а также довольно тупой способ узнать смещение на поле NextGlobalMiniport, которое необходимо для создания итератора по этим структурам

    воскресенье, 11 июля 2010 г.

    Effective Perl Programming

    Все же subj задрал своими маловразумительными примерами и даже прямыми очепятками.
    Вот например - item 36 (p127):
    $big_str =~ /\Q$little_str/g;  # or /og, maybe
    my $pos = pos($big_str) - length($big_str);
    явная бага, нужно вычитать длину  $little_str
    Или скажем примерчик из item 35 (p121):
    # a double-quoted string
    $_ = 'a "double-quoted \"string\042"';
    my ($str) = /("(\\["\\]|\\\d{1,3}|.)*?")/;
    print $str;  # "double-quoted \"string\042"
    И чего тут поменяется если убрать question mark ? Ровно такой же результат выдается. Для того чтобы результаты были разные нужно добавить в $_ еще что-нть с дополнительными кавычками, вроде
    $_ = "'a "double-quoted \"string\042" some shit"';
    тогда применение greedy matching против non-greedy выдаст реально разные результаты
    Или вот еще примерчик с typeglobs aliasing из item 118 (p423) на самом деле напечатает
    yello ren
    hello stimpy
    hello stimpy
    а не то что сказано в комментариях

    Интересно у авторов subj есть страничка куда можно слать bug reports ?

    Перечисляем зарегистрированные Callbacks

    Callbacks - отличный механизм виндов, позволяющий драйверам получать нотификацию о всяких разных событиях. Если вы когда-либо запускали WinObj, то могли видеть имена этих callbacks в узле Callback
    К сожалению как обычно - внутренности их реализации недокументированы. Но кого и когда эта мелкая неприятность останавливала ?

    Модульность

    Чего-то мне не спится и в голову лезут всякие странные мысли (книжками навеяло):
    CPAN is now Perl’s killer feature
    Ну чего - давайте проверим
    cpan.org:
    2010-07-10 online since 1995-10-26
    7182 MB 228 mirrors
    8242 authors 18001 modules
    pypi.python.org/pypi:
    There are currently 10474 packages here
    rubyforge.org:
    Hosted Projects: 8,903
    Registered Users: 52,354
    torry.net - если кто забыл или не знал - сайт с компонентами для delphi:
    Authors total: 4688
    Products total: 9851
    Чо-то как-то сравнимые цифры как мне кажется

    суббота, 10 июля 2010 г.

    NDIS structs

    Будучи хроническим алкоголиком с плохой памятью, записал сугубо для себя некоторые результаты ковыряния ndis.sys, в частности кое-какие его структуры для разных версий windows (чтобы не забыть например. тем более что часто под рукой нету кучи разных версий windows c windbg)
    Экспортируемые символы и для 64 бит 
    Они же для netio.sys и для 64 бит
    Определения констант для ndis!_NDIS_OBJECT_HEADER.Type

    IDT x64 win7

    Некоторое время назад потребовалось мне узнать формат IDT и структуру _KINTERRUPT для 64битной windows. После недолгого гугления нашел вот этот замечательный пост. Радоваться правда пришлось недолго, ибо все что там описано соответствует исключительно 64битным xp и w2k3. В vista, windows7 (а равно и в более толстой сестре-близнеце ея w2008r2) структура _KINTERRUPT поменялась и выглядит сейчас так:

    struct _KINTERRUPT_vista {
    {
    /* 0x00 */  short        Type;
    /* 0x02 */  unsigned short  Size;
    /* 0x08 */  PBYTE        Flink;
    /* 0x10 */  PBYTE        Blink;
    /* 0x18 */  PBYTE        ServiceRoutine;
    /* 0x20 */  PBYTE        MessageServiceRoutine;
    /* 0x28 */  unsigned long   MessageIndex;
    /* 0x30 */  PBYTE        ServiceContext;
    /* 0x38 */  unsigned __int64    SpinLock;
    /* 0x40 */  DWORD        TickCount;
    /* 0x48 */  unsigned __int64    ActualLock;
    /* 0x50 */  PBYTE        DispatchAddress;
    /* 0x58 */  DWORD        Vector;
    /* 0x5c */  BYTE         Irql;
    /* 0x5d */  BYTE         SynchronizeIrql;
    /* 0x5e */  BYTE         FloatingSave;
    /* 0x5f */  BYTE         Connected;
    /* 0x60 */  BYTE         Number;
    /* 0x61 */  BYTE         ShareVector;
    /* 0x64 */  DWORD        Mode;
    /* 0x68 */  DWORD        Polarity;
    /* 0x6C */  DWORD        ServiceCount;
    /* 0x70 */  DWORD        DispatchCount;
    /* 0x78 */  unsigned __int64    Rsvd1;
    /* 0x80 */  PBYTE        TrapFrame; // ptr to KTRAP_FRAME
    /* 0x88 */  PBYTE        Reserved;
    }; /* size: 0x90 */
     


    struct _KINTERRUPT_w7
    {
    /* 0x00 */  short        Type;
    /* 0x02 */  unsigned short  Size;
    /* 0x08 */  PBYTE        Flink;
    /* 0x10 */  PBYTE        Blink;
    /* 0x18 */  PBYTE        ServiceRoutine;
    /* 0x20 */  PBYTE        MessageServiceRoutine;
    /* 0x28 */  unsigned long   MessageIndex;
    /* 0x30 */  PBYTE        ServiceContext;
    /* 0x38 */  unsigned __int64    SpinLock;
    /* 0x40 */  DWORD        TickCount;
    /* 0x48 */  unsigned __int64    ActualLock;
    /* 0x50 */  PBYTE        DispatchAddress;
    /* 0x58 */  DWORD        Vector;
    /* 0x5c */  BYTE         Irql;
    /* 0x5d */  BYTE         SynchronizeIrql;
    /* 0x5e */  BYTE         FloatingSave;
    /* 0x5f */  BYTE         Connected;
    /* 0x60 */  unsigned long   Number;
    /* 0x64 */  BYTE         ShareVector[4];
    /* 0x68 */  DWORD        Mode;
    /* 0x6c */  DWORD        Polarity;
    /* 0x70 */  DWORD        ServiceCount;
    /* 0x74 */  DWORD        DispatchCount;
    /* 0x78 */  unsigned __int64    Rsvd1;
    /* 0x80 */  PBYTE        TrapFrame; // ptr to KTRAP_FRAME
    /* 0x88 */  PBYTE        Reserved;
    }; /* size: 0x90 */


    Соотв-но раньше DispatchAddress был по смещению 0x40 и переход на него выглядел как:

    push rax
    push rbp
    mov rbp, rip-0x79 ; 0x70 - sizeof(_KINTERRUPT), 0x9 - offset RIP from KiInterruptTemplate
    jmp qword ptr [rbp+0x40] ; _KINTERRUPT.DispatchAddress


    Поскольку в vista/windows7 изменилось как смещение на DispatchAddress так и размер _KINTERRUPT, то сейчас ф-ция обработчика прерывания KiInterruptTemplate выглядит так:

    push rax
    push rbp
    mov rbp, rip-0x99 ; 0x90 - sizeof(_KINTERRUPT_w7), 0x9 - offset RIP from KiInterruptTemplate
    jmp qword ptr [rbp+0x50] ; _KINTERRUPT_w7.DispatchAddress


    Весьма странно что сии полезные сведения гугл отказался мне выдавать - неужто и впрямь никто не озаботился описать сокровенные знания ?

    ужасный perl

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

    Вот давеча читаю я например второе издание Effective Perl Programming исхожу пеной от бессилия и сознания собственной тупости и невежества и в item 33 вижу следующий совет - если вы в своей гениальной программе хотя бы один только раз используете переменные $`, $& или $', то вообще любое регулярное выражение в вашей программе будет заполнять их при выполнении. Естественно не поверив, бросился немедленно в пятитысячный раз перечитывать perldoc perlre и таки да:
     WARNING: Once Perl sees that you need one of $&, $`, or $' anywhere in the program, it has to provide them for every pattern match. This may substantially slow your program.
    Все еще не веря глазам своим сделал grep по стандартным перловым пакетам на предмет использования этих чорных магических переменных - практически не используются, разве что в Pod::Html.pm и Tk::Reindex

    Заодно нашел аналогичное зловещее предупреждение в B::Lint.pm:
    This option warns whenever one of the regexp variables $', $& or $' is used. Any occurrence of any of these variables in your program can slow your whole program down
    Надо будет прошерстить на следующей неделе всю невероятную кучу своих скриптов и сделать с этим уже чего-нть.