Habe eine Idee wie dies funktionieren könnte...
1:
Dll in externe App injizieren und den Speicheraddressen beginn merken (dllAddressExtern)
2: Nun die
DLL in den eigenen Prozess laden und ebenfalls die Startaddresse speichern (dllAddressIntern)
3: Nun mit GetProcAddress die Addresse der Funktion innerhalb der in den eigenen Prozess geladenen
DLL finden und speichern.
4: Die Adresse von GetProcAddress abzüglich die Startaddresse ergibt unseren Offset.
5: Diesen Offset zu dllAddressExtern addieren und schon haben wir die Addresse der Funktion in der Zielapp.
Ich habe nun versucht einer internen Funktion den Pointer von eben dieser Adresse zu geben und aufzurufen.
Aber im nachhinein ist mir aufgefallen, das dies ja nur für den eigenen Speicherbereich klappt.
Leider weiss ich also nicht wie ich nun die Externe funktion aufrufen kann...
Habe nun folgenden Code zusammen:
Delphi-Quellcode:
TestMyApp := GetProcAddress(th,pchar('
TestMyApp'));
writeln;
write('
Dll Adresse extern: ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
write(integer(pdllname));
dllAddrExtern := integer(pdllname);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
writeln;
dllAddressIntern := LoadLibrary(pchar(ExtractFilePath(paramstr(0)) + '
InjectedDll.dll'));
//Interne DLL Adresse holen
dllOffset := integer(GetProcAddress(dllAddressIntern,'
TestMyApp')) - dllAddressIntern;
write('
Dll Adresse intern: ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
write(inttostr(dllAddressIntern));
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
writeln;
write('
Dll Adresse Offset: ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
write(inttostr(dllOffset));
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
writeln;
TestMyApp := Pointer(dllAddrExtern + dllOffset);
write('
Dll Funktions Addresse: ');
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
write(inttostr(dllAddrExtern + dllOffset));
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
writeln;
writeln('
Versuche nun die Funktion auszuführen!');
readln(myInput);
readln(myInput);
TestMyApp;