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.
- Rejestracja:prawie 14 lat
- Ostatnio:ponad 6 lat
- Postów:17

- Rejestracja:ponad 21 lat
- Ostatnio:14 minut
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łowemout
) zawierającą delegaty. Struktura powinna miećLayoutKind.Sequential
, a każde jej pole być odpowiednią delegatą z atrybutem[UnmanagedFunctionPointer]
.
- Rejestracja:prawie 14 lat
- Ostatnio:ponad 6 lat
- Postów:17
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.