2 Probleme - Xor Verschlüsselung u. Fehler beim einbinden von shlobj.h
-
Hallo,
ich beschäftige mich seit längerem mit C++ und halt seit neustem erst mit dem Visual Studio 9 Compiler (davor hab ich VS6 genuzt). Nun habe ich ein allgemeines Problem zu einer C++ XOR Verschlüsselungs Umsetzung und ein Problem allgemein zum Compiler.Ich fange mal mit dem COmpiler Problem an. Und zwar lässt sich einfach nicht die "shlobj.h" HEader Datei in Projekte einbinden. Nach dem Einbinden bekomme ich beim Kompilieren folgenden Fehler angezeigt:
d:\programme\microsoft visual studio 9.0\vc\include\ocidl.h(4675) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Das ganze kommt auch wenn ich grad nen neues Leeres Projekt erstelle:
#include <iostream.h> #include <shlobj.h> int main() { return 0; }Auch wenn ich nen unter Visual Studio 6 funktionierendes Projekt einbinde, kommt dieser Fehler. Ich weiß ehrlich gesagt nicht woran es liegt und wie ich ihn beseitigen kann.
Nun zum 2. Problem. Ich versuche mich seit einigen Tagenauch noch mit der Verschlüsselung von Strings auseiandner zu setzen.
Dazu habe ich mir ein kleines Beispielprogramm aus dem Internet geladen, welches local verlorene Passwörter von Firefox wiederherstellt. Jedenfalls isr dort der Pfad bereits XOR Verschlüsselt.
#include <windows.h> #include <iostream.h> char *Xor_(char *pInput) { int Length = lstrlenA(pInput); for (int i = 0; i < Length; i++) pInput[i] ^= 0x0fa1c0; return pInput; } int main() { char path[] = "\x9C\x9C\x8D\xAF\xBA\xA9\xAC\xAC\xA1\x9C\x9C\x86\xA9\xB2\xA5\xA6\xAF\xB8\x9C\x9C\xB0\xB2\xAF\xA6\xA9\xAC\xA5\xB3\xEE\xA9\xAE\xA9"; cout << Xor_(path); return 0; }So wird mir nach dem Kompilieren und ausführen auch der Pfad "\\Mozilla\\Firefox\\profiles.ini" angezeigt. Schön und gut.. da ich allerdings ein anderes Programm schreiben will, welches Texte verschlüsselt will ich das ganze nu umgekehrt machen und mal probieren den Pfad "\\Mozilla\\Firefox\\profiles.ini" in die oben gezeigte Hexadezimalkette wieder umzuwandeln. Bekannt ist ja bei der XOR Verschlüsselung, das Sie 2 mal ausgeführt wieder das Anfangsergbenis anzeigt. Deswegen habe ich mal das Prog umgeschrieben:
#include <windows.h> #include <iostream.h> char *Xor_(char *pInput) { int Length = lstrlenA(pInput); for (int i = 0; i < Length; i++) pInput[i] ^= 0x0fa1c0; return pInput; } int main() { char path[] = "\\Mozilla\\Firefox\\profiles.ini"; cout << Xor_(path); return 0; }Als Ausgabe erwarte ich nun die oben angesprochenen Hexadezimalstring, doch ich bekomem nur folgendes Ergebnis: £ì»║
¼¼í£å
▓Ѫ»
£░▓»ª
¼Ñ│¯
«
JOa aber ich möchte um Fehler zu vermeiden, die Ausgabe schö in dem oben angegeben Format ausgeben. Kann mri da einer helfen und evtl unter einem Beispielquellcode Zeigen wie ich eine solche Ausgabe hinbekommen kann ? .. ich denke mal in Hexadezimal ausgeben... aber wie ?Bin echt für jede Hilfe dankbar!
-
Ich kannn hier grad nix ausprobieren, deshalb nur ein paar Tips:
- #include <iostream> -> nicht #include <iostream.h>
- std::cout oder using namespace std;
- Hexadezimale Formatierung geht mit
cout << "\\x" << hex << Zahl, d.h. erst Xor_(path) aufrufen und dann für jedes Zeichen eine hexadezimale Ausgabe.
-
Dein erstes Problem hat nicht wirklich viel mit C++ zu tun, oder? Daher kann ich dir dabei nicht helfen.
Einzig was mir auffällt, du benutzt eine falsche Schreibweise für die C++ Header. Die C++ Header haben keine .h Endungen oder zumindest seit 1998 nicht mehr. Der VC6 hat das noch so gemacht, aber das ist falsch.
`iostream.h => iostreamfstream.h => fstream
string.h => string
usw.`
Für die C-Header in C++ gilt das folgende:
`stdlib.h => cstdlibstdio.h => cstdio
ctype.h => cctype
usw.`
Zum zweiten Problem. Du musst nur deine
chars inints umwandeln undstd::hexdavor setzen. Wenn ich mal deinen Code ein wenig umschreiben darf:void wait_close() { std::cout << std::endl << "Press enter to exit ..." << std::endl; std::cin.ignore(std::cin.rdbuf()->in_avail()); std::cin.clear(); std::cin.get(); } void do_xor(char& c) { c ^= 0x0fa1c0; } void do_output(char c) { unsigned int hex = c; hex &= 0xFF; std::cout << ' ' << std::showbase << std::hex << hex; } int main() { std::string path = "\\Mozilla\\Firefox\\profiles.ini"; std::for_each(path.begin(), path.end(), &do_xor); std::for_each(path.begin(), path.end(), &do_output); // Man könnte do_xor und do_output auch zusammen nehmen, // hab sie aber zum besseren Verständnis auseinander genommen. wait_close(); // Hält die Konsole offen. return 0; }Eine nicht ganz vollständige aber trotzdem sehr nützliche C++ Referenz:
http://www.cplusplus.com/reference/Ich hoffe das hilft dir alles weiter.
Grüssli