воскресенье, 29 августа 2010 г.

среда, 25 августа 2010 г.

A catalog of NTDLL kernel mode to user mode callbacks

а вот если кто не читал например - отличное чтиво в дождливый вечер про subj:
раз
два
три
четыре
пять
шесть
чтиво старенькое (2007) но душеполезное. А вобще жаль что гражданин кроме своего jit engine больше ни про что не пишет в последнее время

воскресенье, 22 августа 2010 г.

дочитал C++ Concurrency in Action

был неиллюзорно поражен скудностью и лаконичностью главы 10 - Testing and Debugging Multithreaded Applications

Автор упоминает про combination simulation testing - идея в том чтобы протестировать все возможные комбинации всех локов всеми потоками на симуляторе. Несложно догадаться что сложность этого алгоритма O(N!), где N - сумма потоков и объектов блокировки, и вряд ли когда-нибудь этот метод будет реализован на практике. Однако - на самом деле нам не нужно прогонять все возможные комбинации при тестировании некоего куска кода - в большинстве случаев достаточно всего лишь прогнать все возможные комбинации одновременно работающих потоков, что на машине с n камнями и N потоками (как правило N > n) дает нам подмножества n конечных множеств из N (биномиальный коэффициент, ага). Практически этого можно достигнуть например применяя под linux соответствующим образом написанный планировщик - нужно дописать к нему интерфейс общения из user mode и ровно 3 ioctls:
  • поместить некий поток в группу
  • запустить перебор на одновременное исполнение для всех потоков в группе
  • сообщить результаты перебора (готово-неготово-сколько циклов прогнано)
Также автор упоминает про tests with special library, но из целой одной странички, посвященной изложению темы, можно почерпнуть мало чего. Однако - это крайне богатая идея, например можно придумать достаточно простой алгоритм для нахождения взаимной блокировки потоков. Пусть у нас есть два три потока - A, B и С, и скажем поток C делает join к потоку B, поток B делает join к потоку A, а поток A собирается сделать join с потоку C, что даст в результате вечный deadlock. Нет ничего проще - заводим внешний орграф, в нем узлы - потоки, а операции join - ребра, при добавлении нового ребра проверяем граф на наличие циклов. Если цикл обнаружен - у нас deadlock в коде

Аналогично можно находить взаимоблокировки - например в каждом потоке вести множество залоченных объектов и объектов, которые поток пытается залочить. Пусть например есть два потока
  • A, залочивший mutex a и пытающийся залочить mutex b
  • поток B, залочивший mutex b и висящий на ожидании mutex a. 
По моему для случая двух потоков нахождение таких взаимоблокировок - совершенно тривиальная задача. Или можно представлять объекты синхронизации как узлы графа, а использующие их потоки - как ребра (например в вышеописанном примере поток A будет ребром между mutexes a & b, а поток B - ребром между b & a). Нахождение взаимоблокировки в таком случае - поиск циклов графа, составленных из ребер разных потоков.

Локализация бывает смертельно опасна

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

пятница, 20 августа 2010 г.

CmRegisterCallback(Ex) on Vista

полагаю что функция, про которую я сегодня будут писать всякое, в представлении не нуждается - про нее знает даже детский юмористический журнал ксакеп
Очень хочется иногда посмотреть кто же имено тут такой умный поставил этот хук и например снять его с мясом чтоб неповадно было. Техника просмотра установленных хуков под windows xp достаточно подробно описана в первом номере журнала no bunkum (кому объяснения в статье кажутся недостаточно подробными - могут курить файл base\ntos\config\cmhook.c из wrk). Это хорошая новость. Плохая новость - начиная с висты формат хранения хуков, установленных функциями CmRegisterCallback(Ex), радикально поменялся и требует больше ударов в бубен и человеческих жертвоприношений

воскресенье, 15 августа 2010 г.

ndis!_NDIS_M_DRIVER_BLOCK

