Показаны сообщения с ярлыком я.доволен. Показать все сообщения
Показаны сообщения с ярлыком я.доволен. Показать все сообщения

воскресенье, 12 ноября 2023 г.

my solutions for couple CSES tasks

CSES has two very similar by description tasks but with completely different solutions: "Critical Cities" (218 accepted solutions at time when I writing this) and "Visiting Cities" (381 accepted solutions)

Critical Cities

We are given an directed unweighted graph and seems that we need to find it`s dominators for example using Lengauer-Tarjan algo (with complexity O((V+E)log(V+E))
Then we could check each vertex in this dominators tree to see if it leads to target node, so overall complexity is O(V * (V+E)log(V+E))
 
This looks not very impressive IMHO. Lets try something completely different (c) Monty Python's Flying Circus. For example we could run wave (also known as Lee algorithm) from source to target and get some path with complexity O(V+E). Note that in worst case this path can contain all vertices. Lets mark all vertices in this path
Next we could continue to run waves but at this time ignoring edges from marked nodes and see what marked vertices are still reachable. For example on some step k we run wave from Vs and reached vertices Vi and Vj. We can conclude that all vertices in early found path between Vs and Vj are NOT critical cities. So we can repeat next step starting with Vj
This process can be repeated in worst case V times so overall complexity is O(V*(V+E))
 
My solution is here

 

Visiting Cities

At this time we are given an directed weighted graph and seems that simplest solution is to find all K-th shortest paths (for example with Yen algo) and make union of their vertices. Because I'm very lazy I decided to reuse some ready and presumably well-tested implementation of this algo. You can read about fabulous results here
 

After that I plunged into long thoughts until I decided to count how many paths of minimal length go through each vertex - actually we could run Dijkstra in both directions: from source to target and from target to source, counting number of paths with minimal length. And then we could select from this path vertices where product of direct counts with reverse equal to direct count on target (or reverse count on source) - it`s pretty obvious that you can`t avoid such vertices in any shortest path. Complexity of this solution is two times from Dijkstra algo (depending from implementation O(V^2) or O(V * log(V) + E * log(V)) using some kind of heap) + in worst case V checks for each vertices in first found shortest path

My solution is here

четверг, 9 мая 2013 г.

how Rootkit.Avatar looks like in wincheck logs

Many thanks to Anton Cherepanov for wincheck log from infected machine
Detailed description of avatar can be found here

1) FS Change notifiers
FS Change notifiers: 3 (actual 3)
DriverObj 8B6A31B8 addr 8362CBDA \SystemRoot\system32\drivers\fltmgr.sys
DriverObj 8BEC91B8 addr 8C477D40 UNKNOWN
DriverObj 8B6A31B8 addr 8362CBDA \SystemRoot\system32\drivers\fltmgr.sys


2) Pnp Notifiers
Pnp Notifiers: total 19, readed 19
...
 Pnp[6] CategoryHardwareProfileChange DEVINTERFACE_MT_COMPOSITE addr 92FE793A \SystemRoot\system32\DRIVERS\CompositeBus.sys
 Pnp[7] CategoryHardwareProfileChange DEVINTERFACE_DISK addr 8B618180 UNKNOWN
 Pnp[8] CategoryHardwareProfileChange DEVINTERFACE_HIDDEN_VOLUME addr 8356D3E0 \SystemRoot\system32\DRIVERS\volmgr.sys
 

3) numerous driver patches

четверг, 30 августа 2012 г.

Inside Windows Debugging

Finished reading of this excellent book. A very good introduction for using windbg/appverifier/xperf. Although author don`t know about commands .pagein & !pool this books still contains lots of usefull debugging tricks:
  • for wow64 debugging
  • for .net debugging (like setting COMPLUS_HeapVerify & COMPLUS_GCStress environment vars)
  • ntdll!g_dwLastErrorToBreakOn 
  • using xperf to capture stack traces (sadly works only since windows 7)
  • and many others !

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

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 - не ловит практически никто. продолжение ждите через месяц, как обычно

четверг, 15 сентября 2011 г.

Неиллюзорно поражён

wincheck после добавления некоторых таблиц работает под w8 32bit без особых обточек напильником военного образца ! Хотя там поменялось весьма много чего и скомпилена w8 вся если зрение меня не обманывает с помощью vs2010
Не работают следующие вещи (в синяк при этом не падает, бгг):
  • проверка ObTypes (наверняка потому что изменилась структура _OBJECT_TYPE точно такой же как w7)
  • достаются кривые ClassGuid для PnP нотификаторов - формат точно такой же как в w7
  • проверка TDI
  • NDIS весь
  • некоторые проверяльщики всяких структур в юзер-модных прогах. Наверняка форматы структур тоже поменялись
Осталось понять как заставить w8 64бита грузить неподписанные дрова например

