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