.RDP-Datei auslesen



  • Guten Abend 🙂

    bin noch recht frisch in sachen C++ habe aber bereits viel an basiswissen zugelegt.
    brauche an dieser stelle jedoch ein gedankenanstoss.

    möchte gerne eine von windows erstellte .rdp-datei auselsen
    und den inhalt in eine .txt streamen.

    dachte mir ich lese zeile für zeile mit einer while schleife aus und übergebe diese dann gleichzeitig dem stream der das dann in die neue .txt datei schreibt.

    hier der CODE bisher:

    #include <iostream>
    #include <fstream>
    #include  <io.h>
    #include <string>
    
    using namespace std;
    
    int main(){
    
    	if (_access("default.rdp", 0) != -1)         { cout << "default.rdp found" << endl; }
    	else										 { cout << "default.rdp not found" << endl; }
    
    	ifstream file  ("default.rdp");
    	fstream f;
    	f.open("neu.txt", ios::out);
    
    	string inhalt;
    	while (getline(file, inhalt))
    
             {
    		     f << inhalt << endl;
    	     }
    
    	system("pause");
    	return 0;
    }
    

    wenn ich dann anschließend die "neu.txt" öffne ist der inhalt mit buchstaben und chinesischen zeichen und nicht mit buchstaben und nummern:

    screen mode id:i:1
    use multimon:i:0
    desktopwidth:i:1920
    desktopheight:i:1080
    session bpp:i:32
    winposstr:s:0,3,288,52,1360,728
    compression:i:1
    

    weiss jemand was da in etwa schief läuft? 😮 😕

    Danke



  • Ist die RDP Datei vielleicht UTF-16 kodiert? Wenn ja, solltest du (unter Windows) wifstream wofstream und wstring verwenden.



  • Ah danke, dann schau ich das mal nach 🙂



  • habe es mal direkt ausprobiert:

    int main(){
    
    	if (_access("default.txt", 0) != -1)         { cout << "default.rdp found" << endl; }
    	else										 { cout << "default.rdp not found" << endl; }
    
    	wifstream file  ("default.txt");
    	wfstream f;
    	f.open("neu.txt", ios::out);
    
    	wstring inhalt;
    	while (getline(file, inhalt)){
    
    		f << inhalt << endl << endl;
    	}
    
    	system("pause");
    	return 0;
    }
    

    da das ergebnis gleich geblieben ist habe ich weiter gegoogelt und folgendes gefunden:

    http://www.remkoweijnen.nl/blog/2007/10/18/how-rdp-passwords-are-encrypted/

    drin steht:

    I did some analysis on mstsc.exe and mstsc uses the functions CryptProtectData and CryptUnProtectData which are both exported by crypt32.dll.

    steckt da also mehr kodierung hinter als gedacht?



  • Siehe hier.
    Anscheinend mußt Du dich da selber drum kümmern.
    Bzw. vielleicht hilft es, im Binärmodus zu arbeiten.



  • So weit ich gesehen habe, sind die RDP-Dateien nicht nur UTF16 codiert, donern haben auch eine BOM am Anfang der Datei.
    Du kannst sie 'ganz normal' mit i(f)stream lesen, wenn da tatsächlich nur ASCII-Zeichen drinstehen.
    Das geht so:

    #include <fstream>
    #include <iostream>
    #include <codecvt>
    
    int main()
    {
        using namespace std;
        ifstream file("default.rdp" );
        if( !file.is_open() )
        {
            cerr << "Fehler beim Oeffnen der Datei" << endl;
            return 0;
        }
        file.imbue( locale( file.getloc(), new codecvt_utf16< char, 0x10ffff, std::consume_header > ) ); 
    
        // ab hier kann jetzt wie gewohnt aus 'file' gelesen werden
    

    Es in eine eine Textdatei zu schreiben macht nicht wirklich Sinn - dann könntest Du die Datei auch gleich einfach kopieren!?

    weiter lesen könnte so aussehen:

    // ab hier kann jetzt wie gewohnt aus 'file' gelesen werden
        for( string var, type; getline( getline( file >> ws, var, ':' ), type, ':' ); )
        {
            cout << var << "\t: ";
            if( type == "i" )
            {
                cout << "integer: ";
                int i;
                if( (file >> i).fail() )
                    break;
                cout << i << endl;
            }
            else if( type == "s" )
            {
                cout << "string: ";
                string s;
                if( getline( file, s ).fail() )
                    break;
                if( !s.empty() && s.back() == '\r' )    // .. CR LF-Problem; hier wußte ich mir nicht anders zu helfen!
                    s.resize( s.length()-1 );
                cout << "\"" << s << "\"" << endl;
            }
            else
            {
                cout << "?: " << endl;
                file.ignore( 999, '\n' );
            }
        }
        return 0;
    }
    

    .. sollten in der Datei tatsächlich chinesische Schrichftzeichen drin stehen, dann käme es an dieser Stelle zu einem Lesefehler. Die Lösung wäre dann, auf wifstream inklusive wchar_t zu wechseln.

    Gruß
    Werner



  • grüß dich werner,

    möchte an dieser stelle kurz erklären was tatsächlich passieren soll:

    auf einem mobilem windows embedded BS (CE) wird das password in einem rdp terminal eingegeben und in eine RDP datei gespeichert. in der datei ist das passowrd dann entschlüsselt.

    das passwort soll aus der datei ausgelesen und anschließend in eine bereits bestehende RDP datei mit richtigen parametern eingetragen werden (DESKTOP).

    in der ausgangsdatei (also quelle)sind keine chinesischen zeichen (siehe meinen ersten beitrag da ist ein schnippsel wie die datei in einem .txt editor aussieht)

    die chinesischen zeichen sind dann in der neu.rdp (ziel)eindeutig mein fehler

    ich schau mir nun dein code im compiler an denke da ist noch ein menge zu verstehen. das thema UTF/BOM ist ganz neu für mich, werde mich da erst mal in ruhe einarbeiten.

    vielen vielen Dank jetzt weiss ich was zu tun ist 👍


Log in to reply