Ogólna instrumentacja binarna, która pozwala na dodawanie nowego kodu w każdym miejscu pliku binarnego, jest znacznie trudniejsza do poprawnej implementacji niż proste techniki modyfikacji binarnej, które przedstawiłeś w rozdziale 7. Pamiętaj, że nie możesz po prostu wstawić nowego kodu do istniejącej sekcji kodu binarnego, ponieważ nowy kod przesunie istniejący kod na inne adresy, tym samym przerywając odwołania do tego kodu. Zlokalizowanie i załatanie wszystkich istniejących odwołań po przeniesieniu kodu jest praktycznie niemożliwe, ponieważ pliki binarne nie zawierają żadnych informacji wskazujących, gdzie znajdują się te odwołania, i nie ma sposobu na wiarygodne odróżnienie adresów, do których się odwołują, od stałych, które wyglądają jak adresy, ale nimi nie są. Na szczęście istnieją ogólne platformy instrumentacji binarnej, których możesz użyć, aby poradzić sobie ze wszystkimi trudnościami implementacji, i oferują one stosunkowo łatwe w użyciu interfejsy API, za pomocą których możesz implementować narzędzia instrumentacji binarnej. Te interfejsy API zazwyczaj umożliwiają instalację wywołań zwrotnych do kodu instrumentacji w wybranych punktach instrumentacji. W dalszej części tego rozdziału zobaczysz dwa praktyczne przykłady instrumentacji binarnej z wykorzystaniem platformy Pin, popularnej platformy instrumentacji binarnej. Za pomocą platformy Pin zaimplementujesz profiler, który rejestruje statystyki dotyczące wykonania pliku binarnego, wspomagając optymalizację. Za pomocą platformy Pin zaimplementujesz również automatyczny depaker, który pomaga w deobfuskacji spakowanych plików binarnych. Można wyróżnić dwie klasy platform instrumentacji binarnej: statyczną i dynamiczną. Najpierw omówimy różnice między tymi dwiema klasami, a następnie przyjrzymy się ich działaniu na niskim poziomie.









