Sructures

  • Hallo alle miteinander,
    Meine Frage diesmal handelt von Structures in Structures falls mann das so nennen kann.

    Ich habe follgende beiden Structure (Nur ein Auszug)

    Spoiler anzeigen
    [autoit]

    $DisasmStruct = DllStructCreate("UInt_Ptr EIP;" & _
    "UInt64 VirtualAddr;" & _
    "UInt_Ptr SecurityBlock;" & _
    "char CompleteInstr[INSTRUCT_LENGTH];" & _
    "UInt Archi;" & _
    "UInt64 Options;" & _
    "INSTRTYPE Instruction;" & _
    "ARGTYPE Argument1;" & _
    "ARGTYPE Argument2;" & _
    "ARGTYPE Argument3;" & _
    "PREFIXINFO Prefix;" & _
    "UInt Reserved_[40];")
    If @error Then MsgBox(0,"1",@error)

    [/autoit] [autoit][/autoit] [autoit]

    $InstType = DllStructCreate("Int Category;" & _
    "Int Opcode;" & _
    "char Mnemonic[16];" & _
    "Int BranchType;" & _
    "EFLStruct Flags;" & _
    "UInt64 AddrValue;" & _
    "Int64 Immediat;" & _
    "UInt ImplicitModifiedRegs;")
    If @error Then MsgBox(0,"2",@error)

    [/autoit]

    Wie ihr seht spuckt die obere Msgbox immer den Fehler 2 aus. logisch, da Autoit nur keine Datentypen wie INSTRTYPE o.ä annimmt.
    Gibt es dennoch einen Weg das zu lösen.

    MFG Omasgehstock

  • Mir ist grade is diesem EIn lösungsansatz gekommen, mann muss dem autoit Compiler/ interpreter nur klarmachen, dass er genau soviel Byte reservieren soll wie die andere Structure groß ist, aber wie macht mann das??

    • Offizieller Beitrag

    Du kannst nur die Typen verwenden, die Autoit auch zuläßt (s. Hilfe zu DllStructureCreate - oder mein Tut). Du mußt also Datentypen aufbröseln, bis sie in Autoit abgebildet werden können.
    INSTRTYPE sieht ja so aus:
    struct INSTRTYPE {
    long Category;
    long Opcode;
    char Mnemonic[16];
    long BranchType;
    EFLStruct Flags;
    long long AddrValue;
    long long Immediat;
    long ImplicitModifiedRegs;
    };
    Da mußt du dann noch EFLStruct zerlegen:
    struct EFLStruct {
    BYTE OF_;
    BYTE SF_;
    BYTE ZF_;
    BYTE AF_;
    BYTE PF_;
    BYTE CF_;
    BYTE TF_;
    BYTE IF_;
    BYTE DF_;
    BYTE NT_;
    BYTE RF_;
    BYTE alignment;
    };
    ;)

    • Offizieller Beitrag

    Aber ich verstehe nicht ganz was du meins autoit versteht serwohl datentypen wie UINT oder INT, UINT64. warum soll ich dann alles in long unändern.

    Sollst du nicht ändern, ich habe einfach die Struktur, wie gefunden, kopiert.

    Und kann ich so die EFLStruct in die INSTRTYPE -Struct ablegen.??

    Das geht so:

    [autoit]

    $tEFLStruct = DllStructCreate( _
    'BYTE OF_;' & _
    'BYTE SF_;' & _
    'BYTE ZF_;' & _
    'BYTE AF_;' & _
    'BYTE PF_;' & _
    'BYTE CF_;' & _
    'BYTE TF_;' & _
    'BYTE IF_;' & _
    'BYTE DF_;' & _
    'BYTE NT_;' & _
    'BYTE RF_;' & _
    'BYTE alignment;')
    $pEFLStruct = DllStructGetPtr($tEFLStruct)

    [/autoit][autoit][/autoit][autoit]

    $tINSTRTYPE = DllStructCreate( _
    'long Category;' & _
    'long Opcode;' & _
    'char Mnemonic[16];' & _
    'long BranchType;' & _
    $pEFLStruct & ';' & _
    'long AddrValue;' & _
    'long Immediat;' & _
    'long ImplicitModifiedRegs;')

    [/autoit]
  • SOrry da hab ich dich wohl falsch verstanden.

    Aber das ist genau as wonach ich gesucht habe thx

  • Ich hab hier auch noch was:

    Spoiler anzeigen
    [autoit]


    ; ProgAndy
    Func _SubStruct_GetSize($tagSUBSTRUCT)
    Return DllStructGetSize(DllStructCreate($tagSUBSTRUCT, 1))
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ProgAndy
    Func _SubStruct_Get(ByRef $tSTRUCT, $vElement, Const $tagSUBSTRUCT)
    Local $pTarget = DllStructGetPtr($tSTRUCT, $vElement)
    If @error Or $pTarget = 0 Then Return SetError(1,0,0)
    Local $tSUBSTRUCT = DllStructCreate($tagSUBSTRUCT, $pTarget)
    If @error Then Return SetError(2,@error, 0)
    Return $tSUBSTRUCT
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    ; ProgAndy
    Func _SubStruct_Declare($tagSUBSTRUCT, $sName="")
    If $sName = "" Then Return "byte[" & _SubStruct_GetSize($tagSUBSTRUCT) & "];"
    Return "byte " & $sName & "[" & _SubStruct_GetSize($tagSUBSTRUCT) & "];"
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Global Const $INSTRUCT_LENGTH = 64

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $tagREX_Struct = "align 1;" " & _
    "BYTE W_; " & _
    "BYTE R_; " & _
    "BYTE X_; " & _
    "BYTE B_; " & _
    "BYTE state; "

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $tagPREFIXINFO = "align 1;" & _
    "int Number; " & _
    "int NbUndefined; " & _
    "BYTE LockPrefix; " & _
    "BYTE OperandSize; " & _
    "BYTE AddressSize; " & _
    "BYTE RepnePrefix; " & _
    "BYTE RepPrefix; " & _
    "BYTE FSPrefix; " & _
    "BYTE SSPrefix; " & _
    "BYTE GSPrefix; " & _
    "BYTE ESPrefix; " & _
    "BYTE CSPrefix; " & _
    "BYTE DSPrefix; " & _
    _SubStruct_Declare( $tagREX_Struct, "REX")

    [/autoit] [autoit][/autoit] [autoit]

    ...

    [/autoit] [autoit][/autoit] [autoit]

    Global Const $tagDISASM = "align 1;" & _
    "int64 EIP;" & _
    "int64 VirtualAddr;" & _
    "long SecurityBlock;" & _
    "char CompleteInstr["&$INSTRUCT_LENGTH&"];" & _
    "long Archi; " & _
    "long Options;" & _
    _SubStruct_Declare($tagINSTRTYPE, "Instruction") & _
    _SubStruct_Declare($tagARGTYPE, "Argument1") & _
    _SubStruct_Declare($tagARGTYPE, "Argument2") & _
    _SubStruct_Declare($tagARGTYPE, "Argument3") & _
    _SubStruct_Declare($tagPREFIXINFO, "Prefix")

    [/autoit] [autoit][/autoit] [autoit]

    ...

    [/autoit] [autoit][/autoit] [autoit]

    $struct = dllstructcreate($tagDISASM)
    ...
    $tPrefix = _SubStruct_Get($struct, "Prefix", $tagPREFIXINFO)
    ...
    $OperandSize = DllstructGetData($tPrefix, "OperandSize")

    [/autoit] [autoit][/autoit] [autoit][/autoit]