Dll Injection - Passiert was?
-
Hi
Rate mal was dir createtoolhelp32snapshot liefert !?
Lowbyte
-
Credits an Cypher von MMOWNED bzw , von seinem Code habe ich die Funktion für meine Library "geklaut"
http://blog.cypherjb.com/ :
//Written by Cypher, credit him FARPROC Process::customGetProcAddress(HMODULE module, const std::string& functionName) const { PIMAGE_DOS_HEADER pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(module); if(!pDosHeader || pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) throw std::runtime_error("Process::customGetProcAddress Error : DOS PE header is invalid."); PIMAGE_NT_HEADERS pNtHeader = reinterpret_cast<PIMAGE_NT_HEADERS>(reinterpret_cast<PCHAR>(module) + pDosHeader->e_lfanew); if(pNtHeader->Signature != IMAGE_NT_SIGNATURE) throw std::runtime_error("Process::customGetProcAddress Error : NT PE header is invalid."); PVOID pExportDirTemp = reinterpret_cast<PBYTE>(module) + pNtHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress; PIMAGE_EXPORT_DIRECTORY pExportDir = reinterpret_cast<PIMAGE_EXPORT_DIRECTORY>(pExportDirTemp); if(pExportDir->AddressOfNames == NULL) throw std::runtime_error("Process::customGetProcAddress Error : Symbol names missing entirely."); PDWORD pNamesRvas = reinterpret_cast<PDWORD>(reinterpret_cast<PBYTE>(module) + pExportDir->AddressOfNames); PWORD pNameOrdinals = reinterpret_cast<PWORD>(reinterpret_cast<PBYTE>(module) + pExportDir->AddressOfNameOrdinals); PDWORD pFunctionAddresses = reinterpret_cast<PDWORD>( reinterpret_cast<PBYTE>(module) + pExportDir->AddressOfFunctions); for (DWORD n = 0; n < pExportDir->NumberOfNames; n++) { PSTR CurrentName = reinterpret_cast<PSTR>(reinterpret_cast<PBYTE>(module) + pNamesRvas[n]); if(functionName == CurrentName) { WORD Ordinal = pNameOrdinals[n]; return reinterpret_cast<FARPROC>(reinterpret_cast<PBYTE>(module) + pFunctionAddresses[Ordinal]); } } return 0; }
-
lowbyte_ schrieb:
Hi
Rate mal was dir createtoolhelp32snapshot liefert !?
LowbyteMSDN schrieb:
it returns an open handle to the specified snapshot
Auf was willst du hinaus?
-
Hi
Meine wen du die Base addr. holen willst !Des von dir gewünschten Proc. !
Überleg dir mal was dan Microsoft random addr. bringen würde? nichts ! darum kannst du die Variante vergessen bei Vista,Win7 und zum teil WinXp.Lowbyte
-
Und zwar so: (Ich liebe Spoonfeeding
)
DWORD_PTR Process::getModuleBaseByName(std::wstring moduleName, bool isPath) const { //Convert given name to lowercase std::transform(moduleName.begin(), moduleName.end(), moduleName.begin(), towlower); //Get a snapshot of all modules SafeHandle modSnapshot(CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId_)); if(modSnapshot == INVALID_HANDLE_VALUE) throw WinException("Process::getModuleBaseByName()", "CreateToolhelp32Snapshot()", GetLastError()); //Iterate the complete module-list and break if module is found MODULEENTRY32W modEntry = { sizeof(modEntry) }; for(BOOL moreModuleEntries = Module32FirstW(modSnapshot, &modEntry); moreModuleEntries; moreModuleEntries = Module32NextW(modSnapshot, &modEntry)) { //Convert current modulename to lowercase std::wstring currentModulePath(modEntry.szExePath); std::transform(currentModulePath.begin(), currentModulePath.end(), currentModulePath.begin(), towlower); //Cut off all text before the module name if the user didn't supply a path if(!isPath) { std::wstring currentModuleName(currentModulePath.substr(currentModulePath.find_last_of(L"\\") + 1)); if(currentModuleName == moduleName) return reinterpret_cast<DWORD_PTR>(modEntry.modBaseAddr); } else { //Else just compare if(currentModulePath == moduleName) return reinterpret_cast<DWORD_PTR>(modEntry.modBaseAddr); } } //Nothing found return 0; }
-
Welche Variante? An wen war die erste Frage eigentlich gerichtet?
Meinst du, MODULEENTRY32::modBaseAddr hat nicht den gewünschten Wert?
MSDN schrieb:
modBaseAddr
The base address of the module in the context of the owning process.
-
Hi
das funtioniert bei xp, aber nicht bei vista-win7.
Lowbyte
-
Und was steht ab Vista in MODULEENTRY32::modBaseAddr ?
-
durch ASLR sind die DLL-Adressen nur von Start zu Start verschieden - während der Laufzeit sind sie in allen Prozessen gleich.
-
Wie bekommt man denn nun die Adresse einer Funktion in einem anderen Prozess ab Vista? Dabei soll der eigene Prozess aber nicht zwingend das Modul geladen haben müssen. Das ist nämlich bei "Cypher"s Code der Fall, da sonst gleich bei der ersten Zeile ein Crash auftritt:
PIMAGE_DOS_HEADER pDosHeader = reinterpret_cast<PIMAGE_DOS_HEADER>(module);
(Weil die Adresse "module" im eigenen Prozess nicht existiert, weil das Modul hier nicht geladen ist, sondern nur im Fremdprozess)
-
LoadLibrary()+GetProcAddress()
-
Was? Nein, du verstehst wohl nicht.
Nochmal: Wie bekommt man denn nun die Adresse einer Funktion in einem anderen Prozess ab Vista?
(Damit diese für CreateRemoteThread verwendet werden kann)
-
!!!: LoadLibrary()+GetProcAddress()
-
Soweit ich weiss, funktionier CreateRemoteThread wegen den Sessions unter Win Vista/7 auch nicht mehr richtig. Außerdem meckert mein Virenschutz immer bei Programmen, die CreateRemoteThread aufrufen.
Könnte man nicht (theoretisch) folgendes machen: Man schreibt seine Code in das fremde programm, und anstatt CreateRemoteThread aufzurufen schreibt man irgendwo in dem fremden Prozess einen Jump-Befehl zu dem Angelegten Speicherbereich. Dieser müsste dann auch von dem Anderen Programm ausgeführt werden, also müsste man auch noch wissen, wo der Befehl liegt, den dieser Prozess als nächstes ausführen wird. Ob das allerdings machbar ist oder wie man das macht, entzieht sich meiner Kenntnis.
MfG, Jochen
-
DLL/Code injections funktionieren unter Vista wie gehabt (mal abgesehen von Problemen/Warnungen der AV's). Man braucht halt nur Administrator Rechte dafür.
-
HMODULE schrieb:
!!!: LoadLibrary()+GetProcAddress()
Und wie soll das gehen?
-
Achso, naja wenn die Adressen sich nur beim Start von Windows ändern, und dann für jeden Prozess gleich sind, liegt das Problem des TE aber wo anders.
-
@Danyka
Befindet sich deine lil.dll auch im selben Verzeichnis wie die Notepad Executable oder im Systemordner?
Ansonsten musst du den absoluten Pfad angeben.
-
Ich wusste, ich übersehe irgendwas...danke für das Augen öffnen; es war tatsächlich so eine banale Lösung
-
Meine Lösung?
Dann hast du aber doch bestimmt eine Windows-Meldung bekommen, dass die DLL nicht gefunden wurde?!