Home | History | Annotate | Download | only in vb6
      1 VERSION 1.0 CLASS
      2 BEGIN
      3   MultiUse = -1  'True
      4   Persistable = 0  'NotPersistable
      5   DataBindingBehavior = 0  'vbNone
      6   DataSourceBehavior  = 0  'vbNone
      7   MTSTransactionMode  = 0  'NotAnMTSObject
      8 END
      9 Attribute VB_Name = "CX86Inst"
     10 Attribute VB_GlobalNameSpace = False
     11 Attribute VB_Creatable = True
     12 Attribute VB_PredeclaredId = False
     13 Attribute VB_Exposed = False
     14 Option Explicit
     15 
     16 'Capstone Disassembly Engine bindings for VB6
     17 'Contributed by FireEye FLARE Team
     18 'Author:  David Zimmer <david.zimmer (a] fireeye.com>, <dzzie (a] yahoo.com>
     19 'License: Apache
     20 'Copyright: FireEye 2017
     21 
     22 
     23 '// Instruction structure  sizeof() = 432 bytes
     24 'typedef struct cs_x86 {
     25 '    // Instruction prefix, which can be up to 4 bytes.
     26 '    // A prefix byte gets value 0 when irrelevant.
     27 '    // prefix[0] indicates REP/REPNE/LOCK prefix (See X86_PREFIX_REP/REPNE/LOCK above)
     28 '    // prefix[1] indicates segment override (irrelevant for x86_64):
     29 '    // See X86_PREFIX_CS/SS/DS/ES/FS/GS above.
     30 '    // prefix[2] indicates operand-size override (X86_PREFIX_OPSIZE)
     31 '    // prefix[3] indicates address-size override (X86_PREFIX_ADDRSIZE)
     32 '    uint8_t prefix[4];
     33 '
     34 '    // Instruction opcode, wich can be from 1 to 4 bytes in size.
     35 '    // This contains VEX opcode as well.
     36 '    // An trailing opcode byte gets value 0 when irrelevant.
     37 '    uint8_t opcode[4];
     38 '
     39 '    // REX prefix: only a non-zero value is relavant for x86_64
     40 '    uint8_t rex;
     41 '
     42 '    // Address size, which can be overrided with above prefix[5].
     43 '    uint8_t addr_size;
     44 '
     45 '    // ModR/M byte
     46 '    uint8_t modrm;
     47 '
     48 '    // SIB value, or 0 when irrelevant.
     49 '    uint8_t sib;
     50 '
     51 '    // Displacement value, or 0 when irrelevant.
     52 '    int32_t disp;
     53 '
     54 '    /* SIB state */
     55 '    // SIB index register, or X86_REG_INVALID when irrelevant.
     56 '    x86_reg sib_index;
     57 '    // SIB scale. only applicable if sib_index is relavant.
     58 '    int8_t sib_scale;
     59 '    // SIB base register, or X86_REG_INVALID when irrelevant.
     60 '    x86_reg sib_base;
     61 '
     62 '    // SSE Code Condition
     63 '    x86_sse_cc sse_cc;
     64 '
     65 '    // AVX Code Condition
     66 '    x86_avx_cc avx_cc;
     67 '
     68 '    // AVX Suppress all Exception
     69 '    bool avx_sae;
     70 '
     71 '    // AVX static rounding mode
     72 '    x86_avx_rm avx_rm;
     73 '
     74 '    // Number of operands of this instruction,
     75 '    // or 0 when instruction has no operand.
     76 '    uint8_t op_count;
     77 '
     78 '    cs_x86_op operands[8];  // operands for this instruction.
     79 '} cs_x86;
     80 
     81 Private m_prefix() As Byte
     82 Private m_opcode() As Byte
     83 Public rex As Byte
     84 Public addr_size As Byte
     85 Public modrm As Byte
     86 Public sib As Byte
     87 Public disp As Long
     88 Public sib_index As x86_reg
     89 Public sib_scale As Byte
     90 Public sib_base As x86_reg
     91 Public sse_cc As x86_sse_cc
     92 Public avx_cc As x86_avx_cc
     93 Public avx_sae As Boolean
     94 Public avx_rm As x86_avx_rm
     95 Public operands As New Collection
     96 
     97 Public parent As CDisassembler
     98 Private hEngine As Long
     99 Private m_raw() As Byte
    100 
    101 Property Get prefix() As Byte()
    102     prefix = m_prefix
    103 End Property
    104 
    105 Property Get opcode() As Byte()
    106     opcode = m_opcode
    107 End Property
    108 
    109 Function toString() As String
    110     
    111     Dim r() As String
    112     Dim o As CX86Operand
    113     
    114     push r, "X86 Instruction Details:"
    115     push r, String(40, "-")
    116     
    117     If DEBUG_DUMP Then
    118         push r, "Raw: "
    119         push r, HexDump(m_raw)
    120     End If
    121     
    122     push r, "Prefix: " & b2Str(m_prefix)
    123     push r, "OpCode: " & b2Str(m_opcode)
    124     push r, "Rex: " & rex
    125     push r, "addr_size: " & addr_size
    126     push r, "modrm: " & Hex(modrm)
    127     push r, "disp: " & Hex(disp)
    128     
    129     If parent.mode <> CS_MODE_16 Then
    130         push r, "sib: " & Hex(sib)
    131         push r, "sib_index: " & regName(hEngine, sib_index)
    132         push r, "sib_scale: " & Hex(sib_scale)
    133         push r, "sib_base: " & regName(hEngine, sib_base)
    134     End If
    135     
    136     If sse_cc <> 0 Then push r, "sse_cc: " & x86_sse_cc2str(sse_cc)
    137     If avx_cc <> 0 Then push r, "avx_cc: " & x86_avx_cc2str(avx_cc)
    138     If avx_sae <> 0 Then push r, "avx_sae: " & avx_sae
    139     If avx_rm <> 0 Then push r, "avx_rm: " & x86_avx_rm2str(avx_rm)
    140     
    141     push r, "Operands: " & operands.count
    142     
    143     For Each o In operands
    144         push r, String(40, "-")
    145         push r, o.toString
    146     Next
    147     
    148     toString = Join(r, vbCrLf)
    149     
    150 End Function
    151 
    152 Friend Sub LoadDetails(lpStruct As Long, parent As CDisassembler)
    153     
    154     Dim cs As cs_x86
    155     Dim o As CX86Operand
    156     Dim ptr As Long
    157     Dim i As Long
    158     
    159     Const sizeOfx86Operand = 48
    160     
    161     Set Me.parent = parent
    162     hEngine = parent.hCapstone
    163 
    164     CopyMemory ByVal VarPtr(cs), ByVal lpStruct, LenB(cs)
    165     
    166     If DEBUG_DUMP Then
    167         ReDim m_raw(LenB(cs))
    168         CopyMemory ByVal VarPtr(m_raw(0)), ByVal lpStruct, LenB(cs)
    169     End If
    170     
    171     Me.rex = cs.rex
    172     Me.addr_size = cs.addr_size
    173     Me.modrm = cs.modrm
    174     Me.sib = cs.sib
    175     Me.disp = cs.disp
    176     Me.sib_index = cs.sib_index
    177     Me.sib_scale = cs.sib_scale
    178     Me.sib_base = cs.sib_base
    179     Me.sse_cc = cs.sse_cc
    180     Me.avx_cc = cs.avx_cc
    181     Me.avx_sae = cs.avx_sae
    182     Me.avx_rm = cs.avx_rm
    183     m_prefix = cs.prefix
    184     m_opcode = cs.opcode
    185     
    186     ptr = lpStruct + LenB(cs) 'we dont include the operands in our vb struct..
    187     For i = 1 To cs.op_count
    188         Set o = New CX86Operand
    189         o.LoadDetails ptr, hEngine
    190         operands.Add o
    191         ptr = ptr + sizeOfx86Operand
    192     Next
    193     
    194     
    195     
    196 End Sub
    197 
    198