ParseInt
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;
}