Die Programmieren-Rubrik steht diesmal im Zeichen von Web-Techniken: eine XML-Datenbank in Java, zwei XML- Parser für Python und ein Perl-CGI-Skript. Sie erfahren auch, wie man Bibliotheksfunktionen austauscht.
Manchmal ist auch “Programmieren” drin, wenn “Know-how” draufsteht: Der Artikel über Transconnect erklärt, wie man bei einem dynamisch gelinkten Binary einzelne Bibliotheksfunktionen austauscht. Der Linker bindet erst alle in der Umgebungsvariablen »LD_PRELOAD« genannten Libraries an das Programm, danach folgen die ursprünglich gelinkten Bibliotheken.
Bei der Suche nach Funktionen findet der Linker die Implementierung in der eingefügten Library. Diese Technik lässt sich für viele Zwecke nutzen; Transconnect ändert mit ihr die »connect()«-Funktion der C-Bibliothek. Mit der neuen Routine nutzen Clients einen HTTP-Proxy und dessen Connect-Methode, ohne es selbst zu bemerken.
Die Quelldatei »tconn.c« enthält eine Ersatzfunktion mit dem gleichen Namen und den gleichen Parametern wie das originale »connect()«:
int connect (int sockfd, const struct sockaddr *serv_addr, socklen_t addrlen)
Das Quell-File kann die üblichen Header einbinden und dadurch gewährleisten, dass die Signatur der Funktion tatsächlich stimmt. Der Compiler muss mit den passenden Optionen aufgerufen werden, um aus »tconn.c« die Shared Library »tconn.so« zu erzeugen:
gcc -shared -ldl -o tconn.so tconn.c
Aus der zusätzlichen Bibliothek »dl« holt Transconnect die Funktion »dlsym()«.
Original und Fälschung
»dlsym()« löst ein Problem, mit dem Transconnect sonst zu kämpfen hätte: »tconn.so« ersetzt die »connect()«-Funktion, braucht das Original aber selbst, um sich mit dem Proxy zu verbinden. Dazu nutzt es den Funktionszeiger
static int (*func) ();
den es mit Hilfe von »dlsym()« auf die Adresse der Originalfunktion biegt. Dlsym durchsucht dazu alle gelinkten Bibliotheken nach der nächsten »connect()«-Funktion:
func = (int (*)()) dlsym ( RTLD_NEXT, "connect");
Mit »dlopen()« kann man sogar explizit festlegen, in welcher Library »dlsym()« die Implementierung der »connect()«-Funktion suchen soll:
static void *handle; handle = dlopen ( "/usr/lib/libc.so", RTLD_LAZY); func = (int (*)()) dlsym ( handle, "connect");
Der Aufruf »func(…)« springt nun zu exakt jenem Code, der normalerweise für »connect(…)« zuständig ist. Transconnect baut damit die Verbindung zum Proxy auf und schickt ihm den HTTP-Connect-Header mit den Daten des gewünschten Servers. Der Proxy verbindet dann Client und Server.
Programmierer-Software |
|
Versionsnummern der aktuellen stabilen Releases am 12.03. 2002 und Änderungen gegenüber dem Vormonat. Skriptsprachen Guile 1.4 NetRexx 2.02 Object Rexx 2.2 Perl 5.6.1 PHP 4.1.2 Python 2.2 Ruby 1.6.7 Tcl 8.3.4 Java Blackdown 1.3.1-02a IBM Java2 SDK 1.3-1.0 Jikes 1.15 Kaffee 1.0.6 Sun SDK 1.4.0 Compiler Binutils 2.11.2 Clisp 2.28 Free Pascal 1.0.4 GCC 3.0.4 GForth 0.5.0 GNU Pascal 2.0 Libraries FLTK 1.0.11 glibc 2.2.5 glut 3.7 GTK+ 2.0 LessTif 0.93.18 libpng 1.2.1 libsdl 1.2.3 libstdc++ 3.0.97 libxml 2.4.17 Mesa 4.0.1 OpenSSL 0.9.6c Qt 3.0.2 wxWindows 2.2.9 zlib 1.1.4 Debugger Checker 0.9.4 Code Medic 1.1.3 DDD 3.3 GDB 5.1.1 Insight 5.1.1 Build-Tools Autoconf 2.53 Automake 1.6 Compilercache 1.0.10 CVS 1.11.1p1 Libtool 1.4.2 GNU Make 3.79.1 SWIG 1.3.11 IDEs Anjuta 0.1.9 Code Crusader 3.0.3 C-Forge 2.0 CodeWarrior 6.0 Emacs 21.1 KDevelop 2.0.2 Kylix 2.0 Motor 3.2.0 SNiFF+ 4.0.2 Source-Navigator 5.0 VIM 6.0 XEmacs 21.1.14 XWPE 1.5.26a |





