Antes de comenzar el proyecto se hizo una pequeña investigación para averiguar el estado del arte en lo que es tratamiento de las estructuras ELF y/o interposición dinámica de código. Esto sirvió para enriquecer nuestros conocimientos sobre interposición de código y ELF, y conocer otras opciones y soluciones a parte de DITools.
Al parecer este campo no es muy comercial y hay muy poca oferta de "software" que sirva de base para crear programas de instrumentación de código, y mucho menos "software" libre.
El ejemplo "comercial" más notable es Dyninst de la Universidad de Maryland. Dyninst es un "software" que ofrece un API que facilita la creación de un "software" de instrumentación dinámica.
De Dyninst derivan la mayoría de productos de instrumentación dinámica de código:
DPCL
Open SpeedShop™ for Linux™
Dynamic Kappa-Pi
Dynaprof
Metasim
OCM: OMIS Compliant Monitoring system
Stride - Stream Identification During Execution
TAU
ToolGear
Tracetool
Lo malo es que a pesar de ser un producto "open source" (está disponible su código fuente) se entrega bajo una licencia de "software" privativa que sólo permite su uso gratuito en caso de investigación. En otros casos se ha de pedir permiso de uso.
Esto hizo que automáticamente se dejase de profundizar en él. Inspirarse en él hubiera podido llevar a plagiar accidentalmente partes del mismo. Por ello se ha evitado a toda costa investigar más sobre Dyninst y así poder entregar un producto libre de las restricciones de Dyninst (tanto a nivel de copyright como de posibles patentes).
Si la oferta en el mundo comercial es reducida (se reduce casi a una opción), en el mundo del "software" libre no encontramos ninguna herramienta de instrumentación. El "software" libre ha sido desarrollado en su mayor parte por voluntarios que generalmente no tienen en casa un supercomputador: no hay apenas "software" relacionado de instrumentación de código.
El primer producto relacionado que encontramos no es exactamente un programa de instrumentación dinámica, pero dispone de todos los mecanismos y técnicas para poder implementar uno: GNU Debugger. El depurador de GNU está íntimamente ligado a como el sistema operativo organiza los objetos de una aplicación. Por ello en más de una ocasión hemos recurrido a su código fuente para poder ver como se resuelve un problema u otro.
La segunda oferta que he encontrado de la cual sacar ideas o información es libelf. Es una librería que permite manipular ficheros ELF de casi cualquier arquitectura. No permite manipular estructuras ELF en tiempo de ejecución. Se puede encontrar información sobre el mismo en la página oficial de libelf.
Lo que mas se ajusta a nuestra búsqueda es ELFsh. Es un programa específico para manipular estructuras ELF en tiempo de ejecución. Puede usarse perfectamente para crear "software" de instrumentación dinámica, aunque no está pensado específicamente para ello. En realidad está orientado a depurar "software" y a experimentar con las aplicaciones. Aporta un API bastante potente y con ella es posible llegar a crear un programa de interposición dinámica de código.
También se encontró información y fragmentos de código en los "ezines" de "hackers". Las técnicas de "PLT poisoning" (hablaremos sobre ellas más adelante) se usan bastante para realizar ingeniería inversa, saltar protecciones y para desarrollar virus.