Ładowanie dll-ki do wskażników funkcji (chyba)

Odpowiedz Nowy wątek
2013-02-05 21:15
0

Witam,
Problem mam następujący. Posiadam pewną dll-kę która nie wiem do końca jak jest skonstruowana. Jedynie co to dekompilije ją ollydbg i wiem ze eksportuje tylko jedną funkcje o nazwie typu load_lib(arg,arg). Z tego co wyczaiłem to tej funkcji w pierwszym parametrze trzeba przekazać wskaźnik a raczej tabele wskaźników do której ona później kolejno wpisuje adresy poszczególnych funkcji danej dll-ki. dll-ka najprawdopodobniej jest napisana w c++. Spotkał się ktoś z takim rozwiązaniem? Jak to załadować i jak korzystać z funkcji które siedzą wewnątrz dll-ki. Ja konkretnie potrzebuje jednej funkcji z tej dll-ki ale nie mam pojęcia jak się do niej dobrać. Dodam tylko że funkcja którą potrzebuję jest wykorzystywana w zewnętrznym programie wiec na pewno można, tylko jak?:)
Pozdrawiam.

edytowany 1x, ostatnio: stanley21, 2013-02-05 21:17
co to za aplikacja (dllka)? - Rev 2013-02-05 21:25

Pozostało 580 znaków

2013-02-05 22:50
1

Spotkał się ktoś z takim rozwiązaniem?
Spotkał, ale od strony właśnie DLL-ki a nie programu. Tak działają np. pluginy do winampa.

Jak to załadować i jak korzystać z funkcji które siedzą wewnątrz dll-ki.
w C#? podać strukturę (jako parametr ze słowem out) zawierającą delegaty. Struktura powinna mieć LayoutKind.Sequential, a każde jej pole być odpowiednią delegatą z atrybutem [UnmanagedFunctionPointer].

edytowany 1x, ostatnio: Azarien, 2013-02-06 00:22

Pozostało 580 znaków

2013-02-06 16:01
0

Dzięki Azarien, Z pewnością o to własnie chodzi. Aczkolwiek próbując rozwiązać to w ten sposób napotkałem na mały problem. W wspomnianej wcześniej funkcji przypisane jest około 100 adresów funkcji z danej biblioteki więc moja struktura powinna mieć dokładnie tyle delegatów do funkcji, oprócz tego na początku tej struktury powinien być jakiś integer i coś jeszcze ok 28 bajty "czegoś" i dopiero po tych 28 bajtach zaczyna przypisywać adresy funkcji, wszystko to wyczaiłem ollydbg z tym ze wyczajenie dokładnego rozkładu tej struktury zajęło by mi chyba wieki. Wiec zrobiłem to bardzo łopatologicznie i też działa powiem mniej więcej o co chodzi może się komuś w przyszłości przyda.

Jako że mnie interesuje tylko jedna konkretna funkcja max 2, w ollydbg znalazłem adres tej funkcji i jest to 0x03d09fab natomiast adres funkcji którą jako jedyna jest udostępniana jako external to 0x03e05da6 w ollydbg, różnica to 0x000FBDFB wiec:


       [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
        private delegate IntPtr delegatFunkcji(string path); 

        class LibWrapper
        {

            [DllImport("kernel32.dll")]
            public static extern IntPtr LoadLibrary(string dllToLoad);

            [DllImport("kernel32.dll")]
            public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);

            [DllImport("kernel32.dll")]
            public static extern bool FreeLibrary(IntPtr hModule);

        };

private void DoSomething()
{
 IntPtr pDll = LibWrapper.LoadLibrary(@"MyLibery.dll");

            if (pDll == IntPtr.Zero)
            {
                MessageBox.Show("Nie udało sie załadować biblioteki");
                return;
            }

            IntPtr pAddressOfFunctionToCall = LibWrapper.GetProcAddress(pDll, "NazwaFunkcjiUdostępnionejWBiblotece");

            if (pAddressOfFunctionToCall == IntPtr.Zero)
            {
                MessageBox.Show("Nie odnaleziono funkcji w bibliotece");
                return;
            }

            Int32 temp;
            temp = pAddressOfFunctionToCall.ToInt32();

            temp -= 0x000FBDFB;  // Odejmuje od adresu który moge pobrać wartość obliczoną i uzyskuje adres funkcji która mnie interesuje.
            pAddressOfFunctionToCall = (IntPtr)temp;

            delegatFunkcji Funkcja = (delegatFunkcji)Marshal.GetDelegateForFunctionPointer(
                                                                                        pAddressOfFunctionToCall,
                                                                                          typeof(delegatFunkcji));
            Funkcja("parametr");

            FreeLibrary("MyLibery.dll");

}

Wiem że strasznie sztywne ale działa i dla mnie wystarczy.

Pozdrawiam

edytowany 2x, ostatnio: stanley21, 2013-02-06 16:06
nie zapomnij w opcjach projektu ustawić platformy na x86, żeby nie było na AnyCpu. - Azarien 2013-02-06 16:34

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0