ParseInt: Unterschied zwischen den Versionen

Aus Thomas Wiki
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
C-Programm zum Finden des Radix mit dem eine Datei mittels parseInt dekodiert werden kann.
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;

}