ParseInt: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Thomas (Diskussion | Beiträge) (Erste Version des Programms) |
Thomas (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
Programme zum Finden des Radix, mit dem eine Datei mittels parseInt dekodiert werden kann, und das entsprechende Dekodierprogramm. | |||
Annahme die höchste Ziffer wird mindestens einmal in der Datei verwendet. | Annahme: die höchste Ziffer wird mindestens einmal in der Datei verwendet. | ||
== Finden des Radix == | |||
Programm : piradix | |||
<pre> | <pre> | ||
Zeile 100: | Zeile 103: | ||
} | } | ||
</pre> | |||
== Dekodieren einer Datei == | |||
Programm: charbyte2tochar | |||
<pre> | |||
/* (c) 2012 by Thomas Arend, 2012/10/20 | |||
* | |||
* | |||
* Zweck: Mit "parseInt" kodierte Datei dekodieren | |||
* Parameter: Radix für die Funktion parseInt | |||
* Input: parseInt kodiertes File | |||
* Output: dekodiertes File | |||
* | |||
* Das Toolkit Blackhole kodiert ein JavaScript | |||
* in den Parametern eines html-Tags derart, dass immer | |||
* zwei Zeichen mittels parseInt in ein neues Zeichen | |||
* umgewandelt werden. Der Radix des Aufrufes von parseInt | |||
* ist im dekodierenden Script obfuskiert. | |||
* Um dieses Script nicht analysieren zu müssen, wird der Radix | |||
* aus dem Input "erraten" und als Parameter übergeben. | |||
* | |||
* Hier ist grundsätzlich nur ein Raten möglich, weil | |||
* die höchste Ziffer nicht im Input enthalten sein muss. | |||
* | |||
* Dass die höchste Ziffer nicht genutz wird, ist in einem größeren | |||
* JavaScript sehr unwahrscheinlich, da der Bereich sinnvoller Zeichen | |||
* zwischen 16 und 36 liegt und damit mehrere Zeichen eine Kodierung | |||
* mit der höchsten Endziffer aufweisen werden. | |||
* $Id: $ | |||
* $Log:$ | |||
*/ | |||
#include <stdlib.h> | |||
#include <stdio.h> | |||
#include <string> | |||
using namespace std; | |||
int zifftoint ( int ziffer ){ | |||
if ('0' <= ziffer && ziffer <= '9') | |||
return (ziffer - '0'); | |||
else if ('a' <= ziffer && ziffer <= 'z' ) | |||
return (ziffer -'a' + 10); | |||
else | |||
return 255; | |||
} | |||
int char2toint ( int z1, int z2, int radix) { | |||
return (zifftoint(z1) * radix + zifftoint(z2)) ; | |||
} | |||
int main ( int argc, char *argv[ ]) | |||
{ | |||
int zeichen1 = 0; | |||
int zeichen2 = 0 ; | |||
int code = 0; | |||
int radix = 16 ; | |||
if (argc > 1 ) { | |||
radix = atoi(argv[1]); | |||
} | |||
else { | |||
radix = 16; | |||
} | |||
while (( zeichen1 = getchar()) != EOF ) { | |||
if ( (zeichen2 = getchar()) == EOF ) break; | |||
code = char2toint ( zeichen1, zeichen2, radix ); | |||
if ( code < 256 ) { | |||
putchar(code); | |||
} else { | |||
putchar(code >> 8); | |||
putchar(code & 256); | |||
} | |||
} | |||
printf ( "\n" ) ; | |||
return 0; | |||
} | |||
</pre> | </pre> |
Aktuelle Version vom 20. Oktober 2012, 21:27 Uhr
Programme zum Finden des Radix, mit dem eine Datei mittels parseInt dekodiert werden kann, und das entsprechende Dekodierprogramm.
Annahme: die höchste Ziffer wird mindestens einmal in der Datei verwendet.
Finden des Radix
Programm : piradix
/* (c) 2012 by Thomas Arend, 2012/10/20 * Zweck: Bestimmen des Radix für aus einer mit parseInt dekodierbaren Datei * Annahme: Die höchste Ziffer wurde in der Datei genutz * Input: parseInt kodiertes File * Output: wahrscheinlicher Radix zur Funktion parseInt * Return: 0 * Return: > 0 Anzahl unzulässiger Zeichen 0x0a wird als zulässig angesehen. * Das Toolkit Blackhole kodiert ein JavaScript * in den Parametern eines html-Tags derart, dass immer * zwei Zeichen mittels parseInt in ein neues Zeichen * umgewandelt werden. Der Radix des Aufrufes von parseInt * ist im dekodierenden Script obfuskiert. * Um dieses Script nicht analysieren zu müssen, wird der Radix * aus dem Input "erraten" und als Parameter übergeben. * * Hier ist grundsätzlich nur ein Raten möglich, weil * die höchste Ziffer nicht im Input enthalten sein muss. * * Dass die höchste Ziffer nicht genutz wird, ist in einem größeren * JavaScript sehr unwahrscheinlich, da der Bereich sinnvoller Zeichen * zwischen 16 und 36 liegt und damit mehrere Zeichen eine Kodierung * mit der höchsten Endziffer aufweisen werden. * * $Id: $ * $Log:$ */ #include <stdlib.h> #include <stdio.h> #include <string> using namespace std; int validziffer (int ziffer ) { if ('0' <= ziffer && ziffer <= '9') return 1 ; else if ('a' <= ziffer && ziffer <= 'z' ) return 1; else if ( ziffer == 10 ) return 1; else return 0; } int maxziffer (int ziffer ) { if ('0' <= ziffer && ziffer <= '9') return (ziffer - '0'); else if ('a' <= ziffer && ziffer <= 'z' ) return (ziffer -'a' + 10); else return 255; } int main ( int argc, char *argv[ ]) { int zeichen = 0; int radix = 0; int genutzt [256] = {0} ; int dirty = 0; int isdirty = 0; // Zählen aller Zeichen while (( zeichen = getchar()) != EOF ) { genutzt[zeichen]++; } // Suchen des größten genutzten Zeichens for ( zeichen = 255 ; ( zeichen > 0) && (genutzt[zeichen] == 0); zeichen-- ) {} // Ausdruck des wahrscheinlichen Radix radix = maxziffer (zeichen) + 1; printf ( "%d\n" , radix ); // Prüfen, ob der Input nur aus den zulässigen Zeichen 0-9, a-z // besteht. isdirty = 0; for ( dirty = 1 ; dirty < 256 ; dirty++) { if ( !validziffer(dirty) && genutzt[dirty] ) { isdirty++; } } // Ausdrucken des Radix für parseInt return isdirty; }
Dekodieren einer Datei
Programm: charbyte2tochar
/* (c) 2012 by Thomas Arend, 2012/10/20 * * * Zweck: Mit "parseInt" kodierte Datei dekodieren * Parameter: Radix für die Funktion parseInt * Input: parseInt kodiertes File * Output: dekodiertes File * * Das Toolkit Blackhole kodiert ein JavaScript * in den Parametern eines html-Tags derart, dass immer * zwei Zeichen mittels parseInt in ein neues Zeichen * umgewandelt werden. Der Radix des Aufrufes von parseInt * ist im dekodierenden Script obfuskiert. * Um dieses Script nicht analysieren zu müssen, wird der Radix * aus dem Input "erraten" und als Parameter übergeben. * * Hier ist grundsätzlich nur ein Raten möglich, weil * die höchste Ziffer nicht im Input enthalten sein muss. * * Dass die höchste Ziffer nicht genutz wird, ist in einem größeren * JavaScript sehr unwahrscheinlich, da der Bereich sinnvoller Zeichen * zwischen 16 und 36 liegt und damit mehrere Zeichen eine Kodierung * mit der höchsten Endziffer aufweisen werden. * $Id: $ * $Log:$ */ #include <stdlib.h> #include <stdio.h> #include <string> using namespace std; int zifftoint ( int ziffer ){ if ('0' <= ziffer && ziffer <= '9') return (ziffer - '0'); else if ('a' <= ziffer && ziffer <= 'z' ) return (ziffer -'a' + 10); else return 255; } int char2toint ( int z1, int z2, int radix) { return (zifftoint(z1) * radix + zifftoint(z2)) ; } int main ( int argc, char *argv[ ]) { int zeichen1 = 0; int zeichen2 = 0 ; int code = 0; int radix = 16 ; if (argc > 1 ) { radix = atoi(argv[1]); } else { radix = 16; } while (( zeichen1 = getchar()) != EOF ) { if ( (zeichen2 = getchar()) == EOF ) break; code = char2toint ( zeichen1, zeichen2, radix ); if ( code < 256 ) { putchar(code); } else { putchar(code >> 8); putchar(code & 256); } } printf ( "\n" ) ; return 0; }