parent
7f1f0ce8e9
commit
68fc208612
@ -0,0 +1,42 @@
|
|||||||
|
# Prerequisites
|
||||||
|
*.d
|
||||||
|
|
||||||
|
# Compiled Object files
|
||||||
|
*.slo
|
||||||
|
*.lo
|
||||||
|
*.o
|
||||||
|
*.obj
|
||||||
|
|
||||||
|
# Precompiled Headers
|
||||||
|
*.gch
|
||||||
|
*.pch
|
||||||
|
|
||||||
|
# Compiled Dynamic libraries
|
||||||
|
*.so
|
||||||
|
*.dylib
|
||||||
|
*.dll
|
||||||
|
|
||||||
|
# Fortran module files
|
||||||
|
*.mod
|
||||||
|
*.smod
|
||||||
|
|
||||||
|
# Compiled Static libraries
|
||||||
|
*.lai
|
||||||
|
*.la
|
||||||
|
*.a
|
||||||
|
*.lib
|
||||||
|
|
||||||
|
# Executables
|
||||||
|
*.exe
|
||||||
|
*.out
|
||||||
|
*.app
|
||||||
|
*.pdb
|
||||||
|
*.ipch
|
||||||
|
*.db
|
||||||
|
|
||||||
|
.vs/
|
||||||
|
*.log
|
||||||
|
*.tlog
|
||||||
|
*.ipdb
|
||||||
|
*.iobj
|
||||||
|
*.idb
|
@ -0,0 +1,6 @@
|
|||||||
|
#ifndef __CODE_H
|
||||||
|
#define __CODE_H
|
||||||
|
|
||||||
|
#define CODE_FLAG_IS_LABEL (1<<0)
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,167 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<VCProjectVersion>16.0</VCProjectVersion>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectGuid>{bc5c8c97-fcb6-41a5-bfa0-56cb98491ca9}</ProjectGuid>
|
||||||
|
<RootNamespace>CodeVirtualizer</RootNamespace>
|
||||||
|
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
<SpectreMitigation>false</SpectreMitigation>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v142</PlatformToolset>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
<SpectreMitigation>false</SpectreMitigation>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="Shared">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
|
<AdditionalIncludeDirectories>C:\%24Fanta\IntelXED\build\obj\wkit\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>C:\%24Fanta\IntelXED\build\obj\wkit\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>xed.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<SDLCheck>true</SDLCheck>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<ConformanceMode>true</ConformanceMode>
|
||||||
|
<LanguageStandard>stdcpp17</LanguageStandard>
|
||||||
|
<AdditionalIncludeDirectories>C:\%24Fanta\IntelXED\build\obj\wkit\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalLibraryDirectories>C:\%24Fanta\IntelXED\build\obj\wkit\lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||||||
|
<AdditionalDependencies>xed.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="NativeCode.cpp" />
|
||||||
|
<ClCompile Include="Main.cpp" />
|
||||||
|
<ClCompile Include="VmCode.cpp" />
|
||||||
|
<ClCompile Include="XedWrap.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="Code.h" />
|
||||||
|
<ClInclude Include="NativeCode.h" />
|
||||||
|
<ClInclude Include="VmCode.h" />
|
||||||
|
<ClInclude Include="Windas.h" />
|
||||||
|
<ClInclude Include="XedWrap.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
@ -0,0 +1,38 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="XedWrap.h">
|
||||||
|
<Filter>Xed</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Windas.h" />
|
||||||
|
<ClInclude Include="NativeCode.h">
|
||||||
|
<Filter>Code</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="VmCode.h">
|
||||||
|
<Filter>Code</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="Code.h">
|
||||||
|
<Filter>Code</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="Main.cpp" />
|
||||||
|
<ClCompile Include="XedWrap.cpp">
|
||||||
|
<Filter>Xed</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="NativeCode.cpp">
|
||||||
|
<Filter>Code</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="VmCode.cpp">
|
||||||
|
<Filter>Code</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="Xed">
|
||||||
|
<UniqueIdentifier>{955537e1-9169-4285-a7e9-1b388418e92f}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="Code">
|
||||||
|
<UniqueIdentifier>{d8c41b5b-3520-4266-a1bc-30bb628752d9}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup />
|
||||||
|
</Project>
|
@ -0,0 +1,14 @@
|
|||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "NativeCode.h"
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
|
||||||
|
//PNATIVE_CODE_LINK temp = new NATIVE_CODE_LINK("Hello");
|
||||||
|
system("pause");
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,174 @@
|
|||||||
|
#include "NativeCode.h"
|
||||||
|
|
||||||
|
_NATIVE_CODE_LINK::_NATIVE_CODE_LINK()
|
||||||
|
{
|
||||||
|
XedDecodedInstZero(&XedInst);
|
||||||
|
XedDecodedInstSetMode(&XedInst, XED_MACHINE_MODE_LONG_64, XED_ADDRESS_WIDTH_64b);
|
||||||
|
Flags = 0;
|
||||||
|
Next = Prev = NULL;
|
||||||
|
Label = 0;
|
||||||
|
RawData = NULL;
|
||||||
|
RawDataSize = 0UL;
|
||||||
|
}
|
||||||
|
|
||||||
|
_NATIVE_CODE_LINK::_NATIVE_CODE_LINK(ULONG LabelId)
|
||||||
|
: _NATIVE_CODE_LINK()
|
||||||
|
{
|
||||||
|
Label = LabelId;
|
||||||
|
Flags = CODE_FLAG_IS_LABEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcInsertLinkAfter(PNATIVE_CODE_LINK Link1, PNATIVE_CODE_LINK Link2)
|
||||||
|
{
|
||||||
|
if (Link1)
|
||||||
|
{
|
||||||
|
Link2->Prev = Link1;
|
||||||
|
Link2->Next = Link1->Next;
|
||||||
|
Link1->Next = Link2;
|
||||||
|
if (Link2->Next)
|
||||||
|
Link2->Next->Prev = Link2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcInsertLinkBefore(PNATIVE_CODE_LINK Link1, PNATIVE_CODE_LINK Link2)
|
||||||
|
{
|
||||||
|
if (Link1)
|
||||||
|
{
|
||||||
|
Link2->Next = Link1;
|
||||||
|
Link2->Prev = Link1->Prev;
|
||||||
|
Link1->Prev = Link2;
|
||||||
|
if (Link2->Prev)
|
||||||
|
Link2->Prev->Next = Link2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcUnlink(PNATIVE_CODE_LINK Link)
|
||||||
|
{
|
||||||
|
if (Link)
|
||||||
|
{
|
||||||
|
if (Link->Next)
|
||||||
|
Link->Next->Prev = Link->Prev;
|
||||||
|
if (Link->Prev)
|
||||||
|
Link->Prev->Next = Link->Next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcConcat(PNATIVE_CODE_BLOCK Block1, PNATIVE_CODE_BLOCK Block2)
|
||||||
|
{
|
||||||
|
//Cant simply concatinate blocks here, need to go through the second block and
|
||||||
|
//update the label names so that there are no conflicts between the two blocks
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcInsertBlockAfter(PNATIVE_CODE_LINK Link, PNATIVE_CODE_BLOCK Block)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcInsertBlockBfore(PNATIVE_CODE_LINK Link, PNATIVE_CODE_BLOCK Block)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL NcCreateLabels(PNATIVE_CODE_BLOCK Block)
|
||||||
|
{
|
||||||
|
ULONG CurrentLabelId = 0;
|
||||||
|
for (PNATIVE_CODE_LINK T = Block->Start; T; T = T->Next)
|
||||||
|
{
|
||||||
|
XED_CATEGORY_ENUM Category = XedDecodedInstGetCategory(&T->XedInst);
|
||||||
|
|
||||||
|
if (Category != XED_CATEGORY_COND_BR && Category != XED_CATEGORY_UNCOND_BR)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
ULONG OperandCount = XedDecodedInstNumOperands(&T->XedInst);
|
||||||
|
if (OperandCount < 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CONST XED_INST* Inst = XedDecodedInstInst(&T->XedInst);
|
||||||
|
if (!Inst)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
CONST XED_OPERAND* Operand = XedInstOperand(Inst, 0);
|
||||||
|
if (!Operand)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
XED_OPERAND_TYPE_ENUM OperandType = XedOperandType(Operand);
|
||||||
|
if (OperandType != XED_OPERAND_TYPE_IMM && OperandType != XED_OPERAND_TYPE_IMM_CONST)
|
||||||
|
{
|
||||||
|
printf("Found jump to non immediate value. Cat: %s\n", XedCategoryEnumToString(Category));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
INT32 BranchDisplacement = XedDecodedInstGetBranchDisplacement(&T->XedInst);
|
||||||
|
PNATIVE_CODE_LINK JmpPos = NcValidateJmp(T, BranchDisplacement);
|
||||||
|
if (!JmpPos)
|
||||||
|
{
|
||||||
|
printf("Failed to validate jump. Type: %s, Displacement: %d", XedCategoryEnumToString(Category), BranchDisplacement);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JmpPos->Prev && (JmpPos->Prev->Flags & CODE_FLAG_IS_LABEL))
|
||||||
|
{
|
||||||
|
T->Label = JmpPos->Prev->Label;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NcInsertLinkBefore(JmpPos, new NATIVE_CODE_LINK(CurrentLabelId++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PNATIVE_CODE_LINK NcValidateJmp(PNATIVE_CODE_LINK Jmp, INT32 Delta)
|
||||||
|
{
|
||||||
|
if (Delta < 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
else if (Delta > 0)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL NcFromBuffer(PNATIVE_CODE_BLOCK Block, PVOID Buffer, ULONG BufferSize)
|
||||||
|
{
|
||||||
|
Block->Start = new NATIVE_CODE_LINK;
|
||||||
|
Block->End = Block->Start;
|
||||||
|
|
||||||
|
PUCHAR Buf = (PUCHAR)Buffer;
|
||||||
|
ULONG Offset = 0;
|
||||||
|
|
||||||
|
while (Offset < BufferSize)
|
||||||
|
{
|
||||||
|
PNATIVE_CODE_LINK Link = new NATIVE_CODE_LINK;
|
||||||
|
ULONG PossibleSize = min(15, BufferSize - Offset);
|
||||||
|
|
||||||
|
XED_ERROR_ENUM DecodeError = XedDecode(&Link->XedInst, (Buf + Offset), PossibleSize);
|
||||||
|
if (DecodeError != XED_ERROR_NONE)
|
||||||
|
{
|
||||||
|
printf("XedDecode failed with error %s\n", XedErrorEnumToString(DecodeError));
|
||||||
|
NcDelete(Block);
|
||||||
|
delete Link;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Link->Prev = Block->End;
|
||||||
|
Block->End->Next = Link;
|
||||||
|
Block->End = Link;
|
||||||
|
}
|
||||||
|
|
||||||
|
PNATIVE_CODE_LINK StartLink = Block->Start;
|
||||||
|
Block->Start = Block->Start->Next;
|
||||||
|
delete StartLink;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
VOID NcDelete(PNATIVE_CODE_BLOCK Block)
|
||||||
|
{
|
||||||
|
for (PNATIVE_CODE_LINK T = Block->Start; T;)
|
||||||
|
{
|
||||||
|
PNATIVE_CODE_LINK Next = T->Next;
|
||||||
|
delete T;
|
||||||
|
T = Next;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
#ifndef __NATIVE_CODE_H
|
||||||
|
#define __NATIVE_CODE_H
|
||||||
|
|
||||||
|
#include "Windas.h"
|
||||||
|
#include "XedWrap.h"
|
||||||
|
#include "Code.h"
|
||||||
|
|
||||||
|
typedef struct _NATIVE_CODE_LINK
|
||||||
|
{
|
||||||
|
_NATIVE_CODE_LINK* Next;
|
||||||
|
_NATIVE_CODE_LINK* Prev;
|
||||||
|
|
||||||
|
ULONG Flags;
|
||||||
|
ULONG Label;
|
||||||
|
PUCHAR RawData;
|
||||||
|
ULONG RawDataSize;
|
||||||
|
XED_DECODED_INST XedInst;
|
||||||
|
_NATIVE_CODE_LINK();
|
||||||
|
_NATIVE_CODE_LINK(ULONG LabelId);
|
||||||
|
}NATIVE_CODE_LINK, *PNATIVE_CODE_LINK;
|
||||||
|
|
||||||
|
typedef struct _NATIVE_CODE_BLOCK
|
||||||
|
{
|
||||||
|
PNATIVE_CODE_LINK Start;
|
||||||
|
PNATIVE_CODE_LINK End;
|
||||||
|
}NATIVE_CODE_BLOCK, * PNATIVE_CODE_BLOCK;
|
||||||
|
|
||||||
|
VOID NcInsertLinkAfter(PNATIVE_CODE_LINK Link1, PNATIVE_CODE_LINK Link2);
|
||||||
|
|
||||||
|
VOID NcInsertLinkBefore(PNATIVE_CODE_LINK Link1, PNATIVE_CODE_LINK Link2);
|
||||||
|
|
||||||
|
VOID NcUnlink(PNATIVE_CODE_LINK Link);
|
||||||
|
|
||||||
|
VOID NcConcat(PNATIVE_CODE_BLOCK Block1, PNATIVE_CODE_BLOCK Block2);
|
||||||
|
|
||||||
|
VOID NcInsertBlockAfter(PNATIVE_CODE_LINK Link, PNATIVE_CODE_BLOCK Block);
|
||||||
|
|
||||||
|
VOID NcInsertBlockBfore(PNATIVE_CODE_LINK Link, PNATIVE_CODE_BLOCK Block);
|
||||||
|
|
||||||
|
BOOL NcCreateLabels(PNATIVE_CODE_BLOCK Block);
|
||||||
|
|
||||||
|
PNATIVE_CODE_LINK NcValidateJmp(PNATIVE_CODE_LINK Link, INT32 Delta);
|
||||||
|
|
||||||
|
BOOL NcFromBuffer(PNATIVE_CODE_BLOCK Block, PVOID Buffer, ULONG BufferSize);
|
||||||
|
|
||||||
|
VOID NcDelete(PNATIVE_CODE_BLOCK Block);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1 @@
|
|||||||
|
#include "VmCode.h"
|
@ -0,0 +1,8 @@
|
|||||||
|
#ifndef __VM_CODE_H
|
||||||
|
#define __VM_CODE_H
|
||||||
|
|
||||||
|
#include "Windas.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,13 @@
|
|||||||
|
#ifndef __WINDAS_H
|
||||||
|
#define __WINDAS_H
|
||||||
|
|
||||||
|
#include <Windows.h>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#define INLINE inline
|
||||||
|
#define STDSTRING std::string
|
||||||
|
#define STDVECTOR std::vector
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,6 @@
|
|||||||
|
#include "XedWrap.h"
|
||||||
|
|
||||||
|
VOID InitXed()
|
||||||
|
{
|
||||||
|
xed_tables_init();
|
||||||
|
}
|
@ -0,0 +1,39 @@
|
|||||||
|
#ifndef __XED_WRAPPER_H
|
||||||
|
#define __XED_WRAPPER_H
|
||||||
|
|
||||||
|
#include "Windas.h"
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#include <xed/xed-interface.h>
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
VOID InitXed();
|
||||||
|
|
||||||
|
#define XED_DECODED_INST xed_decoded_inst_t
|
||||||
|
#define XED_INST xed_inst_t
|
||||||
|
#define XED_OPERAND xed_operand_t
|
||||||
|
|
||||||
|
#define XED_OPERAND_TYPE_ENUM xed_operand_type_enum_t
|
||||||
|
#define XED_ERROR_ENUM xed_error_enum_t
|
||||||
|
#define XED_CATEGORY_ENUM xed_category_enum_t
|
||||||
|
|
||||||
|
#define XedDecodedInstZero xed_decoded_inst_zero
|
||||||
|
#define XedDecodedInstSetMode xed_decoded_inst_set_mode
|
||||||
|
#define XedDecode xed_decode
|
||||||
|
#define XedDecodedInstGetLength xed_decoded_inst_get_length
|
||||||
|
#define XedDecodedInstGetCategory xed_decoded_inst_get_category
|
||||||
|
#define XedDecodedInstGetBranchDisplacementWidth xed_decoded_inst_get_branch_displacement_width
|
||||||
|
#define XedDecodedInstGetBranchDisplacement xed_decoded_inst_get_branch_displacement
|
||||||
|
#define XedDecodedInstInst xed_decoded_inst_inst
|
||||||
|
#define XedDecodedInstNumOperands xed_decoded_inst_noperands
|
||||||
|
|
||||||
|
#define XedInstOperand xed_inst_operand
|
||||||
|
|
||||||
|
#define XedOperandType xed_operand_type
|
||||||
|
|
||||||
|
#define XedErrorEnumToString xed_error_enum_t2str
|
||||||
|
#define XedCategoryEnumToString xed_category_enum_t2str
|
||||||
|
|
||||||
|
#endif
|
@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project>
|
||||||
|
<ProjectOutputs>C:\$Fanta\code-virtualizer\x64\Release\CodeVirtualizer.exe</ProjectOutputs>
|
||||||
|
<ContentFiles></ContentFiles>
|
||||||
|
<SatelliteDlls></SatelliteDlls>
|
||||||
|
<NonRecipeFileRefs></NonRecipeFileRefs>
|
||||||
|
</Project>
|
Loading…
Reference in new issue