diff --git a/demo/demo.vcxproj b/demo/demo.vcxproj index 11f0783..be5e128 100644 --- a/demo/demo.vcxproj +++ b/demo/demo.vcxproj @@ -146,6 +146,9 @@ + + + diff --git a/demo/demo.vcxproj.filters b/demo/demo.vcxproj.filters index b5a0b0c..3517a40 100644 --- a/demo/demo.vcxproj.filters +++ b/demo/demo.vcxproj.filters @@ -20,4 +20,9 @@ Header Files + + + Header Files + + \ No newline at end of file diff --git a/dependencies/vmprofiler b/dependencies/vmprofiler index a419fa4..0f6ba9b 160000 --- a/dependencies/vmprofiler +++ b/dependencies/vmprofiler @@ -1 +1 @@ -Subproject commit a419fa4633f98e2f819b1119dc0884154e207482 +Subproject commit 0f6ba9bad30d67f25f01b6c1e872077efdff61d4 diff --git a/src/gen_header_template.h b/src/gen_header_template.h deleted file mode 100644 index f54d314..0000000 --- a/src/gen_header_template.h +++ /dev/null @@ -1,272 +0,0 @@ -#pragma once -#pragma section( ".xmp2" ) -#pragma comment( linker, "/section:.xmp2,RWE" ) - -namespace vm -{ - using u8 = unsigned char; - using s8 = signed char; - - using u16 = unsigned short; - using s16 = signed short; - - using u32 = unsigned int; - using s32 = signed int; - - using u64 = unsigned long long; - using s64 = signed long long; - using __vmcall_t = void *( * )( ... ); - - constexpr u8 IMAGE_DIRECTORY_ENTRY_BASERELOC = 8; - constexpr u8 IMAGE_REL_BASED_ABSOLUTE = 0; - constexpr u8 IMAGE_REL_BASED_DIR64 = 10; - - typedef struct _IMAGE_DOS_HEADER - { - /* 0x0000 */ unsigned short e_magic; - /* 0x0002 */ unsigned short e_cblp; - /* 0x0004 */ unsigned short e_cp; - /* 0x0006 */ unsigned short e_crlc; - /* 0x0008 */ unsigned short e_cparhdr; - /* 0x000a */ unsigned short e_minalloc; - /* 0x000c */ unsigned short e_maxalloc; - /* 0x000e */ unsigned short e_ss; - /* 0x0010 */ unsigned short e_sp; - /* 0x0012 */ unsigned short e_csum; - /* 0x0014 */ unsigned short e_ip; - /* 0x0016 */ unsigned short e_cs; - /* 0x0018 */ unsigned short e_lfarlc; - /* 0x001a */ unsigned short e_ovno; - /* 0x001c */ unsigned short e_res[ 4 ]; - /* 0x0024 */ unsigned short e_oemid; - /* 0x0026 */ unsigned short e_oeminfo; - /* 0x0028 */ unsigned short e_res2[ 10 ]; - /* 0x003c */ long e_lfanew; - } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER; /* size: 0x0040 */ - - typedef struct _IMAGE_FILE_HEADER - { - /* 0x0000 */ unsigned short Machine; - /* 0x0002 */ unsigned short NumberOfSections; - /* 0x0004 */ unsigned long TimeDateStamp; - /* 0x0008 */ unsigned long PointerToSymbolTable; - /* 0x000c */ unsigned long NumberOfSymbols; - /* 0x0010 */ unsigned short SizeOfOptionalHeader; - /* 0x0012 */ unsigned short Characteristics; - } IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER; /* size: 0x0014 */ - - typedef struct _IMAGE_DATA_DIRECTORY - { - /* 0x0000 */ unsigned long VirtualAddress; - /* 0x0004 */ unsigned long Size; - } IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY; /* size: 0x0008 */ - - typedef struct _IMAGE_OPTIONAL_HEADER64 - { - /* 0x0000 */ unsigned short Magic; - /* 0x0002 */ unsigned char MajorLinkerVersion; - /* 0x0003 */ unsigned char MinorLinkerVersion; - /* 0x0004 */ unsigned long SizeOfCode; - /* 0x0008 */ unsigned long SizeOfInitializedData; - /* 0x000c */ unsigned long SizeOfUninitializedData; - /* 0x0010 */ unsigned long AddressOfEntryPoint; - /* 0x0014 */ unsigned long BaseOfCode; - /* 0x0018 */ unsigned __int64 ImageBase; - /* 0x0020 */ unsigned long SectionAlignment; - /* 0x0024 */ unsigned long FileAlignment; - /* 0x0028 */ unsigned short MajorOperatingSystemVersion; - /* 0x002a */ unsigned short MinorOperatingSystemVersion; - /* 0x002c */ unsigned short MajorImageVersion; - /* 0x002e */ unsigned short MinorImageVersion; - /* 0x0030 */ unsigned short MajorSubsystemVersion; - /* 0x0032 */ unsigned short MinorSubsystemVersion; - /* 0x0034 */ unsigned long Win32VersionValue; - /* 0x0038 */ unsigned long SizeOfImage; - /* 0x003c */ unsigned long SizeOfHeaders; - /* 0x0040 */ unsigned long CheckSum; - /* 0x0044 */ unsigned short Subsystem; - /* 0x0046 */ unsigned short DllCharacteristics; - /* 0x0048 */ unsigned __int64 SizeOfStackReserve; - /* 0x0050 */ unsigned __int64 SizeOfStackCommit; - /* 0x0058 */ unsigned __int64 SizeOfHeapReserve; - /* 0x0060 */ unsigned __int64 SizeOfHeapCommit; - /* 0x0068 */ unsigned long LoaderFlags; - /* 0x006c */ unsigned long NumberOfRvaAndSizes; - /* 0x0070 */ struct _IMAGE_DATA_DIRECTORY DataDirectory[ 16 ]; - } IMAGE_OPTIONAL_HEADER64, *PIMAGE_OPTIONAL_HEADER64; /* size: 0x00f0 */ - - typedef struct _IMAGE_NT_HEADERS64 - { - /* 0x0000 */ unsigned long Signature; - /* 0x0004 */ struct _IMAGE_FILE_HEADER FileHeader; - /* 0x0018 */ struct _IMAGE_OPTIONAL_HEADER64 OptionalHeader; - } IMAGE_NT_HEADERS64, *PIMAGE_NT_HEADERS64; /* size: 0x0108 */ - - typedef struct _IMAGE_SECTION_HEADER - { - /* 0x0000 */ unsigned char Name[ 8 ]; - union - { - union - { - /* 0x0008 */ unsigned long PhysicalAddress; - /* 0x0008 */ unsigned long VirtualSize; - }; /* size: 0x0004 */ - } /* size: 0x0004 */ Misc; - /* 0x000c */ unsigned long VirtualAddress; - /* 0x0010 */ unsigned long SizeOfRawData; - /* 0x0014 */ unsigned long PointerToRawData; - /* 0x0018 */ unsigned long PointerToRelocations; - /* 0x001c */ unsigned long PointerToLinenumbers; - /* 0x0020 */ unsigned short NumberOfRelocations; - /* 0x0022 */ unsigned short NumberOfLinenumbers; - /* 0x0024 */ unsigned long Characteristics; - } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER; /* size: 0x0028 */ - - typedef struct _IMAGE_BASE_RELOCATION - { - unsigned int VirtualAddress; - unsigned int SizeOfBlock; - } IMAGE_BASE_RELOCATION, *PIMAGE_BASE_RELOCATION; - - constexpr auto entry_rva = 0x1000; - - enum class calls : u32 - { - get_world = 0xBFFD6FE9, - get_hello = 0xBFFD6FDD - }; - - template < class T, class U > struct _pair_t - { - T first; - U second; - }; - - inline _pair_t< u8, calls > call_map[ 2 ] = { { 0, calls::get_world }, { 1, calls::get_hello } }; - - struct _gen_data - { - u8 bin[ 0x100000 ]; // this will the vmp binary... - u8 map_area[ 0x10000 ]; // map the binary into this space... - - u8 __%s_vinstrs[%d] = {}; - - u8 __vmcall_shell_code[ 2 ][ 15 ] = { { - 0x68, 0xE9, 0xD6, 0xFF, 0x0B, // push xxxx - 0x68, 0xE9, 0xD6, 0xFF, 0x0B, // push xxxx - 0xE9, 0x00, 0x00, 0x00, 0x00 // jmp rip+xxxx - }, - - { - 0x68, 0xE9, 0xD6, 0xFF, 0x0B, // push xxxx - 0x68, 0xE9, 0xD6, 0xFF, 0x0B, // push xxxx - 0xE9, 0x00, 0x00, 0x00, 0x00 // jmp rip+xxxx - } }; - - bool init() - { - static const auto _memcpy = []( void *dest, const void *src, size_t len ) -> void * { - char *d = ( char * )dest; - const char *s = ( char * )src; - while ( len-- ) - *d++ = *s++; - - return dest; - }; - - const auto dos_header = reinterpret_cast< IMAGE_DOS_HEADER * >( bin ); - const auto nt_headers = reinterpret_cast< PIMAGE_NT_HEADERS64 >( bin + dos_header->e_lfanew ); - - _memcpy( map_area, bin, nt_headers->OptionalHeader.SizeOfHeaders ); - - auto sections = reinterpret_cast< PIMAGE_SECTION_HEADER >( ( u8 * )&nt_headers->OptionalHeader + - nt_headers->FileHeader.SizeOfOptionalHeader ); - - // map sections... - for ( u32 i = 0; i < nt_headers->FileHeader.NumberOfSections; ++i ) - { - PIMAGE_SECTION_HEADER section = §ions[ i ]; - - _memcpy( ( void * )( map_area + section->VirtualAddress ), - ( void * )( bin + section->PointerToRawData ), section->SizeOfRawData ); - } - - // handle relocations... - const auto reloc_dir = &nt_headers->OptionalHeader.DataDirectory[ IMAGE_DIRECTORY_ENTRY_BASERELOC ]; - - if ( reloc_dir->VirtualAddress ) - { - auto reloc = reinterpret_cast< IMAGE_BASE_RELOCATION * >( map_area + reloc_dir->VirtualAddress ); - - for ( auto current_size = 0u; current_size < reloc_dir->Size; ) - { - u32 reloc_count = ( reloc->SizeOfBlock - sizeof( IMAGE_BASE_RELOCATION ) ) / sizeof( u16 ); - u16 *reloc_data = ( u16 * )( ( u8 * )reloc + sizeof( IMAGE_BASE_RELOCATION ) ); - u8 *reloc_base = map_area + reloc->VirtualAddress; - - for ( auto idx = 0; idx < reloc_count; ++idx, ++reloc_data ) - { - u16 data = *reloc_data; - u16 type = data >> 12; - u16 offset = data & 0xFFF; - - switch ( type ) - { - case IMAGE_REL_BASED_ABSOLUTE: - break; - case IMAGE_REL_BASED_DIR64: - { - u64 *rva = ( u64 * )( reloc_base + offset ); - *rva = ( u64 )( map_area + ( *rva - nt_headers->OptionalHeader.ImageBase ) ); - break; - } - default: - break; - } - } - - current_size += reloc->SizeOfBlock; - reloc = ( IMAGE_BASE_RELOCATION * )reloc_data; - } - } - - // fix shellcode up... - for ( auto idx = 0u; idx < ( sizeof( __vmcall_shell_code ) / 15 ); ++idx ) - { - // first push encrypted rva value... - *reinterpret_cast< u32 * >( &__vmcall_shell_code[ idx ][ 1 ] ) = - static_cast< u32 >( call_map[ idx ].second ); - - // second push encrypted rva value... - *reinterpret_cast< u32 * >( &__vmcall_shell_code[ idx ][ 6 ] ) = - static_cast< u32 >( call_map[ idx ].second ); - - // signed rip relative rva to vm entry... - *reinterpret_cast< u32 * >( &__vmcall_shell_code[ idx ][ 11 ] ) = reinterpret_cast< s32 >( - ( map_area - ( reinterpret_cast< u64 >( &__vmcall_shell_code[ idx ] ) + 15 ) ) + entry_rva ); - } - - return true; // only a bool so i can use static/call init only once... - } - }; - - __declspec( allocate( ".xmp2" ) ) inline _gen_data gen_data; - - template < calls e_call, class T, class... Ts > auto call( Ts... args ) -> T - { - static auto __init_result = gen_data.init(); - - __vmcall_t vmcall = nullptr; - for ( auto idx = 0u; idx < sizeof( call_map ) / sizeof( _pair_t< u8, calls > ); ++idx ) - if ( call_map[ idx ].second == e_call ) - vmcall = reinterpret_cast< __vmcall_t >( &gen_data.__vmcall_shell_code[ idx ] ); - - return reinterpret_cast< T >( vmcall( args... ) ); - } -} // namespace vm - -int main() -{ - vm::call< vm::calls::get_hello, void * >(); -} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 501a301..cf8731d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -9,7 +9,6 @@ #include "compiler.h" #include "parser.h" #include "parser.tab.h" -#include "vmasm.hpp" #include "vmprofiler.hpp" #include "gen_code.hpp" diff --git a/src/parser.tab.cpp b/src/parser.tab.cpp index ff8b8b0..f1aac33 100644 --- a/src/parser.tab.cpp +++ b/src/parser.tab.cpp @@ -1419,7 +1419,7 @@ yyerrlab: { ++yynerrs; #if ! YYERROR_VERBOSE - yyerror (YY_((char*)"syntax error")); + yyerror (YY_("syntax error")); #else # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ yyssp, yytoken) @@ -1563,7 +1563,7 @@ yyabortlab: | yyexhaustedlab -- memory exhaustion comes here. | `-------------------------------------------------*/ yyexhaustedlab: - yyerror (YY_((char*)"memory exhausted")); + yyerror (YY_("memory exhausted")); yyresult = 2; /* Fall through. */ #endif diff --git a/src/test.vasm b/src/test.vasm deleted file mode 100644 index 15102ad..0000000 --- a/src/test.vasm +++ /dev/null @@ -1,93 +0,0 @@ -get_hello: - SREGQ 0x90 - SREGQ 0x88 - SREGQ 0x80 - SREGQ 0x78 - SREGQ 0x70 - SREGQ 0x68 - SREGQ 0x60 - SREGQ 0x58 - SREGQ 0x50 - SREGQ 0x48 - SREGQ 0x40 - SREGQ 0x38 - SREGQ 0x30 - SREGQ 0x28 - SREGQ 0x20 - SREGQ 0x18 - SREGQ 0x10 - SREGQ 0x8 - SREGQ 0x0 - - LCONSTQ 0x6F6C6C6568 - SREGQ 0x78 - SREGQ 0x0 - SREGQ 0x0 - - LREGQ 0x0 - LREGQ 0x8 - LREGQ 0x10 - LREGQ 0x18 - LREGQ 0x20 - LREGQ 0x28 - LREGQ 0x30 - LREGQ 0x38 - LREGQ 0x40 - LREGQ 0x48 - LREGQ 0x50 - LREGQ 0x58 - LREGQ 0x60 - LREGQ 0x68 - LREGQ 0x70 - LREGQ 0x78 - LREGQ 0x80 - LREGQ 0x88 - LREGQ 0x90 - VMEXIT - -get_world: - SREGQ 0x90 - SREGQ 0x88 - SREGQ 0x80 - SREGQ 0x78 - SREGQ 0x70 - SREGQ 0x68 - SREGQ 0x60 - SREGQ 0x58 - SREGQ 0x50 - SREGQ 0x48 - SREGQ 0x40 - SREGQ 0x38 - SREGQ 0x30 - SREGQ 0x28 - SREGQ 0x20 - SREGQ 0x18 - SREGQ 0x10 - SREGQ 0x8 - SREGQ 0x0 - - LCONSTQ 0x646C726F77 - SREGQ 0x78 - SREGQ 0x0 - SREGQ 0x0 - - LREGQ 0x0 - LREGQ 0x8 - LREGQ 0x10 - LREGQ 0x18 - LREGQ 0x20 - LREGQ 0x28 - LREGQ 0x30 - LREGQ 0x38 - LREGQ 0x40 - LREGQ 0x48 - LREGQ 0x50 - LREGQ 0x58 - LREGQ 0x60 - LREGQ 0x68 - LREGQ 0x70 - LREGQ 0x78 - LREGQ 0x80 - LREGQ 0x88 - LREGQ 0x90 - VMEXIT \ No newline at end of file diff --git a/src/vmasm.hpp b/src/vmasm.hpp deleted file mode 100644 index c310356..0000000 --- a/src/vmasm.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once -#include -#define VASM_MAGIC 'MSAV' - -namespace vmasm -{ - enum class version_t - { - v1 - }; - - struct file_header_t - { - std::uint32_t magic; // VASM - version_t version; - std::uint64_t epoch_time; - std::uint64_t alloc_rva; - std::uint64_t encrypted_rva; - std::uint32_t vasm_size; - std::uint32_t vasm_offset; - }; -} // namespace vmasm \ No newline at end of file diff --git a/src/vmassembler.exe b/src/vmassembler.exe deleted file mode 100644 index 340eb6e..0000000 Binary files a/src/vmassembler.exe and /dev/null differ diff --git a/src/vmassembler.vcxproj b/src/vmassembler.vcxproj index 60f4498..797bc79 100644 --- a/src/vmassembler.vcxproj +++ b/src/vmassembler.vcxproj @@ -132,11 +132,8 @@ - - - @@ -152,6 +149,9 @@ {d0b6092a-9944-4f24-9486-4b7dae372619} + + + diff --git a/src/vmassembler.vcxproj.filters b/src/vmassembler.vcxproj.filters index ce3da51..efac85d 100644 --- a/src/vmassembler.vcxproj.filters +++ b/src/vmassembler.vcxproj.filters @@ -72,9 +72,6 @@ Header Files - - Header Files - Header Files\vmprofiler\Zycore\API @@ -231,12 +228,6 @@ Header Files - - Header Files - - - Header Files - Header Files @@ -251,4 +242,9 @@ Resource Files + + + Resource Files + + \ No newline at end of file diff --git a/src/vmptest.vmp.exe b/src/vmptest.vmp.exe deleted file mode 100644 index 60c276e..0000000 Binary files a/src/vmptest.vmp.exe and /dev/null differ diff --git a/src/vmptest8.vmp.exe b/src/vmptest8.vmp.exe deleted file mode 100644 index 525e969..0000000 Binary files a/src/vmptest8.vmp.exe and /dev/null differ diff --git a/src/vmptest8.vmp.exe.i64 b/src/vmptest8.vmp.exe.i64 deleted file mode 100644 index a4bad10..0000000 Binary files a/src/vmptest8.vmp.exe.i64 and /dev/null differ diff --git a/src/vmptest9.vmp.exe b/src/vmptest9.vmp.exe deleted file mode 100644 index 37244a2..0000000 Binary files a/src/vmptest9.vmp.exe and /dev/null differ