2010-01-26 21 views
8

Czy istnieje szybki sposób na podłączenie biblioteki DLL w języku C++? Wiem, że jest Microsoft's Detours rzecz, ale nie jest szybki prosty sposób po prostu podłączyć kilka funkcji dll?C++ podłączenie biblioteki DLL?

Na przykład chcę podłączyć funkcję void mytestfunction() w dll mytestdll.dll do hook_mytestfunction().

z góry dzięki!

+0

Czy próbujesz podłączyć bibliotekę DLL do własnego procesu lub biblioteki DLL, która została załadowana do innego procesu? –

+0

Dostępne strategie zahaczania wszystkich funkcji używanych w bibliotece dll są inne niż strategie służące do przechwytywania tylko jednej z używanych funkcji. Strategie poza procesem różnią się od strategii procesowych. Czy mógłbyś podać więcej szczegółów? –

+0

tak, próbuje podłączyć dll z innego procesu. jak coś podobnego na przykład byłoby jak podpięcie pliku opengl32.dll i przechwycenie glBegin..glEnd i etc ... – enuree

Odpowiedz

3

Objazdy to w szybki i prosty sposób!

+2

Jeśli nie chcesz pracować w 64-bitowym systemie, musisz zapłacić 10K $ opłaty licencyjnej :( – CharlesB

3

Zakładam, że podłączasz bibliotekę DLL, do której podpinałeś eksport tej biblioteki DLL?

W takim przypadku można wykonać prosty hak IAT (i potencjalnie EAT).

Zaletą haczyków IAT/EAT w objazdach jest fakt, że aplikacja i usunięcie haków jest w 100% bezpieczne (ponieważ nie zastępujesz kodu, zastępujesz wskaźnik, więc nie ma szans na wyścig warunek), a także łatwe wykonywanie haków na natywnych procesach x64 (których biblioteka Detours Microsoftu nie może zrobić, jeśli nie rozwiążesz 10 kawałków dla wydania Profesora).

Tak, istnieją zewnętrzne biblioteki objazdowe, które mają wsparcie dla x64 i dbają o większość warunków wyścigowych i co nie, ale niektóre z nich są naprawdę drogie, a inne są po prostu uciążliwe.

Haki IAT/EAT są szybkie i łatwe, a kod przykładowy do ich wykonania dostępny jest w książce "Windows przez C/C++" (wraz z mnóstwem miejsc w interwebs).

Jest to dość ogólna odpowiedź, którą znam, ale trudno jest przejść do bardziej szczegółowych informacji bez dodatkowych informacji na temat tego, co dokładnie próbujesz zrobić.

4

Prawdopodobnie najprostszym sposobem jest umieszczenie własnego katalogu DLL o tej samej nazwie w katalogu EXE i umieszczenie kopii zahaczonego pliku DLL w tym samym katalogu z nową nazwą. Następnie, w IAT Twojej biblioteki DLL opakowania, przekieruj każde nieprzerwane połączenie do owiniętej biblioteki DLL (przekazywanie eksportu) i implementuj pozostałe.

Aby przekierować funkcje, należy umieścić następujący wiersz w pliku .DEF: Foo=wrapped_mytestdll.Foo, gdzie Foo to nazwa (zniekształcona) funkcja i wrapped_mytestdll to nowa nazwa skopiowanej biblioteki DLL.

W rezultacie, uszkodzony plik EXE ładuje otakowującą bibliotekę DLL, a następnie zapakowaną bibliotekę DLL. Funkcje w bibliotece DLL opakowania mają pierwszeństwo przed owiniętą biblioteką DLL. Jedyne wywołania przechwytywane są wywoływane przez owiniętą bibliotekę DLL, ponieważ te nie przechodzą przez IAT.

(Od tamtej pory znalazłem a link to a tool w celu wygenerowania podstawowego pliku ".DEF", ale nie przetestowałem go samodzielnie. Używaj na własne ryzyko.)

2

Po prostu wywołaj GetProcAddress (hDll, "mytestfunction") i napisz tam jmp hook_mytestfunction, a następnie umieść instrukcje na początku funkcji testowej w hook_mytestfunction.

To naprawdę szybkie i łatwe, oczywiście, jeśli je rozumiesz. Jeśli nie, użyj MS Detours lub innej biblioteki. Zwykle możesz to zrobić bez zrozumienia, jak to działa.

Powiązane problemy