Начало
Часть 1
Часть 2
Часть 3 
Часть 4
Часть 5
Эта последняя (я надеюсь) часть дает определения структур _NDIS_M_DRIVER_BLOCK и описывает способ их получения.

суббота, 14 августа 2010 г.

C++ Concurrency in Action

осилил например за неделю примерно половину subj (автор книжки кстати тоже блоггер, бгг)
осмелюсь заметить что
  • судя по приводимым примерам C++0x - не менее бесмысленно многословный монстр чем java, а уж его standard library - вобще template hell с длиннейшими названиями для всего и к использованию непригодна чуть более чем полностью
  • дико порадовала фраза при обсуждении reader-writers mutexes "Unfortunately, the new C++ Standard Library does not provide such a mutex out of box...the examples in this section use the implementation provided by the Boost". Какое богатое поле для толкований ! Можно прочитать как "в комитете по стандартизации C++0x сидят полные придурки, ничего в жизни сами не написавшие и просто не понимающие что людям действительно нужно". Ну и без бессмысленного пожирателя ресурсов буста вы все равно обойтись не сможете, даже не надейтесь. Я прям даже и не знаю как умудрялся писать многопоточные проги на одном лишь чистом win32 api доктор что со мной ?
  • глава 5 про atomic types - это нечто запредельное по невнятности изложения. Если б я не знал например как оно устроено на уровне ассемблера - хер бы чего понял. Ибо автор не описывает что и почему, а просто излагает как оно реализовано. И пойди догадайся, что после записи в переменную на самом деле значение пишется в кеш, а в память может еще и не сразу попасть без соответствующего танца с саблями бубном. Примеры из реальной жизни почему-то полностью игнорируются. Я понемаю, виндовс сделан прямыми наследниками сотоны и потому про семейство Interlocked функций автор может быть и не в курсе. Но можно было бы взять например файлы atomic.h, mutex.h, spinlock.h из директорий arch\xxx\include\asm того же ядра linux, и даже не обязательно чтобы xxx==x86. Хотя linux тоже написан отпочковавшимися наследниками сотоны по другой линии 
  • при попытке скопировать куски из pdf получаю бодрое сообщение "Sorry, copying text from this document is not allowed". Ампутировать нужно железу алчности без наркоза таким издателям ящитаю
Глава 6 про конкурентные структуры данных пока что самая информативная из всей книги.
С интересом продолжаю чтение

пятница, 13 августа 2010 г.

ndis.sys exports

для всяких разных версий windows

четверг, 12 августа 2010 г.

скрипт для подсчета частоты импортированных символов

таки пришлось сегодня самому писать
берет на входе 1 или больше файлов, произведенных dumpbin /imports (я использовал от visual c++ 2008 - возможно для других версий формат выходного файла поменялся и нужно поправить функцию parse_file) и выдает на выходе статистику

среда, 11 августа 2010 г.

Most frequently imported symbols

нашол давеча
Было бы полезно аналогичную статистику иметь для \SystemRoot\System32\Drivers\*.sys,но похоже снова самому придется делать
И да - если вы думаете что мои предыдущие четыре поста обладают неприлично огромными размерами - можете сравнить или тут еще

ntoskrnl.exe exports

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

вторник, 10 августа 2010 г.

ntdll.dll exports 64bit

бонус-трек к предыдущей записи - теперь банановый для 64бит

ntdll.dll exports

Потребовалось мне тут найти, какие имена экспортируются из ntdll.dll для всех 32битных windows - и ведь не нашел в этих ваших интернетах
Точнее нашел, но только по w2k3
Пришлось как обычно - кряхтя слазить с печи и делать самому

понедельник, 9 августа 2010 г.

дровопейсатели - страшные люди

A computer that monitored drilling operations on the Deepwater Horizon had been freezing with a [BSOD] prior to the explosion that sank the oil rig last April, the chief electrician aboard testified Friday at a federal hearing.

