hackedteam/core-win32

View on GitHub
HM_CodeAlign.cpp

Summary

Maintainability
Test Coverage
#include "HM_CodeAlign.h"

int table_1[] = { 
    C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , C_PREFIX             
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , C_PREFIX             
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , C_PREFIX             
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATAW0             
    , C_DATAW0             
    , C_PREFIX             
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_PREFIX             
    , C_PREFIX             
    , C_PREFIX+C_66        
    , C_PREFIX+C_67        
    , C_DATA66             
    , C_MODRM+C_DATA66     
    , C_DATA1              
    , C_MODRM+C_DATA1      
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_MODRM+C_DATA1      
    , C_MODRM+C_DATA66     
    , C_MODRM+C_DATA1      
    , C_MODRM+C_DATA1      
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_DATA66+C_MEM2      
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_MEM67              
    , C_MEM67              
    , C_MEM67              
    , C_MEM67              
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_DATA1              
    , C_DATA66             
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA66             
    , C_DATA66             
    , C_DATA66             
    , C_DATA66             
    , C_DATA66             
    , C_DATA66             
    , C_DATA66             
    , C_DATA66             
    , C_MODRM+C_DATA1      
    , C_MODRM+C_DATA1      
    , C_DATA2              
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM+C_DATA1      
    , C_MODRM+C_DATA66     
    , C_DATA2+C_DATA1      
    , 0                    
    , C_DATA2              
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATA1              
    , C_DATA1              
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_MODRM              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA1              
    , C_DATA66             
    , C_DATA66             
    , C_DATA66+C_MEM2      
    , C_DATA1              
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_PREFIX             
    , 0                    
    , C_PREFIX             
    , C_PREFIX             
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , 0                    
    , C_MODRM              
    , C_MODRM};              

    int table_0F[]= {                
        C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , -1                   
        , -1                   
        , 0                    
        , -1                   
        , 0                    
        , 0                    
        , 0                    
        , 0                    
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_DATA66             
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , 0                    
        , 0                    
        , 0                    
        , C_MODRM              
        , C_MODRM+C_DATA1      
        , C_MODRM              
        , -1                   
        , -1                   
        , 0                    
        , 0                    
        , 0                    
        , C_MODRM              
        , C_MODRM+C_DATA1      
        , C_MODRM              
        , -1                   
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , -1                   
        , -1                   
        , C_MODRM+C_DATA1      
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , C_MODRM              
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , 0                    
        , 0                    
        , 0                    
        , 0                    
        , 0                    
        , 0                    
        , 0                    
        , 0                    
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1                   
        , -1};       

int HM_sCodeAlign(PBYTE Opcode)
{
    int ret_value;

    __asm {
            mov     ecx, [Opcode]    // ECX = opcode ptr
    
            xor     edx, edx         // flags
            xor     eax, eax

prefix:     and     dl, not XC_PREFIX

            mov     al, [ecx]
            inc     ecx

            or      edx, table_1[eax*4]

            test    dl, XC_PREFIX
            jnz     prefix

            cmp     al, 0F6h
            je      jtest
            cmp     al, 0F7h
            je      jtest

            cmp     al, 0CDh
            je      jint

            cmp     al, 0Fh
            je      jOF
cont:
            test    dh, XC_DATAW0 shr 8
            jnz     dataw0
dataw0done:
            test    dh, XC_MODRM shr 8
            jnz     modrm
exitmodrm:
            test    dl, XC_MEM67
            jnz     mem67
mem67done:
            test    dh, XC_DATA66 shr 8
            jnz     data66
data66done:
            mov     eax, ecx
            sub     eax, [Opcode]

            and     edx, XC_MEM1+XC_MEM2+XC_MEM4+XC_DATA1+XC_DATA2+XC_DATA4
            add     al, dl
            add     al, dh

            jmp        Oexit

jtest:      or      dh, XC_MODRM shr 8
            test    byte ptr [ecx], 00111000b 
            jnz     cont
            or      dh, XC_DATAW0 shr 8
            jmp     cont

jint:       or      dh, XC_DATA1 shr 8
            cmp     byte ptr [ecx], 20h
            jne     cont
            or      dh, XC_DATA4 shr 8
            jmp     cont

jOF:        mov     al, [ecx]
            inc     ecx
            or      edx, table_0F[eax*4]

            cmp     edx, -1
            jne     cont

            ;error:                    
            mov     eax, edx
            jmp     Oexit

dataw0:     xor     dh, XC_DATA66 shr 8
            test    al, 00000001b
            jnz     dataw0done
            xor     dh, (XC_DATA66+XC_DATA1) shr 8
            jmp     dataw0done

mem67:         xor     dl, XC_MEM2
            test    dl, XC_67
            jnz     mem67done
            xor     dl, XC_MEM4+XC_MEM2
            jmp     mem67done

data66:        xor     dh, XC_DATA2 shr 8
            test    dh, XC_66 shr 8
            jnz     data66done
            xor     dh, (XC_DATA4+XC_DATA2) shr 8
            jmp     data66done

modrm:         mov     al, [ecx]
            inc     ecx

            mov     ah, al  // ah=mod, al=rm

            and     ax, 0C007h
            cmp     ah, 0C0h
            je      exitmodrm

            test    dl, XC_67
            jnz     modrm16

            //modrm32:                  
            cmp     al, 04h
            jne     a

            mov     al, [ecx]       // sib
            inc     ecx
            and     al, 07h

a:             cmp     ah, 40h
            je      mem1
            cmp     ah, 80h
            je      mem4

            cmp     ax, 0005h
            jne     exitmodrm

mem4:       or      dl, XC_MEM4
            jmp     exitmodrm

mem1:       or      dl, XC_MEM1
            jmp     exitmodrm

modrm16:    cmp     ax, 0006h
            je      mem2
            cmp     ah, 40h
            je      mem1
            cmp     ah, 80h
            jne     exitmodrm

mem2:         or      dl, XC_MEM2
            jmp     exitmodrm

Oexit:
            mov        [ret_value], eax
    };

    return ret_value;
}