[WIN7]LoadLibrary return value?

Hallo, mir ist aufgefallen, dass der Rückgabewert von LoadLibrary bei meiner Dll immer gleich ist. Kann mir jemand sagen, ob der Wert einfach nur eine Art Wert zum Identifizieren eines Handles ist oder ob er intern als Pointer bzw. als etwas anderes technisch bedeutsames verwendet wird?
Ich gucke mir gerade ein programm mit OllyDbg an, bei dem aus irgendeinem Grund mit dem Handle gerechnet wird.
Das sieht dann so aus: MOV EAX, DWORD PTR DS:[hDll+3C].
Kann mir jemand den Sinn davon erklären?
 
dllHandle ist gleichzeitig die Basisadresse der DLL im Speicher.
Einfach ein "Follow in Dump" auf den Rückgabewert von LoadLibraryA/W anwenden.

MOV EAX, DWORD PTR DS:[hDll+3C]
würde dann die Adresse de PE-Headers der DLL auslesen (warscheinlich kommen dann noch mehr Aktionen - denkbar wäre ein manuelles Durchgehen der Exporteinträge - also eine Art "GetProcAddress" Ersatz)
 
Danke für die Antwort! Hätte ich aber eigentlich auch selber draufkommen können (->Follow in Dump).

Das debuggte Programm lädt eine gepackte Dll in den Speicher. Mein Ziel ist es diese Dll zu ersetzen, doch sobald ich sie in den Speicher laden lasse stürzt Olly ab.

Ich würde jetzt gerne den Inhalt dieser Dll sehen, aber mit Unpacking kenne ich mich eigentlich gar nicht aus. Allerdings entpackt sich diese Dll höchstwahrscheinlich sobald sie in den Speicher geladen wurde.
Jetzt hatte ich folgende Idee: Dll laden lassen -> Dumpen
Nun weiss ich nicht wie ich das bewerkstelligen soll, da Olly immer abstürzt.
Ausserdem mag diese Dll Debugger nicht gerne und beendet dann das Hauptprogramm. Ich hatte jetzt die Idee, den Prozess zu suspenden, aber diese Idee hat schon beim letzten Versuch nicht richtig funktioniert.

Hat jemand noch einen Vorschlag?
 
Hm, mit PEID scannen und den Schutz bestimmen - dann bei ARTeam/BW (BiW Reversing - Tutorials) oder tuts4you nach entsrprechenden Artikeln dazu suchen.

Alternativ/zusätzlich OllyDbg 2.0 ausprobieren ;)
Wobei: OllyDbg 1.10 hat ungepatcht einige Bugs. Diese werden dann gerne ausgenutzt, um das Debuggen zu unterbinden (zusätzlich zur Debuggererkennung). Nun gibt es OllyAdvanced/Phantom/Stealth[0] Plugins (tuts4you), die OllyDbg wiederum verstecken können und zudem (zumindest OllyAdvanced) die Bugs wegpatchen.


[0]Bin schon etwas länger nicht mehr auf dem Laufenden, was nun das aller-aktuellste Plugin ist ;)
 
Aufgrund meiner unglaublichen Fähigkeiten im Reverse Engineering habe ich jetzt rausgefunden, mit welchem Programm die Dll gepackt ist, obwohl PEid nichts anzeigt... Man sehe und staune:
Themida.png

Mittlerweile habe ich die Dll zum Teil entpackt. Dazu habe ich mir dieses äusserst komplexe Programm geschrieben:
Code:
#include <iostream>
#include <windows.h>
#include <fstream>
#include <psapi.h>

using namespace std;

bool GetModuleInfo(MODULEINFO& modinfo ,char *szModule )
{
    HMODULE hModule = GetModuleHandle(szModule);
    if(hModule == 0) return false;
    GetModuleInformation(GetCurrentProcess(), hModule, &modinfo, sizeof(MODULEINFO));
    return true;
}

bool DumpDll(char* lpcDll)
{
    HANDLE hDll;
    MODULEINFO modInfo;
    fstream fsDumpedDll;
    char* lpcDumpedName = NULL;
    ///=================>
    if (!(hDll = LoadLibrary(lpcDll)))
    {
        cout << ">[ERROR] Exception at loading the Dll '" << lpcDll << "'" << ". ErrorCode: " << hex << GetLastError() << endl;
        return false;
    }
    ///============================>Module dumpen
    GetModuleInfo(modInfo, lpcDll);
    cout << ">SizeOfModule '" << lpcDll << "' is " << hex << modInfo.SizeOfImage << endl;
    ///==============>Neuen Platz für den Dllnamen anfordern
    lpcDumpedName = new char[strlen(lpcDll)+ strlen("_dumped.dll") + 1];
    strcpy(lpcDumpedName, lpcDll); //Dll namen reinkopieren
    lpcDumpedName[strlen(lpcDumpedName)-4] = NULL; //das '.dll' löschen
    strcat(lpcDumpedName, "_dumped.dll"); //anhängen
    cout << ">Gonna dump the Dll '" << lpcDll << "' to '" << lpcDumpedName << "'" << endl;
    ///================>Speichern
    fsDumpedDll.open(lpcDumpedName, fstream::binary | fstream::ate | fstream::out);
    if (!fsDumpedDll.is_open())
    {
        cout << ">[ERROR] Exception at opening the file '" << lpcDumpedName << "'" << endl;
        return false;
    }
    fsDumpedDll.write((char*)hDll, modInfo.SizeOfImage); //kann sein, dass die groesse hier nicht ganz stimmt, weil das Image möglicherweise nicht so groß ist wie die eigentliche Datei
    if (fsDumpedDll.fail())
    {
        cout << ">[ERROR] Exception at writing the Data to the file '" << lpcDumpedName << "'. Errorcode: " << GetLastError() << endl;
        return false;
    }
    fsDumpedDll.close();
    return true;
}

