Thema: .NET schutz
Einzelnen Beitrag anzeigen
Alt 26.06.09, 18:11   #13 (permalink)
CDW
Moderator
 
Benutzerbild von CDW
 
Registriert seit: 20.07.05
CDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: OpteronCDW Leistung: Opteron
Likes: 198
Standard

Zitat:
1. Bei deinem Beispiel des Interprets, woran erkennt man denn 2 Opcodes-Anweisungen?
Naja, "hardcodierung"
Man entwirft ja zuerst den Befehlsatz - und da überlegt man sich, ob die Anweidung einen oder zwei Opcodes haben soll.
Das erste ist immer eine Anweisungs(ID) und das zweite dann je nach dem - Adresse, Variable usw.
Wenn man den Interpreter umsetzt, schaut man sich den eigenen Entwurf an .
Code:
 IF (Opcode1=JMP)
bei JMP muss man ja logischerweise noch ein Ziel haben und sollte daher 2 Opcodes nutzen.

zu
Zitat:
2. Wenn ich das richtig erkenne nutz du das Data-Array als Wert übergabe, also die Werte mit denen gerechnet werden soll?
korrekt. Ist problematisch mit Beispielen in Pseudocode, da manche Sachen in einigen Sprachen etwas total anders bedeuten.
Gemeint ist hier sowas wie in C:
Code:
#define VAR1 0
#define VAR2 1
also dass der Compiler statt der Konstanten bitte selbstständig die Nummerwerte im Code nutzen soll.
Die Variablennummer wird wie erwähnt (bei der einfachsten implementierung) als Indexwert für das Array genutzt.
Du kannst natürlich auch alle Werte im Codearray haben - musst nur dann beim Schreiben des "ASMCodes" aufpassen und Platz freilassen. Oder auch direkt vom Interpreter aus in "normale" Variablen schreiben.

Zitat:
Wozu soll den der "ILOAD" gut sein?
Ich werde mir jetzt mal so ein Teil bauen, das Grund gerüst steht schon.
Wie gross sollte den ein Befehlsatz ca. sein?
ILOAD - Integer Load. D.h der Interpreter soll das nächste Opcode nicht als Variablenindex sondern als eigenständigen Wert betrachten. Damit kann man dann in seinem "ASM Code" auf einfache Weise Konstanten laden. Ist mir halt erst beim schreiben des letzen Bsp. eingefallen.
wäre sowas:
Code:
Else IF (opcode1==Load)
  {
     int index=opcode2;
     int wert=data[index];
     Stack.push(wert);
    IP=IP+2;  //ist eine 2-Opcodes Anweidung
  }
Else IF (opcode1==ILoad)
  {
     int wert=opcode2;
     Stack.push(wert);
    IP=IP+2;  //ist eine 2-Opcodes Anweidung
  }

Wie groß der Befehlssatz sein soll - ehrlich gesagt, keine Ahnung
Aber ich meine, größtenteils alle nötigen Befehle schon abgedeckt zu haben. Du kannst gerne noch nach MIC1 Befehlssatz suchen (damit habe ich Stackmachines gelernt und die Befehlsnamen stammen auch aus dem Raum).
http://www.ontko.com/mic1/ijvm.conf
damit sollte man so ziemlich alles was umsetzen können. Wobei Du eher auf die eigenen Bedürfnisse achten solltest (die VM ist ja notfalls leicht erweiterbar).
Naja, beachten sollte man dann noch, dass NET eventuell die Konstantennamen "schlauerweise" beibehält - also unbedingt mal prüfen. Und dass Du nach der Testfase den Interpreter ein bisschen "manuell" Obfuscatest - sprich statt
Code:
IF (opcode1==ADD)
  {
     int var1=Stack.pop;
     int var2=Stack.pop;
    int result=var1+var2;
    Stack.push(result);   
    IP=IP+1; //da es nur eine 1-Opcode Anweisung war, InstrucitonPointer nur um 1 weiterbewegen 
  }
eher sowas
Code:
IF (opcode1==ADD)
  {
     int var1=Stack.pop;
     int var2=Stack.pop;
     String junk=var1.toString;
     int junk2=junk[i]&var2;
    Stack.push(junk2);
    ...junk...
    junk[y]=var2*junk2;
    Stack.pop;
    ... usw...
    int result=var1+var2;
    Stack.push(result);   
    IP=IP+1; //da es nur eine 1-Opcode Anweisung war, InstrucitonPointer nur um 1 weiterbewegen 
  }
hast. Also ein bisschen verschleiern.

Eventuell lohnt es sich auch einen "ASM Code2Array" Übersetzer zu schreiben. Vor allem weil man dann Labels nutzen kann und nicht manuell die Elemente abzählen muss.
__________________
Noch mal, für alle Pseudo-Geeks: 1+1=0. -> 10 wäre Überlauf!
Selig, wer nichts zu sagen hat und trotzdem schweigt.
CDW ist offline   Mit Zitat antworten
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61