для симметрии с
воскресенье, 29 августа 2010 г.
среда, 25 августа 2010 г.
воскресенье, 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:
два три потока - A, B и С, и скажем поток C делает join к потоку B, поток B делает join к потоку A, а поток A собирается сделать join с потоку C, что даст в результате вечный deadlock. Нет ничего проще - заводим внешний орграф, в нем узлы - потоки, а операции join - ребра, при добавлении нового ребра проверяем граф на наличие циклов. Если цикл обнаружен - у нас deadlock в коде
Аналогично можно находить взаимоблокировки - например в каждом потоке вести множество залоченных объектов и объектов, которые поток пытается залочить. Пусть например есть два потока
Автор упоминает про combination simulation testing - идея в том чтобы протестировать все возможные комбинации всех локов всеми потоками на симуляторе. Несложно догадаться что сложность этого алгоритма O(N!), где N - сумма потоков и объектов блокировки, и вряд ли когда-нибудь этот метод будет реализован на практике. Однако - на самом деле нам не нужно прогонять все возможные комбинации при тестировании некоего куска кода - в большинстве случаев достаточно всего лишь прогнать все возможные комбинации одновременно работающих потоков, что на машине с n камнями и N потоками (как правило N > n) дает нам подмножества n конечных множеств из N (биномиальный коэффициент, ага). Практически этого можно достигнуть например применяя под linux соответствующим образом написанный планировщик - нужно дописать к нему интерфейс общения из user mode и ровно 3 ioctls:
- поместить некий поток в группу
- запустить перебор на одновременное исполнение для всех потоков в группе
- сообщить результаты перебора (готово-неготово-сколько циклов прогнано)
Аналогично можно находить взаимоблокировки - например в каждом потоке вести множество залоченных объектов и объектов, которые поток пытается залочить. Пусть например есть два потока
- A, залочивший mutex a и пытающийся залочить mutex b
- поток B, залочивший mutex b и висящий на ожидании mutex a.
Локализация бывает смертельно опасна
а вот сижу я например давеча и расставляю mp3 теги, и попался значит мне альбом некой турецкой банды Acrosome, содержащий всякие странные символы турецкого алфавита типа ı
Полез я в гугл прочитать про турецкий алфавит - и нашел вот эту душераздирающую историю. История дичайше рекомендуется к прочтению всем, кто делает или планирует локализацию своих шедевральных программных продуктов
мораль псто вынесена в заголовок
Полез я в гугл прочитать про турецкий алфавит - и нашел вот эту душераздирающую историю. История дичайше рекомендуется к прочтению всем, кто делает или планирует локализацию своих шедевральных программных продуктов
мораль псто вынесена в заголовок
пятница, 20 августа 2010 г.
CmRegisterCallback(Ex) on Vista
полагаю что функция, про которую я сегодня будут писать всякое, в представлении не нуждается - про нее знает даже детский юмористический журнал ксакеп
Очень хочется иногда посмотреть кто же именотут такой умный поставил этот хук и например снять его с мясом чтоб неповадно было. Техника просмотра установленных хуков под windows xp достаточно подробно описана в первом номере журнала no bunkum (кому объяснения в статье кажутся недостаточно подробными - могут курить файл base\ntos\config\cmhook.c из wrk). Это хорошая новость. Плохая новость - начиная с висты формат хранения хуков, установленных функциями CmRegisterCallback(Ex), радикально поменялся и требует больше ударов в бубен и человеческих жертвоприношений
Очень хочется иногда посмотреть кто же имено
воскресенье, 15 августа 2010 г.
суббота, 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". Ампутировать нужно железу алчности без наркоза таким издателям ящитаю
С интересом продолжаю чтение
пятница, 13 августа 2010 г.
четверг, 12 августа 2010 г.
скрипт для подсчета частоты импортированных символов
таки пришлось сегодня самому писать
берет на входе 1 или больше файлов, произведенных dumpbin /imports (я использовал от visual c++ 2008 - возможно для других версий формат выходного файла поменялся и нужно поправить функцию parse_file) и выдает на выходе статистику
берет на входе 1 или больше файлов, произведенных dumpbin /imports (я использовал от visual c++ 2008 - возможно для других версий формат выходного файла поменялся и нужно поправить функцию parse_file) и выдает на выходе статистику
среда, 11 августа 2010 г.
Most frequently imported symbols
ntoskrnl.exe exports
раз уж скрипт для генерации табличек экспортов написан - чому бы и для кернела не сгенерить такую же ?
вторник, 10 августа 2010 г.
ntdll.dll exports
Потребовалось мне тут найти, какие имена экспортируются из ntdll.dll для всех 32битных windows - и ведь не нашел в этих ваших интернетах
Точнее нашел, но только по w2k3
Пришлось как обычно - кряхтя слазить с печи и делать самому
Точнее нашел, но только по 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 небось какой стоял, бгг
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 (доступны начиная с висты) и как их получить
Должен заметить что тема весьма мутная и в интернете представлена крайне слабо - например я нашел только одну более-менее подробную статью, да и та на китайском
Часть 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 указывает именно на нее.
По ходу дела выяснилось что
Индексы функций можно посмотреть например тут
Соотв-но написал сегодня проверяльщик - ничего особенного, находит в 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ом по скорости как тузик грелку.
Но по прочтении выяснилось и кое-что полезное:
Вторая часть самая содержательная - в ней объясняется как строить AST, как по нему ходить, как строить символьные таблицы и scope trees. Крайне рекомендую главу 8 - даны вполне понятные примеры построения static type checker
Третья часть очень лихо пробегает по техникам построения виртуальных машин - стековых и регистровых. Не особо подробно впрочем, как прикрутить к AST генератор байт-кода вы из нее не узнаете.
А вот четвертая часть, посвященная самому интересному - трансляции языков и созданию генераторов, откровенно лажает - в главе 11 кратко упоминается про существование rule engines для создания генераторов и дальше автор съезжает на использование templates, в особенности на применение StringTemplate
Прочитать книжку определенно стоило, но некоторые вещи описаны весьма поверхностно
имею крайне раздраженное мнение - во-первых все примеры даются на склизком неповоротливом бессмысленно многословном
Во-вторых я умею использовать bison уже лет 15 и всегда считал что lalr парзеры рвут ll с их backtrackingом по скорости как тузик грелку.
Но по прочтении выяснилось и кое-что полезное:
- antlr умеет генерить код не только для java, но и для более приличных языков
- antlr умеет также автоматически строить в процессе разбора AST дерево, чего мне в bison всегда не хватало
- и даже более того - вместе с построением AST умеет также строить к нему tree walker
- и даже tree pattern matcher ! правда во всей книге дано ровно полтора примера как с его помощью можно делать tree rewriting
Вторая часть самая содержательная - в ней объясняется как строить 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 файлов
MachOPIC - для 32битных PPC файлов
machiPIC - для 32битных i386 файлов