Exe mit Passwort schützen?



  • Hallo.

    Ich habe eine VisualC++ 6 EXE mit einer Fullscreen DirectDraw Anwendung (keine Source mehr). Jetzt möchte ich diese Anwendung mit einem Passwort schützen. Soll ganz ganz simpel sein. Ich dachte ich nehme meinen C++Builder 2009, erstelle ein neues Projekt mit einem TEdit und TButton drauf und wenn der Anwender das Passwort richtig eingibt und bestätigt, dann soll die DirectDraw Anwendung starten.

    Meine Frage ist jetzt, wie bekomme ich die Passwort Abfrage in die DirectDraw Anwendung? Kann man dem Projekt die Exe hinzufügen und intern aufrufen? Kennt jemand eine Alternative?

    Ziel ist es, wenn man die Exe startet, das eine Passwortabfrage erscheint und bei korrekter Eingabe soll das DirectDraw Programm starten. Zur Verfügung steht mir C++Builder 2009.



  • Hallo

    Du kannst nicht so einfach die beiden Programme verschmelzen, oder ein fertig kompiliertes Programm so einfach erweitern. Du kannst von deinem Passwortprogramm mit der WinAPI-Funktion ShellExecute (Forumsuche benutzen) das DirectDraw-Programm starten lassen, mußt dann aber das originale DirectDraw-Programm zusätzlich mitliefern, so das es auch ohne Passwortprogramm gestartet wird. Ein Stufe höher wäre das DirectDraw-Programm als Resource in das Passwortprogramm mit reinzukompilieren und erst nach der erfolgreichen Passwortabfrage zur Laufzeit zu extrahieren, mit ShellExecute zu starten, und nach dem beenden wieder zu löschen. Soviel ich aber weiß, ist es nicht ohne Umweg über die Festplatte möglich, das Resourcenprogramm zu starten. Und Windows-Resourcen können auch mit einfachen Mitteln ausgelesen werden, du müßtest noch extra die Resource vor dem Kompilieren verschlüsseln und zur Laufzeit vor dem Starten entschlüsseln.

    Richtige Experten könnten unter Umständen das DirectDraw-Programm dekompilieren und umschreiben, so wie es ja auch die Cracker machen, die den Kopierschutz von Spielen knacken. Oder Angriffstellen wie DLL-Injection nutzen. Aber das erfordert sehr viel Wissen und Arbeit.

    bis bald
    akari



  • Es gibt Programme die das können. Zum Beispiel http://pespin.w.interia.pl
    Ich kann aber nur die 32Bit Version nutzen und die ist in der Oberfläche bei der Passworteingabe sehr hässlich. Eventuell arbeiten die auch anders als ich dachte.

    Kennt eventuell wer noch andere Freeware Alternativen von solchen Programmen?



  • akari schrieb:

    ist es nicht ohne Umweg über die Festplatte möglich, das Resourcenprogramm zu starten...

    Bisher hatte ich auch keinen brauchbaren Ansatz gefunden.
    Nach einiger Recherche bin ich auf diesen Link gestossen.
    Nachfolgend mal den Code; die Funktion ZwUnmapViewOfSection ist im BCB nicht verfügbar und wird aus der ntdll.dll *ausgeborgt*.

    ULONG protect(ULONG characteristics)
    {
        static const ULONG mapping[]
            = {PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,
               PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE, PAGE_EXECUTE_READWRITE};
    
        return mapping[characteristics >> 29];
    }
    // nach Prüfung des Passwortes etc:
       PVOID p = LockResource(LoadResource(0, FindResource( HInstance, "Resource_3",  RT_RCDATA )));
       if(NULL == p)
          return;
    
       PROCESS_INFORMATION pi;
       STARTUPINFO si = {sizeof si};
    
       bool cp = CreateProcess(0, "cmd", 0, 0, FALSE, CREATE_SUSPENDED, 0, 0, &si, &pi);
    
       CONTEXT context = {CONTEXT_INTEGER};
       GetThreadContext(pi.hThread, &context);
    
       PVOID x;
       ReadProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &x, sizeof x, 0);
    
       //-- ZwUnmapViewOfSection verfügbar machen --
    
       HINSTANCE hNTDLL = LoadLibrary ("ntdll");
       typedef DWORD (WINAPI *NTSTATUS)(HANDLE, PVOID);
       static NTSTATUS pZwUnmapViewOfSection = NULL;
    
       pZwUnmapViewOfSection = (NTSTATUS) GetProcAddress( hNTDLL, "ZwUnmapViewOfSection");
       DWORD status = pZwUnmapViewOfSection(pi.hProcess, x); 	
    
       FreeLibrary (hNTDLL);
       //-- Ende Modif. --
    
       PIMAGE_NT_HEADERS nt = PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p)->e_lfanew);
    
       PVOID q = VirtualAllocEx(pi.hProcess,
                                 PVOID(nt->OptionalHeader.ImageBase),
                                 nt->OptionalHeader.SizeOfImage,
                                 MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
    
       WriteProcessMemory(pi.hProcess, q, p, nt->OptionalHeader.SizeOfHeaders, 0);
    
       PIMAGE_SECTION_HEADER sect = IMAGE_FIRST_SECTION(nt);
    
       for (ULONG i = 0; i < nt->FileHeader.NumberOfSections; i++) {
          WriteProcessMemory(pi.hProcess,
             PCHAR(q) + sect[i].VirtualAddress,
             PCHAR(p) + sect[i].PointerToRawData,
             sect[i].SizeOfRawData, 0);
    
          ULONG x;
          VirtualProtectEx(pi.hProcess, PCHAR(q) + sect[i].VirtualAddress, 
             sect[i].Misc.VirtualSize,
             protect(sect[i].Characteristics), &x);
       }
       WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, &q, sizeof q, 0);
       context.Eax = ULONG(q) + nt->OptionalHeader.AddressOfEntryPoint;
       SetThreadContext(pi.hThread, &context);
       int SuspendCount = ResumeThread(pi.hThread);
    
       Application->ProcessMessages();
       // Start-exe beenden
       Close();
    

    Ausgegangen wird von einer nichtverschlüsselten ausführbaren exe, die wie als Bedingung als Resource in der Start-exe enthalten ist.
    Das wäre als weiterer Schritt zu machen.

    Nebenbei: sollte jemand sonst den Code testen, bitte mal die Erfahrungen posten 😉

    mfg
    kpeter



  • Die exe eines Programmes bleibt jederzeit direkt ausführbar! Man kann die exe aber (auf der Festplatte) verändern und die Veränderungen in einem Start-Programm verübergehend rückgängig machen. Einfachster Weg: xxxx.exe umbenennen in yyyy.zzz und so auf der Festplatte speichern. Im Start-Programm yyyy.zzz zurück benennen in xxxx.exe und dann nach Passwortabfrage starten oder nicht. Für mehr musst du wohl aufwendige Hacker-Methoden einsetzen, die sind aber nicht unser Metier hier im Forum!



  • Man könnte auch gewisse Fragmente aus der xxx.exe durch sinnlose werte ersetzen (fstream) z.B. von 2045 Byte bin 5034 Byte (je nach Größe der xxx.exe) mit Random Werten ersetzen (Die Originalen Werte "merken"^^) und bei richtiger Eingabe des Passwortes einfach die Originalen Werte in die xxx.exe schreiben.

    Du könntest zur Sicherheit auch in deinen Programm implementieren, das es jede Sekunde überprüft ob die xxx.exe immer noch ausgeführt wird, und wenn nicht in die xxx.exe einfach wieder von 2045 Byte bin 5034 Byte mit Random Werten eintragen.

    Edit: du musst die xxx.exe natürlich Binär öffnen!



  • Hallo

    Bei solchen Operationen wie Dateinamen oder Bytes ändern bekommt man aber unter Umständen Ärger mit dem Windows-Rechtesystem oder mit Virusscannern. Denn das ist meistens Anzeichen von Malware.

    bis bald
    akari



  • Es geht um die Passwortabfrage einer fremden EXE. Den Code hat man dafür nicht. Wenn die Umbenennung der EXE-Datei oder die Manipulatation etwas unproblematisches zeigt, werden die Windows-Rechte daran wohl keinen Anstoss nehmen. Es ist einfach eine als Programm nicht ausführbare Datei, die man mit einem Start-Programm wieder ausführbar macht. Ob jetzt Virenscanner das erkennen weiss ich nicht, sie hätten da riesig was zu tun.



  • Hallo

    berniebutt schrieb:

    Es geht um die Passwortabfrage einer fremden EXE. Den Code hat man dafür nicht.

    Weder Windows noch ein Virenscanner interessieren sich für den Grund der Manipulation. Sondern das eine Manipulation stattgefunden hat

    Wenn die Umbenennung der EXE-Datei oder die Manipulatation etwas unproblematisches zeigt, werden die Windows-Rechte daran wohl keinen Anstoss nehmen.

    Woher soll Windows wissen was unproblematisch ist oder nicht? Windows 7 jedenfalls läßt sich jede Änderungen an Dateien im Programmverzeichniss vom Benutzer manuell bestätigen.

    Ob jetzt Virenscanner das erkennen weiss ich nicht, sie hätten da riesig was zu tun.

    Virenscanner arbeiten u.a. mit Checksums. Wenn dann plötzlich durch die Byteänderung die Checksum nicht mehr passt, wird je nach Scanner das Programm als verdächtig betrachtet.

    bis bald
    akari



  • Eine normale ausführbare exe-Datei in die Resourcen zu packen, ist witzlos.
    Hatte akari ganz oben auch schon geschrieben, das Res-Dateien auszulesen kein grosses Problem ist.

    Also die Datei vorher verschlüsseln und dann in die Resource packen.

    Mit einer XOR Encryption/Decryption zum Beispiel kann man das relativ einfach bewerkstelligen.
    Wenn dann bei Programmstart das Passwort ok ist, wird entschlüsselt.



  • kpeter schrieb:

    Eine normale ausführbare exe-Datei in die Resourcen zu packen, ist witzlos.
    Hatte akari ganz oben auch schon geschrieben, das Res-Dateien auszulesen kein grosses Problem ist.

    Also die Datei vorher verschlüsseln und dann in die Resource packen.

    Mit einer XOR Encryption/Decryption zum Beispiel kann man das relativ einfach bewerkstelligen.
    Wenn dann bei Programmstart das Passwort ok ist, wird entschlüsselt.

    Wichtig ist nur, dass der Schlüssel mit dem xor'ed wird
    a) aus dem Passwort berechnet wird und
    b) genauso lang ist wie die zu verschlüsselnde Datei selbst. Sonst wär die Verschlüsselung auch witzlos. (One Time Pad)
    Ich kenne einige Negativ-Beispiele in denen die crypto keys hard codiert werden ...

    Außerdem würd ich ein Verfahren wie AES bevorzugen, da die Schlüssel dabei nicht der Länge des Klar/Ciphertextes entsprechen müssen.


Log in to reply