Variable "Schützen"

Hi,

Code:
struct Command{
  char Command[3];
  DWORD (*Func)(char *);
};

DWORD MSGFunc ( char * Buffer ){
}
DWORD SFTFunc ( char * Buffer ){
}
DWORD CMDFunc ( char * Buffer ){
}


Command cArray [] = {  { "MSG" , MSGFunc },// Schwachstelle
                       { "SFT" , SFTFunc },
                       { "CMD" , CMDFunc } };


class MHandler{
  DWORD ProcessMessage(char * );
};

DWORD MHandler::ProcessMessage(char * Buffer ){
  DWORD RetV = NULL;
  for ( int i = 0; i < sizeof(cArray)/sizeof(Command); i++){
    if ( !strncmp(Buffer,cArray[i].Command,3) )RetV = cArray[i].Func(Buffer);
  }
return RetV;
}

Also ich denke mal das das sehr einfach zu cracken währe und ich möchte das natürlich möglichst vermeiden und dabei die funktionalität erhalten.Gäbe es denn bei so einer verwendung überhaupt eine möglichkeit die Variablen die in Func stehen davor zu schützen verändert zu werden?

Sagen wir mal ich mache das Array jetzt Konstant, ändert das ürgentwas im Assembler Code?
 
Bei Konstantendeklarierung wäre wohl das höchste der Gefühle, dass der Compiler/Linker das ganze in eine Readonly Section verschiebt (und während der compilierung darauf achtet, dass sonst nirgendwo schreibend im Code darauf zugegriffen wird).
Das einzige, was mir einfällt: bei der Eingabe die Strings hashen und mit (Integer ;) ) Hashs arbeiten.
Später im Code die Hash entweder zu Adressen der Funktionen oder (falls unbekannt) zu Adresse einer Dummyfunktion übersetzen (braucht man wiederum auch eine Tabelle dafür, aber zumindest stehen da nur Zahlen - die sind nicht auf einen Blick zu entdecken).

Beim Aufrufen verzichtet man dann auf eine IF Abfgrage sondern führt das einfach aus (unbekannte Eingaben landen eben in der Dummyfunktion).
Wenn man nun die Eingabe und die Ausführung weit genug auseinander legt, ist es zumindest nicht mehr ganz so einfach ersichtlich.

Bsp:
Code:
myInput=readInput:
hash=crc32(myInput); //bei CRC sollte es bei solch kurzen Kommandos eigentlich keine Kollisionen geben - sonst ein komplizierteres Hashverfahren nehmen
...
//Hashtableklasse sollte bei unbekannten Hashs eine Dummyadresse liefern
adress=Hashtable.get(hash);
...
call adress; 
...
 
Zurück
Oben