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 |
||
Zeile 1: | Zeile 1: | ||
C-Programm zum Finden des Radix | C-Programm zum Finden des Radix mit dem eine Datei mittels parseInt dekodiert werden kann. | ||
Annahme die höchste Ziffer wird mindestens einmal in der Datei verwendet. | Annahme: die höchste Ziffer wird mindestens einmal in der Datei verwendet. | ||
Version vom 20. Oktober 2012, 21:22 Uhr
C-Programm zum Finden des Radix mit dem eine Datei mittels parseInt dekodiert werden kann.
Annahme: die höchste Ziffer wird mindestens einmal in der Datei verwendet.
/* (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; }