int main()
{
    DumpDll((char*)"EvilDll.dll"); //warnung vom compiler vermeiden
    return 0;
}

Leider entpackt sich die Dll beim Laden nicht vollständig, sondern anscheinend nur in Teilen. Wobei manche Codeabschnitte eigentlich gar nicht ausführbar sein sollten...

Alternativ/zusätzlich OllyDbg 2.0 ausprobieren ;)
Wobei: OllyDbg 1.10 hat ungepatcht einige Bugs. Diese werden dann gerne ausgenutzt, um das Debuggen zu unterbinden (zusätzlich zur Debuggererkennung). Nun gibt es OllyAdvanced/Phantom/Stealth[0] Plugins (tuts4you), die OllyDbg wiederum verstecken können und zudem (zumindest OllyAdvanced) die Bugs wegpatchen.
Das ist eine ziemlich gute Idee. Werde ich demnächst ausprobieren.
 
Bei Themida wirst du keinen Spaß haben.
Ist einer der besseren Protektoren auf dem Markt und ad-hoc kenne ich auch keine Tutorials dafür.

MfG
Inliferty
 
Nun ja, kommt auf das Ziel und die "Themidaintegration" an - es müsste eine SDK/Headers dafür geben und afaik erfordern die "heavy" Features doch einige Anpassungen. Zudem wird dank dem Verhalten der modernen Winversionen nicht mehr auf Ring0 "Layer" gesetzt.
Auch gibt es recht aktuelle Scripte für Olly wie z.B Themida + WinLicense 1.x - 2.x Multi Pro Edition v1.2 / OllyScript - Scripts / Downloads - Tuts 4 You
Mit etwas Glück wird man also zumindest im Groben in die DLL "einsehen" können (muss ja nicht gleich komplett Themida entfernen ;) ).
Ansonsten gibt es auch OllyDbg Modifikationen:
OllyDbg Engines / Modifications / Downloads - Tuts 4 You - wobei diese allerdings schon etwas älter sind und es daher wohl auf die Themidaversion ankommt.
 
Ich habe es jetzt geschafft die Dll zu ersetzen. Ich musste sie dazu gar nicht debuggen, da ich einfach nur die Funktionen nachprogrammiert habe um die richtigen Rückgabewerte zu geben. Zumindest stürzt das Programm mit meiner Dll nicht ab. Ob da später ein paar Funktionen fehlen wird sich noch herausstellen.

Jetzt muss ich quasi nur noch den Updater rauspatchen. Dieses Programm überschreibt ansonsten meine Dll.
Ich habe mir dazu auch schon ein Programm geschrieben, aber aus irgendeinem Grund ist es nicht in der Lage, den patch vorzunehmen :rolleyes:
Ich habe das Programm schon mit Administratorrechten gestartet, aber leider versagt mit Windows den Zugang (lastError = 5 = ACCESS_DENIED).
Hier die wichtigen Ausschnitte:
Starten des Prozesses im SUSPEND Zustand:
Code:
memset(&si, 0, sizeof(STARTUPINFO));
    memset(&pi, 0, sizeof(PROCESS_INFORMATION));
    bBool = CreateProcess("GDMO.exe", //Dateiname
                  (char*)" true", //Konsolenparameter
                  NULL,   //lpProcessAttributes
                  NULL,   //lpThreadAttributes
                  false,   //bInheritHandles
                  CREATE_SUSPENDED, //dwCreationFlags
                  NULL,
                  NULL, //das neue Directory des aufzurufenen prozesses (NULL = dasselbe wie auch dieser Prozess)
                  &si,
                  &pi);

Überschreiben einer Funktion:
Code:
//Zum Deaktivieren des Updates
    BYTE byUpdatePatch[] = {0xB8,0x01,0x00,0x00,0x00,0xC3}; //mov eax, 1
                                                            //retn
    ///============================>Funktionsstart
    ///=======>Binary Patches anwenden
    SetDebugPrivilege();
    if (!VirtualProtectEx(pi.hProcess, (void*)0x40C460, sizeof(byUpdatePatch),PAGE_EXECUTE_READWRITE, &oldProtection))
    {
        cout << "[ERROR] VirtualProtect failed. Last Error is " << GetLastError() << endl;
        return false;
    }
    if (!WriteProcessMemory(pi.hProcess, (void*)0x40C460, &byUpdatePatch, sizeof(byUpdatePatch), NULL))
    {
        cout << "[ERROR] WriteprocessMemory return is false. LastError: " << GetLastError() << endl;
        return false;
    }

Die Ausgabe des Programms:
================GDMO wurde erfolreich gestartet================
Bitte eine Taste druecken um den Prozess zu starten!
[ERROR] VirtualProtect failed. Last Error is 5
[ERROR] Prozess wurde nicht erfolgreich gepatcht!

Die Adresse zum Patchen befindet sich übrigens im CodeSegment, falls das wichtig ist.
 
Omg, ich bin so blöd. Ich habe das programm nicht als Adminstrator ausgeführt. Ich habe das nicht bemkerkt, da dass Hauptprogramm die Rechte immer sofort angefordert hat.
Aber danke für eure Hilfe. Es funktioniert jetzt alles ausgezeichnet, nur leider schickt die Dll ungeführ jede Minute ein Keep-Alive Packet an den Server. Sobald ich das über Wireshark gefunden habe sollte alles gut funktionieren.
Nochmal danke für eure Hilfe :wink:
 
Zurück
Oben