Czasami jest tak, że nowe narzędzie pojawia się dokładnie wtedy, gdy jest potrzebne. Tak było z JavaSnoop. Miałem okazję przetestowania narzędzia w praktyce i odczucia mam nieco mieszane.
Narzędzie: JavaSnoop
Moje mieszane odczucia biorą się chyba głównie z tego, że narzędzie zadziałało nie do końca tak, jak się tego spodziewałem. Być może po prostu trafiłem na błąd, w końcu narzędzie jest bardzo młode. Ogólnie jednak jego koncepcja bardzo mi się podoba.
Nie będę opisywał wszystkich funkcji tego narzędzia, skupię się na tym, do czego potrzebowałem go użyć. JavaSnoop pozwala między innymi na ustawienie tak zwanych function hooks. Można wybrać interesującą nas klasę i jej metodę i w przypadku jej wywołania coś się stanie. Tym czymś może być:
- wypisanie parametrów wywołania funkcji oraz, opcjonalnie, stosu wywołań,
- uruchomienie skryptu, czyli fragmentu kodu Java,
- modyfikację parametrów wejściowych,
- modyfikację wartości zwracanej,
- zatrzymanie programu,
Do moich potrzeb najlepiej pasowała modyfikacja parametrów zwracanych przez funkcję, ale... nie działała. Co prawda wywołanie funkcji było zauważane, pojawiał się dialog pozwalający na modyfikację zwracanej wartości, ale program dalej wykonywał się tak, jakby tej modyfikacji nie było. Sporo czasu straciłem próbując dojść do tego, w którym miejscu popełniam błąd. Bezskutecznie.
Gdy już byłem bliski poddania się, postanowiłem spróbować problem rozwiązać w nieco inny sposób. W zasadzie tym, czego potrzebowałem, była modyfikacja wartości zwracanej przez jedną z funkcji. Chciałem, by funkcja ta zawsze zwracała jedną, konkretną wartość. Postanowiłem więc skorzystać z innej dostępnej opcji, czyli uruchomienia skryptu i... zadziałało. Skrypt był bardzo skomplikowany, wyglądał dokładnie tak:
return true;
Funkcją, której mi w tym narzędziu brakuje (a przynajmniej ja jej nie zauważyłem) jest możliwość uruchomienia badanego programu w stanie zatrzymanym. Obecnie wygląda to tak, że uruchamia się badany program i wykonuje się on równolegle ze "startem środowiska" JavaSnoop. W tym czasie badany program wykonuje się "swobodnie", co nie zawsze jest pożądane, nie można mieć wpływu na inicjację badanego programu, a czasem byłoby to przydatne. Na przykład po to, by przechwycić funkcje, które służą do odczytu szyfrowanych/obfuskowanych plików konfiguracyjnych.
Narzędzie JavaSnoop może przydać się każdemu, kto będzie musiał zmierzyć się z analizą programu napisanego w języku Java (gruby klient, applet). Warto śledzić jego rozwój. Swoją drogą z przyjemnością powitałbym analogiczne narzędzie przeznaczone dla platformy .NET.