Da muss ich gleich jemanden enttäuschen - C++ ist nicht allmächtig

D.h Dein Problem ist OS abhängig und Du wirst sehr wahrscheinlich auf die vom OS zur Verfügung gestellten Funktionen zurückgreifen müssen.
Unter Windows z.B wäre die einfachste Lösung (solange das Programm sich auf dem "normalen" Wege verbindet) in die Initialisierung des Sockets einzumischen.
Ich würde das z.B von einer DLL erledigen lassen. Diese muss
1) beim laden den Prozessnamen überprüfen (z.B mit
GetModuleFileName )
2) aus einer Configurationsdatei die "verbotenen" Namen auslesen
und falls der Prozessname darin vorkommt, einfach
"WSAStartup" patchen (den Anfang des funktion mit z.B MOV EAX,1; RETN 8 überscheiben). Das klappt bei z.B mit Thunderbird (startet, kann sich aber nicht verbinden) wie auch IE (kann sich auch nicht verbinden) und ein paar kleineren Programmen. Man kann auch "socket" funktion unbrauchbar machen (den Anfang mit
MOV EAX,INVALID_SOCKET; RETN 0xC übrschfreiben) wobei das imho aber mehr programmspezifische Probleme machen könnte.
Die DLL operiert hierbei als "Controller" (so ähnlich haben die PFWs in der grauen Vorzeit funktioniert). Der Vorteil einer DLL ist, dass sie im Speicher des Prozesses läuft und man keine großartigen Verrenkungen machen muss (weder Hooks noch andere Systemeingriffe) um diese Überwachung zu bewerkstelligen und auch der Patch an sich ist viel einfacher.
3)bleibt dafür zu sorgen, dass die DLL bei jedem Programm geladen wird.
z.b durch einen künstlichen Hook oder Eintrag in
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Appinit_Dlls (bzw. für Vista
http://blogs.msdn.com/nickkramer/archive/2006/04/18/577962.aspx )