In his testimony Friday, Michael Williams, the chief electronics technician aboard the Transocean-owned Deepwater Horizon, said that the rig’s safety alarm had been habitually switched to a bypass mode to avoid waking up the crew with middle-of-the-night warnings.
отсюдова

kaspersky небось какой стоял, бгг

воскресенье, 8 августа 2010 г.

ndis!_NDIS_FILTER_DRIVER_BLOCK

Начало
Часть 1
Часть 2
Часть 3 
Часть 4
В этой части даются определения структур _NDIS_FILTER_DRIVER_BLOCK, описывающих фильтры ndis 6.x (доступны начиная с висты) и как их получить
Должен заметить что тема весьма мутная и в интернете представлена крайне слабо - например я нашел только одну более-менее подробную статью, да и та на китайском

суббота, 7 августа 2010 г.

Offsets plugin

Залил на sourceforge сорцы еще одного античного (2001 года выпуска) баяна, портированного (с borland c++ между прочим и ida 4.15) на visual c++ 6.0 и ida 5.0

пятница, 6 августа 2010 г.

user32!apfnDispatch

а вот если кто не знал например - есть в природе такой способ перехвата в usermode PEB.KernelCallbackTable, причем насколько я знаю его мало кто детектит
Индексы функций можно посмотреть например тут
Соотв-но написал сегодня проверяльщик - ничего особенного, находит в user32.dll таблицу apfnDispatch и проверяет ее целостность и что PEB.KernelCallbackTable указывает именно на нее.
По ходу дела выяснилось что
  • начиная с windows 7 она живет в секции .rdata
  • можно обойтись без ассемблера - например получить TEB в своем процессе на чистом как слеза комсомолки Visual С++ можно так - под 32битами через __readfsdword(0x18), под 64битами - через __readgsqword(0x30)
  • получить PEB в чужом процессе - через NtQueryInformationProcess с классом ProcessBasicInformation

воскресенье, 1 августа 2010 г.

Language Implementation Patterns

дочитал давеча subj
имею крайне раздраженное мнение - во-первых все примеры даются на склизком неповоротливом бессмысленно многословном монстре языке java
Во-вторых я умею использовать bison уже лет 15 и всегда считал что lalr парзеры рвут ll с их backtrackingом по скорости как тузик грелку.

Но по прочтении выяснилось и кое-что полезное:
  • antlr умеет генерить код не только для java, но и для более приличных языков
  • antlr умеет также автоматически строить в процессе разбора AST дерево, чего мне в bison всегда не хватало
  • и даже более того - вместе с построением AST умеет также строить к нему tree walker
  • и даже tree pattern matcher ! правда во всей книге дано ровно полтора примера как с его помощью можно делать tree rewriting
Первую часть книги можно вобще пропустить (ну или пролистать), потому что в ней долго и нудно объясняется что такое парзер и как он работает, при этом автор умудрился не дать определение lr и lalr парзерам
Вторая часть самая содержательная - в ней объясняется как строить AST, как по нему ходить, как строить символьные таблицы и scope trees. Крайне рекомендую главу 8 - даны вполне понятные примеры построения static type checker
Третья часть очень лихо пробегает по техникам построения виртуальных машин - стековых и регистровых. Не особо подробно впрочем, как прикрутить к AST генератор байт-кода вы из нее не узнаете.
А вот четвертая часть, посвященная самому интересному - трансляции языков и созданию генераторов, откровенно лажает - в главе 11 кратко упоминается про существование rule engines для создания генераторов и дальше автор съезжает на использование templates, в особенности на применение StringTemplate

Прочитать книжку определенно стоило, но некоторые вещи описаны весьма поверхностно

MachO PICode plugins

Продолжая тему анализа в IDA Pro position independent code - залил на sourceforge еще парочку plugins - для 32битных Mach-O файлов
MachOPIC - для 32битных PPC файлов
machiPIC - для 32битных i386 файлов