ParseInt

Aus Thomas Wiki
Zur Navigation springen Zur Suche springen

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;

}