hex in string umwandeln
-
Hallo.
Ich habe eine kleine Ausgabe:
cout << (char)0x61 << endl;Diese gibt "a" aus, was es auch soll.
Wenn ich nun aber dies mache:cout << (char)0x6162 << endl;Wird nur "b" statt "ab" ausgegeben.
Und das hier gibt eine Fehlermeldung:cout << (char*)0x6162 << endl;Was muss ich machen damit "ab" ausgegeben wird?
-
cout << (char)0x61 << (char)0x62 << endl;EDIT:
oder:
cout << "ab" << endl;
-
_matze schrieb:
cout << (char)0x61 << (char)0x62 << endl;Würde ziemlich unübersichtlich werden wenn ich längere Strings benutze.
_matze schrieb:
cout << "ab" << endl;So will ich es ja gerade nicht.
Ich will mit 0xXXXXXXXXXX arbeiten.
-
hexzustring schrieb:
Ich will mit 0xXXXXXXXXXX arbeiten.
Wieso? Du musst verstehen, dass 0x6162 ein ganz anderer Wert ist und nix mit den ASCII-Codes von 'a' und 'b' zu tun hat...
-
Und um dir die Übersicht noch mehr zu versauen, also auch abraten es so zu machen:
In C++ hat man eigene Casts. Deine Casts sind C-Cast und von ihnen wird abgeraden. In C++ würde dies so aussehen:std::cout << static_cast<char>(0x61) << static_cast<char>(0x62) << std::endl;Aber ich denke die Frage ist durchaus berechtigt -> Wofür???
Grüssli
-
Weiß nicht wofür Du das brauchst aber kannst es ja so probieren.
char test1[] = {0x62, 0x63, 0}; std::cout << test1 << std::endl;
-
ich habe mal gehört, dass sich so erzeugte strings (0x8C, ...) nicht so einfach im fertigen Programmcode finden lassen - was den Vorteil hat, dass der Anfänger-Cracker schon daran verzweifeln kann, die Stelle im Programm zu finden, an der der Fehler XYZ ausgegeben wird... Und vor allem, dass Passwörter (zu Datenbanken o.ä.) nicht gefunden werden können, wenn man das programm mit nem Texteditor angeguckt... korrigiert mich, wenn ich mich täusche
bb
-
unskilled schrieb:
ich habe mal gehört, dass sich so erzeugte strings (0x8C, ...) nicht so einfach im fertigen Programmcode finden lassen - was den Vorteil hat, dass der Anfänger-Cracker schon daran verzweifeln kann, die Stelle im Programm zu finden, an der der Fehler XYZ ausgegeben wird... Und vor allem, dass Passwörter (zu Datenbanken o.ä.) nicht gefunden werden können, wenn man das programm mit nem Texteditor angeguckt... korrigiert mich, wenn ich mich täusche
bb
Also wenn Passwörter so hardgecodet werden hast du ein anderes Problem.. Vor allem wird das dann nicht mit einem Texteditor angeschaut, wohl eher mit einem Hex Editor..
-
unskilled schrieb:
ich habe mal gehört, dass sich so erzeugte strings (0x8C, ...) nicht so einfach im fertigen Programmcode finden lassen - was den Vorteil hat, dass der Anfänger-Cracker schon daran verzweifeln kann, die Stelle im Programm zu finden, an der der Fehler XYZ ausgegeben wird... Und vor allem, dass Passwörter (zu Datenbanken o.ä.) nicht gefunden werden können, wenn man das programm mit nem Texteditor angeguckt... korrigiert mich, wenn ich mich täusche
bb
Im fertig kompilierten Programm macht es keinen Unterschied ob du
char s[] = "Ein Passwort"; cout << s;oder
char s[] = {0x62, 0x..., ... } cout << s;benutzt. Die ASCII Zeichen werden in beiden Fällen auf die selbe Art und Weise im Programm abgespeichert.
-
templäd schrieb:
char test1[] = {0x62, 0x63, 0}; std::cout << test1 << std::endl;Das klappt wunderbar, vielen Dank!
Dravere schrieb:
Aber ich denke die Frage ist durchaus berechtigt -> Wofür???
Unskilled hat es Wunderbar erklärt.
ip schrieb:
Die ASCII Zeichen werden in beiden Fällen auf die selbe Art und Weise im Programm abgespeichert.
Also, wenn ich mein Prog mit einem HEX-Editor öffne, wird die Methode von templäd NICHT angezeit. Zumindest kann ich den String nicht finden.
Gibt es denn eine elegantere Lösung?
-
ab und an weiß ich halt doch mal was ^^
naja: es gibt viel bessere Lösungen ^^
z.Bsp. das Passwort in ne andere Datei legen - natürlich verschlüsselt...Allerdings hast du so auch wieder ein Problem:
Wenn der Client es entschlüsseln kann, dann kann es auch der Cracker, der sich deinen Client anguckt... Also bleibt dir wohl nur eine Verbindung zu einem Server aufzubauen, der die Querys/... selbst macht - und du somit das Pwd nicht mehr im Client brauchst - eine andere Lsg. gibts imho nicht...bb
-
ip schrieb:
Im fertig kompilierten Programm macht es keinen Unterschied ob du
char s[] = "Ein Passwort"; cout << s;oder
char s[] = {0x62, 0x..., ... } cout << s;benutzt. Die ASCII Zeichen werden in beiden Fällen auf die selbe Art und Weise im Programm abgespeichert.
Hauptsache, ich stell iwelche behauptungen auf, aber hab 0 Ahnung...
Quelltext:
#include <iostream> int main() { char A[] = "Mein leicht zu findender String"; char B[] = {'M', 'e', 'i', 'n', ' ', 'a', 'n', 'd', 'e', 'r', 'e', 'r', ' ', 'S', 't', 'r', 'i', 'n', 'g', '\0'}; std::cout << A << "\r\n" << B; }der Programm-Code in notepad nach dem Compilieren mit VS,
Optionen:/O2 /Oi /GL /D "_MBCS" /FD /EHsc /MD /Gy /Fo"Release\\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:promptMZ ÿÿ ¸ @ ð º ´ Í!¸LÍ!This program cannot be run in DOS mode. $ š¼•ÞÝûÃÞÝûÃÞÝûÃÀnÃßÝûÃÀxÃÊÝûÃÀÃÜÝûÃÀhÃÛÝûÃù€ÃÜÝûÃÞÝúÃâÝûÃÀqÃßÝûÃÀjÃßÝûÃRichÞÝûà PE L pÂ.I à m @ ` õÚ @ # P @ ° P ” ð H! @ Ð .text - `.rdata < @ @.data Œ 0 @ À.rsrc ° @ @ @.reloc ü P " @ B U‹ìƒäøƒì8¡ 0@ 3ĉD$4VW¹ ¾$!@ |$ó¥±n°rˆD$ˆD$ˆD$D$PQhD!@ ²eQˆL$ˆL$ˆL$)L$,ˆT$ˆT$ ˆT$"‹T @ QRÆD$ MÆD$"iÆD$$ ÆD$%aÆD$'dÆD$, ÆD$-SÆD$.tÆD$0iÆD$2gÆD$3 è\ ƒÄPèS ƒÄPèJ ‹L$DƒÄ_^3Ì3Àèô ‹å]ÃÌÌÌÌjÿhØ@ d¡ PW¡ 0@ 3ÄPD$d£ ‹|$‰7‹‹H‹L1(…ÉtÿH @ ÇD$ ‹‹Bƃx u‹@,…Àt‹Èÿ< @ ‹‹Qƒ|2 ”ÀˆG‹Ç‹L$d‰ Y_ƒÄ ÌÌÌÌÌÌÌÌÌÌÌÌÌjÿhØ@ d¡ PV¡ 0@ 3ÄPD$d£ ‹t$ÇD$ ÿX @ „Àu‹ÿL @ ÇD$ÿÿÿÿ‹‹‹Q‹D(…Àt‹ÈÿD @ ‹L$d‰ Y^ƒÄ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹ ‹‹Q‹D(…Àt‹Èÿ%D @ ÃÌÌÌÌÌÌÌÌU‹ìjÿh@ d¡ PƒìSVW¡ 0@ 3ÅPEôd£ ‰eð‹u‹E3Û‰]ìP¤$ Š@„Éuù+‹ø‹‹H‹D1;Ã~;Ç~+Ç‹ØUàRègþÿÿÇEü €}ä u ÇEì ëyÆEü‹‹H‹D1%À ƒø@t4…Û~*‹‹BŠL00Æ‹@(ˆMè‹UèR‹Èÿ@ @ ƒøÿ…– ƒMìƒ}ì u‹‹H‹U‹L1(WRÿP @ ;Çt~ÇEì ‹‹@Æ3ɉH‰Mü‹Mì‹j Q‹JÎÿ8 @ ÇEü ÿX @ „Àu ‹MàÿL @ ÇEüÿÿÿÿ‹Eà‹‹Q‹L(…ÉtÿD @ ‹Æ‹Môd‰ Y_^[‹å]ÃKé:ÿÿÿd$ …Û~…‹‹HŠT101‹@(ˆUè‹MèQ‹Èÿ@ @ ƒøÿu ƒMìéYÿÿÿKëÍ‹E‹‹JjjÈÿ8 @ ÇEü ¸´@ Ëué<ÿÿÿ; 0@ uóÃé¬ h¶@ è¤ ¡h3@ Ç$40@ ÿ5d3@ £40@ h$0@ h(0@ h 0@ ÿ¼ @ ƒÄ£00@ …À}jèº YÃjh "@ è* 3Û‰]üd¡ ‹p‰]ä¿|3@ SVWÿ @ ;Ãt;Æu3öF‰uäëhè ÿ @ ëÚ3öF¡x3@ ;Æu jè] Yë;¡x3@ …Àu,‰5x3@ hè @ hÜ @ è² YY…ÀtÇEüþÿÿÿ¸ÿ éÝ ‰5<0@ ¡x3@ ;ÆuhØ @ hÐ @ èw YYÇx3@ 9]äuSWÿ0 @ 9ˆ3@ thˆ3@ èŽ Y…Àt SjSÿˆ3@ ¡$0@ ‹ ¨ @ ‰ÿ5$0@ ÿ5(0@ ÿ5 0@ èÛúÿÿƒÄ£80@ 9,0@ u7Pÿ¬ @ ‹Eì‹‹ ‰MàPQè YYËeè‹Eà£80@ 3Û9,0@ uPÿ´ @ 9<0@ uÿ¸ @ ÇEüþÿÿÿ¡80@ è øMZ f9 @ t3ÀëM¡< @ € @ 8PE ué·Hù tù uÕƒ¸„ vÌ3É9ˆø ëƒxtv¼3É9ˆè •Á‹Áj£,0@ ÿd @ jÿÿ` @ YY£€3@ £„3@ ÿ @ ‹ p3@ ‰ÿ” @ ‹ l3@ ‰¡˜ @ ‹ £t3@ èW è· ƒ=0@ uhõ@ ÿÄ @ Yèr ƒ=0@ ÿu jÿÿœ @ Y3ÀÃè† éŸýÿÿ‹ÿU‹ìì( £H1@ ‰ D1@ ‰@1@ ‰<1@ ‰581@ ‰=41@ fŒ`1@ fŒ T1@ fŒ01@ fŒ,1@ fŒ%(1@ fŒ-$1@ œX1@ ‹E £L1@ ‹E£P1@ E£\1@ ‹…àüÿÿǘ0@ ¡P1@ £L0@ Ç@0@ ÀÇD0@ ¡ 0@ ‰…Øüÿÿ¡0@ ‰…Üüÿÿÿ @ £0@ jèJ Yj ÿ @ h!@ ÿ @ ƒ=0@ ujè& Yh Àÿ @ Pÿ @ ÉËÿU‹ì‹E‹ 8csmàu*ƒxu$‹@= “t=!“t="“t= @™uèÛ 3À] h}@ ÿ @ 3ÀÃÌÿ%À @ jh@"@ èl ÿ5„3@ ‹5€ @ ÿÖY‰Eäƒøÿuÿuÿ| @ Yëgjèœ Yƒeü ÿ5„3@ ÿÖ‰Eäÿ5€3@ ÿÖYY‰EàEàPEäPÿu‹5` @ ÿÖYPè_ ‰EÜÿuäÿÖ£„3@ ÿuàÿփģ€3@ ÇEüþÿÿÿè ‹EÜè" Ãjè# YËÿU‹ìÿuèNÿÿÿ÷ØÀ÷ØYH]ËÿV¸"@ ¾"@ W‹ø;Æs‹…ÀtÿЃÇ;þrñ_^ËÿV¸"@ ¾"@ W‹ø;Æs‹…ÀtÿЃÇ;þrñ_^Ãÿ%° @ ÌÌÌÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹M¸MZ f9t3À]ËA<Á8PE uï3Ò¹ f9H”‹Â]ÃÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ì‹E‹H<È·ASV·q3ÒWD…öv‹}‹H;ùr ‹XÙ;ûr BƒÀ(;Örè3À_^[]ÃÌÌÌÌÌÌÌÌÌÌÌÌ‹ÿU‹ìjþh`"@ h¥@ d¡ PƒìSVW¡ 0@ 1Eø3ÅPEðd£ ‰eèÇEü h @ è*ÿÿÿƒÄ…ÀtU‹E- @ Ph @ èPÿÿÿƒÄ…Àt;‹@$Áè÷ЃàÇEüþÿÿÿ‹Mðd‰ Y_^[‹å]ËEì‹‹3Ò= À”‹ÂËeèÇEüþÿÿÿ3À‹Mðd‰ Y_^[‹å]ÃÌÿ%¤ @ ÿ% @ ÌÌh¥@ dÿ5 ‹D$‰l$l$+àSVW¡ 0@ 1Eü3ÅP‰eèÿuø‹EüÇEüþÿÿÿ‰EøEðd£ ËMðd‰ Y__^[‹å]QËÿU‹ìÿuÿuÿuÿuh¼@ h 0@ èç ƒÄ]ËÿVh h 3öVèÙ ƒÄ…Àt VVVVVè ƒÄ^Ã3ÀËÿU‹ìƒì¡ 0@ ƒeø ƒeü SW¿Næ@»» ÿÿ;Çt …Ãt ÷У0@ ë`VEøPÿ, @ ‹uü3uøÿ( @ 3ðÿ$ @ 3ðÿ @ 3ðEðPÿ @ ‹Eô3Eð3ð;÷u¾Oæ@»ë…óu‹ÆÁàð‰5 0@ ÷Ö‰50@ ^_[ÉÃÿ%h @ ÿ%l @ ÿ%p @ ÿ%t @ ÿ%x @ ÿ%„ @ ÿ%ˆ @ ÿ%Œ @ ÿ%È @ ÌÌÌÌÌÌÌÌÌÌÌÌ‹Eéöÿÿ‹T$Bü‹Jø3ÈèÓ÷ÿÿ¸„"@ éËÿÿÿÌÌÌÌÌÌÌÌÌÌÌÌÌEàPèWõÿÿÃEàéÎõÿÿ‹T$B‹JÜ3Èè™÷ÿÿ¸ì"@ é‘ÿÿÿ ( ( 2( F( Z( v( ”( ¨( Â( Ò( è( þ( ö' & Ò% ’% P% % Ò$ Ž$ 0$ l$ $' 6' H' ^' ~' ˆ' –' ž' ¨' º' Ô' æ' ' ' ö& Ì& ¾& ²& ¦& ž& & ˆ& ~& n& `& â& &) Ë@ Œ@ ¿@ pÂ.I c ! @0@ ˜0@ bad allocation Mein leicht zu findender String H 0@ "@ RSDS&^@9”ÃA c:\Users\Tommy\Documents\Visual Studio 2008\Projects\test\Release\test.pdb ¥ Ø þÿÿÿ Ðÿÿÿ þÿÿÿ<@ P@ þÿÿÿ Ìÿÿÿ þÿÿÿ p@ þÿÿÿ Øÿÿÿ þÿÿÿ@ @ ÿÿÿÿÐ@ "“ |"@ ÿÿÿÿ @ ÿÿÿÿ @ @ “@ È"@ "“ ¨"@ Ø"@ ˜# T& 8 À# r' ` `# ) ( ( 2( F( Z( v( ”( ¨( Â( Ò( è( þ( ö' & Ò% ’% P% % Ò$ Ž$ 0$ l$ $' 6' H' ^' ~' ˆ' –' ž' ¨' º' Ô' æ' ' ' ö& Ì& ¾& ²& ¦& ž& & ˆ& ~& n& `& â& &) ‚?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ä?uncaught_exception@std@@YA_NXZ v?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z |?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ W?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ Ð?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ s?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z !?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ D?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z MSVCP90.dll _amsg_exit Ÿ __getmainargs ,_cexit |_exit f _XcptFilter Ìexit __initenv _initterm _initterm_e <_configthreadlocale ã __setusermatherr _adjust_fdiv Ë __p__commode Ï __p__fmode j_encode_pointer à __set_app_type K_crt_debugger_hook C ?terminate@@YAXXZ MSVCR90.dll æ_unlock – __dllonexit v_lock _onexit `_decode_pointer s_except_handler4_common _invoke_watson ?_controlfp_s ½InterlockedExchange !Sleep ºInterlockedCompareExchange -TerminateProcess ©GetCurrentProcess >UnhandledExceptionFilter SetUnhandledExceptionFilter ÑIsDebuggerPresent TQueryPerformanceCounter fGetTickCount GetCurrentThreadId ªGetCurrentProcessId OGetSystemTimeAsFileTime KERNEL32.dll s __CxxFrameHandler3 Næ@»±¿Dÿÿÿÿÿÿÿÿþÿÿÿ !@ € 0 € H X@ V ä <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> <security> <requestedPrivileges> <requestedExecutionLevel level="asInvoker" uiAccess="false"></requestedExecutionLevel> </requestedPrivileges> </security> </trustInfo> <dependency> <dependentAssembly> <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.21022.8" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity> </dependentAssembly> </dependency> </assembly>PAPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDING X 00=0b0Ó0à01*1c1p11›1º1ó122³2Ú233!3>3~3£3¯3¾3Ì3Ö3Ý3ã3è3í3ò3÷3ý34444=4X4b4u44„4‰4«4°4¹4¾4Ë4Ü4â4é4ý455555)5/585W5_5h5n5v5‚5”5Ÿ5¥5î5ô5ü566666"6)606@6H6N6Z6e6ƒ6‰66•6›6¡6¨6¯6¶6½6Ä6Ë6Ò6Ú6â6ê6ö6ÿ67 777(74797I7N7T7Z7p7w7À7Æ7Ð7×7â7è7ü78848J8W8”8™8º8¿8Þ8ˆ99Ÿ9½9Ñ9×9@:F:M:j:·:¼:;$;1;=;E;M;Y;};…;;–;œ;¢;¨;®;´;º;À;ê;$< 0 Ô0à0ä011„1ˆ14282X2t2x2€2Œ2¬2Ä2Ô2è2ô2ü2 0 0Siehe da - in Zeile 21 steht der String genau so drin... Hab gerad keinen Hex-Editor da, sonst hätte ich auch mal geguckt, wie schwer es denn nun wirklich ist, den anders erzeugten String zu suchen - aber wie schon oben beschrieben - es ist alles andere als unmöglich ^^
bb
edit: hatte nen '\0' vergessen...
-
Das hat gar nichts mit dem zu tun, was ip gesagt hat.
Nur weil Notepad dort "zufällig" das richtige ausgibt, heisst das nicht, dass es anderst gespeichert wird.
Binär wird beides genau gleich behandelt. Und das wollte er damit sagen. Und wer aus dem Grund, dass man irgendwas in einem Texteditor finden kann meint seine strings in Hex zu schreiben, der hat definiv einen an der Waffel..
Entweder man verschlüsselt das gerade anständig, oder man lässt es bleiben. Jeden, den es interessieren könnte, was in deinem Programm abläuft hat einen Hexeditor installiert und wird den auch eher öffen, als Notepad..
-
drakon schrieb:
Binär wird beides genau gleich behandelt. Und das wollte er damit sagen.
Nicht zwangsläufig. Ich habe schon Compiler erlebt, die bei A einen String aus dem Datenbereich auf den Stack kopieren (dann sieht man den String im Datenbereich natürlich als Bytefolge), bei B aber für jedes einzelne Byte eine Move-Anweisung generieren.
Und wer aus dem Grund, dass man irgendwas in einem Texteditor finden kann meint seine strings in Hex zu schreiben, der hat definiv einen an der Waffel..
Diese Ansicht teile ich dennoch uneingeschränkt.
-
LordJaxom schrieb:
drakon schrieb:
Binär wird beides genau gleich behandelt. Und das wollte er damit sagen.
Nicht zwangsläufig. Ich habe schon Compiler erlebt, die bei A einen String aus dem Datenbereich auf den Stack kopieren (dann sieht man den String im Datenbereich natürlich als Bytefolge), bei B aber für jedes einzelne Byte eine Move-Anweisung generieren.
Hmm. Interessant. Aber ja, ich habe sowieso vergessen zu sagen, dass es nicht das geringste mit C++ zu tun hat. Das ganze ist, wie du richtig sagst Implementierungsspezifisch.
-
drakon schrieb:
LordJaxom schrieb:
drakon schrieb:
Binär wird beides genau gleich behandelt. Und das wollte er damit sagen.
Nicht zwangsläufig. Ich habe schon Compiler erlebt, die bei A einen String aus dem Datenbereich auf den Stack kopieren (dann sieht man den String im Datenbereich natürlich als Bytefolge), bei B aber für jedes einzelne Byte eine Move-Anweisung generieren.
Hmm. Interessant. Aber ja, ich habe sowieso vergessen zu sagen, dass es nicht das geringste mit C++ zu tun hat. Das ganze ist, wie du richtig sagst Implementierungsspezifisch.
Das habe ich auch niemals behauptet - ansonsten trifft das, was LordJaxom sagt für die Mehrheit der Compiler zu (ich hab zumindest noch keinen gesehen, der es anders macht - aber das muss ja nichts heißen ^^)...
bb...