ParseInt
Zur Navigation springen
Zur Suche springen
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; }