HM_CodeAlign.cpp
#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;
}