Для начала попробуй понять что вообще делает система.
Попробуй выделить спецификации для какой-то части подсистемы.
Когда знаешь для чего это писалось, становится легче понимать как это было реализовано.
Затем, имея представление зачем это все писалось,
можно попробовать написать юнит-тесты и попробовать потестировать
некий кусок системы по черному ящику. Это добавит понимания
и позволит порыться в потрохах системы с помощью дебаггера.
По ходу можно попытаться нарисовать парочку "sequence diagram",
если уж есть желание попользоваться UML
"Тулы" — это не принципиально и вопрос предпочтений и доступности.
Я лично в последнее время активно пользуюсь SNiFF и Together
Иногда бывает полезным
Graphviz для рисования графов...