You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
#include "Virtualizer.h"
|
|
|
|
|
|
|
|
BOOL ViCanHandleInst(PNATIVE_CODE_LINK Link)
|
|
|
|
{
|
|
|
|
switch (XedDecodedInstGetIClass(&Link->XedInstruction))
|
|
|
|
{
|
|
|
|
case XED_ICLASS_MOV: return TRUE;
|
|
|
|
}
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
BOOL ViValidateNativeCodeBlock(PVIRTUALIZER Vm, PNATIVE_CODE_BLOCK Block)
|
|
|
|
{
|
|
|
|
for (PNATIVE_CODE_LINK T = Block->Start; T && T != Block->End->Next; T = T->Next)
|
|
|
|
{
|
|
|
|
if (!ViCanHandleInst(T))
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
//Cant handle RIP relative instructions.
|
|
|
|
CONST XED_INST* Inst = XedDecodedInstInst(&T->XedInstruction);
|
|
|
|
UINT OperandCount = XedDecodedInstNumOperands(&T->XedInstruction);
|
|
|
|
for (UINT i = 0; i < OperandCount; i++)
|
|
|
|
{
|
|
|
|
XED_OPERAND_ENUM OperandName = XedOperandName(XedInstOperand(Inst, i));
|
|
|
|
|
|
|
|
if ((OperandName == XED_OPERAND_MEM0 || OperandName == XED_OPERAND_MEM1)
|
|
|
|
&& XedDecodedInstGetBaseReg(&T->XedInstruction, OperandName - XED_OPERAND_MEM0) == XED_REG_RIP)
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|