ptrace () je v informatice speciální systémové volání používané unixovými operačními systémy. Systémové volání ptrace umožňuje jednomu procesu ovládat druhý proces, takže je ho možné sledovat a měnit jeho vnitřní stavy. Volání ptrace je využíváno debuggery a dalšími nástroji zabývajícími se analýzou zdrojového kódu, většinou při vývoji software.
Využití Ptrace je využíváno debuggery (jako jsou gdb a dbx), trasovacími nástroji jako strace a ltrace a nástroji code coverage (zajímají se hloubkou testování kódu). Ptrace je také využíváno jako specializovaný program pro opravu běžících programů, aby se předešlo neočekávaným chybám či překonání bezpečnostních prvků.
Připojením se k jinému procesu využívajícím ptrace volání, má nástroj značnou kontrolu nad operacemi svého cíle. To zahrnuje ovládání jeho souborových deskriptorů, paměti a registrů procesoru. Může využít krokování kódu (angl. single-step) při průchodu cílovým kódem, či sledovat systémové volání a jejich výsledky. Dále je možné ovládat signály obsluhy procesoru a jak přijímat tak odesílat signály jeho jménem. Schopnost psát do cílové paměti umožňuje nejen měnit uložená data, ale také aplikaci vlastního segmentu kódu. To umožňuje, aby kontroler vložil "zarážky" (angl. Breakpoints ) a opravil běžící kód cíle.For example retty uses ptrace to alter another process' file descriptors, and to inject executable code into the target's text segment
Jelikož možnost kontrolovat a měnit nějaký proces je velice mocný nástroj, může být ptrace využíváno pouze na procesy, kterým má vlastník povoleno posílat signály (typicky jeho vlastním procesům) ; superuživatelským účtem je možné využívat ptrace téměř na všechny procesy (s výjimkou init). V systémech Linux představující další možnosti zabezpečení, je schopnost ptrace dále omezena možnostmi CAP_SYS_PTRACE."ptrace(2) manpage", Linux manual section 2 V FreeBSD, je limitováno pomocí FreeBSD jail a Mandatory access control politikou.
Omezení Komunikace mezi kontrolerem a cílem je prováděna pomocí opakovaného volání ptrace, posíláním malých pevných bloků paměti mezi sebou, což vyžaduje dvě změny kontextu (přepínání řízení mezi procesy) během každého volání. To je velice neefektivní při přístupu k velkému množství paměti cíle, protože tímto způsobem lze brát pouze bloky velikosti word (pro každý word nové volání ptrace).The Design and Implementation of the 4.4 BSD Operating System, Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John Quarterman, Addison-Wesley, April 1996, Z tohoto důvodu osmá edice Unixu představuje procfs, které umožňuje povoleným procesům přímý přístup do paměti jiného procesu. Tato funkce byla implementována do verze 4.4BSD. Následně bylo užití /proc pro debuggery převzato do systémů Solaris, BSD, AIX a z větší části zkopírováno Linuxem.The Design and Implementation of the 4.4 BSD Operating System, Marshall Kirk McKusick, Keith Bostic, Michael J. Karels, John Quarterman, Addison-Wesley, April 1996, V systému Solaris je ptrace zcela odstraněno jako systémové volání a je uzavřeno do volání knihovny, která předá volání do ptrace podle pravidel procfs."ptrace() Request Values", Solaris Transition Guide, Sun Microsystems, 2000 Naopak FreeBSD rozšířilo ptrace a odstranilo tak výše zmíněné problémy a označilo procf za zastaralé, kvůli jeho návrhovým problémům.
Ptrace pouze poskytuje základní rozhraní nezbytné pro podporu debuggerů nebo podobných nástrojů. Programy (programátoři) jej využívající musí mít znalosti o daném operačním systému a jeho architektuře jako je stack layout, application binary interface, name mangling, the format of any debug data a odpovídají za porozumění a rozložení si strojového kódu. Porozumění systémovému volání vyžaduje znalost kontroleru mapovací tabulky systémového volání a pochopení příkazů (parametrů) každého volání. Dále programy vkládající spustitelný kód do cílového procesu nebo (jako gdb) umožňují uživateli zadávat příkazy spouštěné v rámci cíle, musí tento kód samy generovat a nahrávat obecně bez použití programového zavaděče.
Podpora Ptrace bylo poprvé implementováno do Unixu verze 7 a obsahují jej i dvě odnože Unixu SVR4 a BSD. Jako systémové volání je ptrace dostupné i v IRIX,"ptrace(2)" , IRIX 6.5 manual, section 2, SGI techpubs library AIX,"ptrace,ptracex,ptrace64 subroutine", IBM AIX Technical Reference: Base Operating System and Extensions, Volume 1 NetBSD,ptrace(2), netbsd manual, section 2 FreeBSD,, FreeBSD manual, section 2 OpenBSD"ptrace(2)" , OpenBSD manual, section 2 a Linuxu."ptrace(2) manpage", Linux manual section 2 Na systému Solaris je dostupné jako volání knihovny, vestavěné v kernel procfs souborovém systému. Sun k tomu poznamenává, že ptrace je na systému Solaris kvůli zpětné kompatibilitě a doporučuje, aby nové implementace využívaly bohatšího rozhraní procfs, které jej nahrazuje. UnixWare představuje také ptraceptrace(2), SCO UnixWare 7 manual, section 2, ale podobně jako Sun, SCO doporučuje vývojářům místo něho použít základní vlastnosti procfs."System call compatibility notes" , UnixWare 7 Documentation HP-UX podporuje ptrace do verze 11i v3 (bylo zavrženo ve prospěch ttrace)."ptrace() System Call (Obsolete)", HP-UX 11i Version 3 Release Notes: HP 9000 and HP Integrity Servers, Hewlett Packard, February 2007
Apple Mac OS X také realizuje ptrace jako systémové volání. Verze od Apple přidává speciální možnost PT_DENY_ATTACH. Když proces zavolá tuto volbu sám na sebe následné pokusy o ptrace procesu se nezdaří."ptrace(2) manual page", Apple Darwin/OS-X manual Apple touto funkcí omezuje použití debuggerů na programy, které pracují s DRM (správou digitálních práv) včetně iTunes."Owning the Fanboys : Hacking Mac OS X", Charlie Miller, Black Hat Briefings conference 2008 PT_DENY_ATTACH také zamezuje možnostem DTrace monitorovat proces."Apple 'breaks' Sun developer app", Matthew Broersma, Computerworld UK, 24 January 2008 Debuggery v OS X typicky využívají kombinaci ptrace a Mach VM.Chapter 9, Mac OS X internals: a systems approach, Amit Singh, , Addison Wesley, 2006 Ptrace (opět s PT_DENY_ATTACH) je pro vývojáře k dispozici u Apple iPhone."ptrace(2)", BSD System Calls Manual, Apple iPhone OS Reference Library
Reference
Externí odkazy Článek z Linux Gazette o ptrace Článek o ptrace v linux journal
Kategorie:Systémové volání Kategorie:Programování Kategorie:Unix