diff --git a/.gitignore b/.gitignore
index e7693ce..473b5a4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,6 +34,9 @@ x64/
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
+# Pre-built LLVM binaries.
+llvm-15.0.3-win64/
+
*_i.c
*_p.c
*.ilk
diff --git a/Dna.Example/Program.cs b/Dna.Example/Program.cs
index 35a015d..81295d1 100644
--- a/Dna.Example/Program.cs
+++ b/Dna.Example/Program.cs
@@ -26,14 +26,14 @@ using Dna.Decompilation;
using Dna.Structuring.Stackify;
// Load the 64 bit PE file.
// Note: This file is automatically copied to the build directory.
-var path = @"ProtectedExecutable.bin";
-var binary = new WindowsBinary(64, File.ReadAllBytes(path), 0x140000000);
+var path = @"C:\Users\Public\Documents\VMProtect\Code Markers\MSVC\x64\Release\Project1.vmp.exe";
+var binary = new WindowsBinary(64, File.ReadAllBytes(path));
// Instantiate dna.
var dna = new Dna.Dna(binary);
// Parse a (virtualized) control flow graph from the binary.
-ulong funcAddr = 0x1400F2947;
+ulong funcAddr = 0x14000177E;
var cfg = dna.RecursiveDescent.ReconstructCfg(funcAddr);
// The VM entry spans across multiple routines. To avoid disassembling multiple
@@ -92,31 +92,39 @@ prompt();
var dotGraph = GraphVisualizer.GetDotGraph(liftedCfg);
File.WriteAllText("graph.dot", dotGraph.Compile(false, false));
-bool emulate = true;
-
+bool emulate = false;
if(emulate)
{
// Load the binary into unicorn engine.
var emulator = new UnicornEmulator(architecture);
- PEMapper.MapBinary(emulator, binary);
+ //PEMapper.MapBinary(emulator, binary);
ulong tebBase = 0x7fded000;
ulong tebSize = 0x10000;
emulator.MapMemory(tebBase, (int)tebSize);
- emulator.MapMemory(0, (int)tebSize);
+ //emulator.MapMemory(0, (int)tebSize);
- var igt = new GdtHelper(emulator.Emulator, 0x0, 0x1000);
- igt.Setup(tebBase);
+ //var igt = new GdtHelper(emulator.Emulator, 0x0, 0x1000);
+ //igt.Setup(tebBase);
// Setup the stack.
ulong rsp = 0x100000000;
emulator.MapMemory(rsp, 0x1000 * 1200);
rsp += 0x20000;
+ ulong pebAddr = 0x9A67F99120;
+ emulator.MapMemory(pebAddr - 0x120, 0x1000);
+ UInt16 val = 0x4A63;
+ emulator.WriteMemory(pebAddr, BitConverter.GetBytes(val));
- //emulator.MapMemory(0, 0x1000 * 10);
+ int theSize = 0x1000 * 10;
+ emulator.MapMemory(0, theSize);
+ for(int i = 0; i < theSize; i++)
+ {
+ // emulator.WriteMemory((ulong)i, new byte[] { 0xFF });
+ }
//ulong gs = 0x1000;
//emulator.MapMemory(0, 0x1000 * 1000);
//emulator.SetRegister(register_e.ID_REG_X86_GS, 0);
@@ -124,14 +132,14 @@ if(emulate)
emulator.SetRegister(register_e.ID_REG_X86_RSP, rsp);
emulator.SetRegister(register_e.ID_REG_X86_RBP, rsp);
- emulator.SetRegister(register_e.ID_REG_X86_RIP, 0x14000177E);
+ //emulator.SetRegister(register_e.ID_REG_X86_RIP, 0x14000177E);
// Execute the function.
emulator.Start(0x14000177E);
}
-Thread.Sleep(100000);
+Console.WriteLine("Started");
// Lift the control flow graph to LLVM IR.
diff --git a/Dna.LLVMInterop/Dna.LLVMInterop.vcxproj b/Dna.LLVMInterop/Dna.LLVMInterop.vcxproj
new file mode 100644
index 0000000..e906af6
--- /dev/null
+++ b/Dna.LLVMInterop/Dna.LLVMInterop.vcxproj
@@ -0,0 +1,172 @@
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+
+ 16.0
+ Win32Proj
+ {e6a58095-9b8b-4830-bfea-2947c4f2681a}
+ DnaLLVMInterop
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v143
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v143
+ true
+ Unicode
+
+
+ DynamicLibrary
+ true
+ ClangCL
+ Unicode
+
+
+ DynamicLibrary
+ false
+ ClangCL
+ true
+ Unicode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+ C:\Users\colton\source\repos\Dna\llvm-15.0.3-win64\include;$(IncludePath)
+ C:\Users\colton\source\repos\Dna\llvm-15.0.3-win64\lib;$(LibraryPath)
+
+
+ C:\Users\colton\source\repos\Dna\llvm-15.0.3-win64\include;$(IncludePath)
+ C:\Users\colton\source\repos\Dna\llvm-15.0.3-win64\lib;$(LibraryPath)
+
+
+
+ Level3
+ true
+ WIN32;_DEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ pch.h
+
+
+ Windows
+ true
+ false
+
+
+
+
+ Level3
+ true
+ true
+ true
+ WIN32;NDEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ pch.h
+
+
+ Windows
+ true
+ true
+ true
+ false
+
+
+
+
+ Level3
+ true
+ _DEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ NotUsing
+ pch.h
+ stdcpplatest
+ stdc17
+
+
+ Windows
+ DebugFastLink
+ false
+ true
+ LLVM-C.lib;LLVMAggressiveInstCombine.lib;LLVMAnalysis.lib;LLVMAsmParser.lib;LLVMAsmPrinter.lib;LLVMBinaryFormat.lib;LLVMBitReader.lib;LLVMBitstreamReader.lib;LLVMBitWriter.lib;LLVMCFGuard.lib;LLVMCFIVerify.lib;LLVMCodeGen.lib;LLVMCore.lib;LLVMCoroutines.lib;LLVMCoverage.lib;LLVMDebugInfoCodeView.lib;LLVMDebuginfod.lib;LLVMDebugInfoDWARF.lib;LLVMDebugInfoGSYM.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoPDB.lib;LLVMDemangle.lib;LLVMDiff.lib;LLVMDlltoolDriver.lib;LLVMDWARFLinker.lib;LLVMDWP.lib;LLVMExecutionEngine.lib;LLVMExegesis.lib;LLVMExegesisAArch64.lib;LLVMExegesisMips.lib;LLVMExegesisPowerPC.lib;LLVMExegesisX86.lib;LLVMExtensions.lib;LLVMFileCheck.lib;LLVMFrontendOpenACC.lib;LLVMFrontendOpenMP.lib;LLVMFuzzerCLI.lib;LLVMFuzzMutate.lib;LLVMGlobalISel.lib;LLVMInstCombine.lib;LLVMInstrumentation.lib;LLVMInterfaceStub.lib;LLVMInterpreter.lib;LLVMipo.lib;LLVMIRReader.lib;LLVMJITLink.lib;LLVMLibDriver.lib;LLVMLineEditor.lib;LLVMLinker.lib;LLVMLTO.lib;LLVMMC.lib;LLVMMCA.lib;LLVMMCDisassembler.lib;LLVMMCJIT.lib;LLVMMCParser.lib;LLVMMIRParser.lib;LLVMNVPTXCodeGen.lib;LLVMNVPTXDesc.lib;LLVMNVPTXInfo.lib;LLVMObjCARCOpts.lib;LLVMObjCopy.lib;LLVMObject.lib;LLVMObjectYAML.lib;LLVMOption.lib;LLVMOrcJIT.lib;LLVMOrcShared.lib;LLVMOrcTargetProcess.lib;LLVMPasses.lib;LLVMProfileData.lib;LLVMRemarks.lib;LLVMRuntimeDyld.lib;LLVMScalarOpts.lib;LLVMSelectionDAG.lib;LLVMSupport.lib;LLVMSymbolize.lib;LLVMSystemZAsmParser.lib;LLVMSystemZCodeGen.lib;LLVMSystemZDesc.lib;LLVMSystemZDisassembler.lib;LLVMSystemZInfo.lib;LLVMTableGen.lib;LLVMTableGenGlobalISel.lib;LLVMTarget.lib;LLVMTextAPI.lib;LLVMTransformUtils.lib;LLVMVEAsmParser.lib;LLVMVECodeGen.lib;LLVMVectorize.lib;LLVMVEDesc.lib;LLVMVEDisassembler.lib;LLVMVEInfo.lib;LLVMWindowsDriver.lib;LLVMWindowsManifest.lib;LLVMX86AsmParser.lib;LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Disassembler.lib;LLVMX86Info.lib;LLVMX86TargetMCA.lib;LLVMXCoreCodeGen.lib;LLVMXCoreDesc.lib;LLVMXCoreDisassembler.lib;LLVMXCoreInfo.lib;LLVMXRay.lib;%(AdditionalDependencies)
+
+
+
+
+ Level3
+ true
+ true
+ true
+ NDEBUG;DNALLVMINTEROP_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ NotUsing
+ pch.h
+ stdcpplatest
+ stdc17
+
+
+ Windows
+ true
+ true
+ DebugFastLink
+ false
+ LLVM-C.lib;LLVMAggressiveInstCombine.lib;LLVMAnalysis.lib;LLVMAsmParser.lib;LLVMAsmPrinter.lib;LLVMBinaryFormat.lib;LLVMBitReader.lib;LLVMBitstreamReader.lib;LLVMBitWriter.lib;LLVMCFGuard.lib;LLVMCFIVerify.lib;LLVMCodeGen.lib;LLVMCore.lib;LLVMCoroutines.lib;LLVMCoverage.lib;LLVMDebugInfoCodeView.lib;LLVMDebuginfod.lib;LLVMDebugInfoDWARF.lib;LLVMDebugInfoGSYM.lib;LLVMDebugInfoMSF.lib;LLVMDebugInfoPDB.lib;LLVMDemangle.lib;LLVMDiff.lib;LLVMDlltoolDriver.lib;LLVMDWARFLinker.lib;LLVMDWP.lib;LLVMExecutionEngine.lib;LLVMExegesis.lib;LLVMExegesisAArch64.lib;LLVMExegesisMips.lib;LLVMExegesisPowerPC.lib;LLVMExegesisX86.lib;LLVMExtensions.lib;LLVMFileCheck.lib;LLVMFrontendOpenACC.lib;LLVMFrontendOpenMP.lib;LLVMFuzzerCLI.lib;LLVMFuzzMutate.lib;LLVMGlobalISel.lib;LLVMInstCombine.lib;LLVMInstrumentation.lib;LLVMInterfaceStub.lib;LLVMInterpreter.lib;LLVMipo.lib;LLVMIRReader.lib;LLVMJITLink.lib;LLVMLibDriver.lib;LLVMLineEditor.lib;LLVMLinker.lib;LLVMLTO.lib;LLVMMC.lib;LLVMMCA.lib;LLVMMCDisassembler.lib;LLVMMCJIT.lib;LLVMMCParser.lib;LLVMMIRParser.lib;LLVMNVPTXCodeGen.lib;LLVMNVPTXDesc.lib;LLVMNVPTXInfo.lib;LLVMObjCARCOpts.lib;LLVMObjCopy.lib;LLVMObject.lib;LLVMObjectYAML.lib;LLVMOption.lib;LLVMOrcJIT.lib;LLVMOrcShared.lib;LLVMOrcTargetProcess.lib;LLVMPasses.lib;LLVMProfileData.lib;LLVMRemarks.lib;LLVMRuntimeDyld.lib;LLVMScalarOpts.lib;LLVMSelectionDAG.lib;LLVMSupport.lib;LLVMSymbolize.lib;LLVMSystemZAsmParser.lib;LLVMSystemZCodeGen.lib;LLVMSystemZDesc.lib;LLVMSystemZDisassembler.lib;LLVMSystemZInfo.lib;LLVMTableGen.lib;LLVMTableGenGlobalISel.lib;LLVMTarget.lib;LLVMTextAPI.lib;LLVMTransformUtils.lib;LLVMVEAsmParser.lib;LLVMVECodeGen.lib;LLVMVectorize.lib;LLVMVEDesc.lib;LLVMVEDisassembler.lib;LLVMVEInfo.lib;LLVMWindowsDriver.lib;LLVMWindowsManifest.lib;LLVMX86AsmParser.lib;LLVMX86CodeGen.lib;LLVMX86Desc.lib;LLVMX86Disassembler.lib;LLVMX86Info.lib;LLVMX86TargetMCA.lib;LLVMXCoreCodeGen.lib;LLVMXCoreDesc.lib;LLVMXCoreDisassembler.lib;LLVMXCoreInfo.lib;LLVMXRay.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dna.LLVMInterop/Dna.LLVMInterop.vcxproj.filters b/Dna.LLVMInterop/Dna.LLVMInterop.vcxproj.filters
new file mode 100644
index 0000000..fb1620b
--- /dev/null
+++ b/Dna.LLVMInterop/Dna.LLVMInterop.vcxproj.filters
@@ -0,0 +1,25 @@
+
+
+
+
+ Passes
+
+
+
+
+
+ Passes
+
+
+
+
+ {2aee77a2-525d-4f67-b255-9daecc2522a0}
+
+
+ {ce61e1b2-6444-4d20-b2ac-8d89cdc72726}
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Dna.LLVMInterop/Passes/ControlledNodeSplittingPass.cpp b/Dna.LLVMInterop/Passes/ControlledNodeSplittingPass.cpp
new file mode 100644
index 0000000..f62a356
--- /dev/null
+++ b/Dna.LLVMInterop/Passes/ControlledNodeSplittingPass.cpp
@@ -0,0 +1,1265 @@
+/******************************************************************************
+* Copyright (c) 2018-2023, NVIDIA CORPORATION. All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* * Redistributions of source code must retain the above copyright
+* notice, this list of conditions and the following disclaimer.
+* * Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+* * Neither the name of NVIDIA CORPORATION nor the names of its
+* contributors may be used to endorse or promote products derived
+* from this software without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include
+#include