Een proxy DLL lijkt me geen goede methode om een virtual filesystem te maken. Windows doet hoogstwaarschijnlijk veel meer achter de schermen met file I/O dus alleen functies aanpassen zal niet gauw werken. Een klein bugje in je hook DLL zou bovendien kunnen leiden tot bijvoorbeeld het verkeerd opslaan van bestanden en andere vervelende dingen.
Je kunt wel een shell namespace extension maken, net als sommige FTP programma's doen om een FTP site in explorer te integreren, maar niet alle programma's houden rekening met zulke extensions (omdat het fysiek gezien niet echt deel uitmaakt van het filesystem), maar in ieder geval is een correcte manier.
Ik weet niet wat je met de winsock DLL wil doen maar als je send en recv enzo wilt hooken om te debuggen dan kan dat wel, ook zonder proxy DLL.
Hier staat nog wel een interessant artikeltje over hook methodes. Op
mijn eigen site staat ook een tooltje (wshook) die winsock dataverkeer laat zien, al hookt die de DLL niet maar het programma zelf (als debugger). De code is wel wat goor maar het was maar voor het debuggen van m'n eigen programma's.
curry684 schreef op 20 December 2002 @ 18:18:
[...]Wat je wil is simpelweg een app die de exported functies van een DLL uitzoekt en ze 'stubt' in een C file, oftewel een DLL bouwt die enkel en alleen de originele DLL laadt en alle exported functies in een lege functie linea recta doorjast in het origineel. Idee is dat je dan zelf functionele code kunt doen (zoals loggen) in de stub-call.
Zoiets kun je inderdaad doen, je hebt dan een import library van de target DLL nodig (die kun je zelf bakken door de export list te dumpen (dumpbin /exports x.dll), de functies daaruit in een .def zetten (inclusief ordinals, veel progs importeren winsock functies by ordinal) en daar weer een lib van maken (lib /machine:ix86 /def:x.def).
Daarna kan je een DLL maken die deze lib importeert zodat ie de orginele functies kan aanroepen en bovendien alle functies ook zelf exporteert.
Hoewel het artikel van internals.com zegt dat je voor een proxy DLL voor alle functies een stub moet schrijven en bovendien de parameters moet weten is dat niet helemaal waar.
Je kunt namelijk voor je eigen DLL ook dezelfde .def gebruiken maar dan als library bijvoorbeeld ws2_33 neerzetten. Als je die voor je eigen DLL gebruikt en je net gefabriceerde lib in je link lijst zet kun je de DLL zonder moeite compileren en is het gewoon een stub die niks doet (alle exports verwijzen vrijwel direct naar de imports, elke export is een jmp [import]). Het is dus absoluut geen moeite om zoiets te maken, je moet nu alleen in je programma ws2_32 naar ws2_33 hernoemen.
Hier heb je natuurlijk nog niks aan, want je hookt niks. Je kunt een functie hooken door gewoon een implementatie in je DLL source code te zetten (die tot nu toe leeg was op winmain na), die iets doet en vervolgens het orgineel aanroept. Er zijn hier alleen twee (kleine) problemen:
1) De import lib die je gemaakt hebt werkt wel om een lege stub te maken (compiler kan het dan niet schelen wat de parameters van die functies zijn), dat wordt anders als je een functie wilt gebruiken. Dan moet je in de .def die je voor je importlib gemaakt hebt direct achter functienaam die je gaat hooken @x zetten, waarbij x het totaal aantal bytes aan parameters is (bij stdcall dan natuurlijk)). Voor socket zou er dan bijvoorbeeld dit staan:
socket@12 @23
(de laatste @23 is de ordinal waarde, die stond er als het goed is al)
Nu kun je de functie ook echt aanroepen in je programma zonder dat er linker errors komen.
2) Je geexporteerde functie en geimporteerde functie heten hetzelfde, dus socket aanroepen in je eigen socket stub wordt een oneindig recursieve functie. Ik heb nog geen methode gevonden om deze in de source code te kunnen onderscheiden, misschien kan het wel.. In ieder geval heb ik wel een workaround gevonden. Noem je eigen stub niet socket maar bijvoorbeeld socketSTUB ofzo, en pas je eigen .def (ws2_33.def) aan zodat de socket functie daar ook socketSTUB heet. Compile het geheel, en vervang daarna met hiew of een andere hex-editor 'STUB' in 4 0-bytes. Aangezien de export namen gewoon null terminated strings zijn kan dit geen kwaad, je hebt alleen wat onnodige bytes maar daar zal je niet wakker van liggen

.
Als je wil kan ik het wel verder uitleggen of een voorbeeldje geven, heb nu even geen tijd..