Update: аааааааааааааааааааааааааааааааааааа !!!!!!!!! у них теперь BSOD вот с таким :( смайликом, бгг

Update2: нам тут не верят что подобный порт возможен за один день и требуют всяческих доказательств. Извольте:

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

хвастаюсь

а вот например начитавшись в выходные The Art of Concurrency решил давеча переделать несколько проверку процессов в wincheck. А именно - раскидать проверки каждого процесса (благо они практически параллельны по природе) на столько потоков, сколько на машине есть камней

Итоги такие:
+ 13 Kb исходников (главным образом самодельный диспетчер заданий). Cинхронизация - пришлось добавить ровно 3 critical_section
.exe прибавил 8Kb в размере (64битный 12Kb)
На 64битной машине с двумя камнями и кучей свободной памяти (чтобы cache managerу хватило места) ускорение практически линейно: на одном камне работает 8.2 секунд, на двух 4.6 (средние числа по результатам 5 запусков)
На 32битной машине с адово жрущими память thunderbird & firefox и тоже двумя камнями уже значительно хуже - 16 секунд против 10.8

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

А вот например результаты работы на 8 камнях corei7 под w7 64bit:
1 поток - 48.2 секунды
2 - 22.9
3 - 17.2
4 - 14.9
5 - 12.9
6 - 11.8
7 - 11.3
8 - 11.0
Явно видно что более 5 одновременно работающих потоков уперлись в гонку за монопольный ресурс. И это наверняка не диск, потому что оно читает практически одни и те же файлы, которые должны себе спокойно лежать в cache manager

Update: результаты на 4х головом AMD Phenom X4 9850:
1 поток - 12.9 секунды
2 - 7.0
3 - 4.6
4 - 4.0

суббота, 23 июля 2011 г.

приобрел себе ноутбук

например
8 камней (с AVX, бгг), 6 гигов ram - должно хватить вобщем для скромной деятельности
Всю ночь теперь буду туда ставить всякое - wdk, vs2010, vbox, кучу windows images
wincheck на нем работает :-)

вторник, 28 июня 2011 г.

xbyak

заюзал сегодня кодогенератор с совершенно непроизносимым именем от епонцев
умеет 32 & 64 бита и полный фарш - mmx/sse/sse2/sse3/ssse3/sse4/avx - под linux/mingw/vs2008/vs2010
вроде даже работает, несмотря на FPU (partially)

Update: опыты показали также что ему неизвестны инструкции invept, invvpid, movbe и AMD-V Virtualization ISA Extension

воскресенье, 6 марта 2011 г.

раздел, защищенный gpt

купил сегодня от жадности 2 терабайтник wd
при подключении винда отказалась с ним чего-нть делать, мотивировав тем, что это "раздел, защищенный gpt".
После некоторых плясок с бубном нашелся работающий алгоритм подключения:
  • запускаем diskpart
  • в ее консоли пишем list disk чтобы узнать номер подключаемого диска
  • далее select disk N (смотрите не промахнитесь, бгг)
  • потом говорим clean
  • и последним заклинанием создаем partition: create partition primary
Алгоритм нагло потырен отсюда

воскресенье, 6 февраля 2011 г.

Why Programs Fail. A Guide to Systematic Debugging

отличная книжка например - в ней прекрасно все кроме попсового названия (честно говоря из-за названия я едва не решил ее не читать вовсе - думал что это очередной сборник малосвязанных паттернов типа Memory Dump Analysis Anthology)
Автор с переменным успехом скрупулезно описывает инструменты и техники, позволяющие максимально автоматизировать процесс нахождения источников ошибок. Правда многие инструменты либо маргинальны (т.е. далеко не mainstream), либо требуют кучи ресурсов, либо применимы только в ограниченном числе случаев.

Вот например в главе 13.6 описывается fuzzer для планировщика потоков под названием dejavu (Java only). Для отладки весьма небольшого куска кода (733 строки, если выкинуть все не относящееся к делу - 6 строчек) получается 3.8 миллиарда различающихся состояний. Хотя и утверждается что алгоритм O(log) и автоматически нашел комбинацию исполнения потоков, приводящую к ошибке, всего за 50 тестов - у меня есть обоснованные сомнения что это хорошо будет масштабироваться на более-менее реальных примерах. C другой стороны подобный scheduling fuzzer был бы ацки полезен для нахождения race conditions

Глава 7 содержит очень полезные техники для статического анализа кода, а также его фундаментальные ограничения.
Глава 10 посвящена разнообразным динамическим проверкам - от обычного assert до valgrind & purify

Перечислю инструменты, показавшиеся мне особенно полезными:
  • FAUMachine is a virtual machine specifically built for testing purposes. Among others, the FAUMachine allows you to control the entire virtual machine via scripts
  • codesurfer - анализатор исходников, умеющий показывать пути в графе codeflow, где переменная изменяется и где используется
  • ODB - т.н. omniscient debugger. Способен прокрутить сохраненное состояние отлаживаемой программы как вперед, так и назад, с любого момента
  • tarantula - для визуализации исполнившихся кусков кода, отличающихся при нормальном и содержащем дефект запусках