ParseInt

Aus Thomas Wiki
Version vom 20. Oktober 2012, 21:27 Uhr von Thomas (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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;

}