mirror of
https://github.com/NaC-L/Mergen.git
synced 2026-05-12 09:40:34 +00:00
Fixed one crash issue, added another
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
# cmkr
|
||||
/**/CMakeLists.txt linguist-generated
|
||||
/**/cmkr.cmake linguist-vendored
|
||||
# Zydis
|
||||
/**/Zydis/Zydis.c linguist-vendored
|
||||
/**/Zydis/Zydis.h linguist-vendored
|
||||
+6
-2
@@ -14,5 +14,9 @@
|
||||
*.iobj
|
||||
*\x64*
|
||||
*.exe*
|
||||
*.sln
|
||||
*vcxproj*
|
||||
|
||||
# cmkr
|
||||
build*/
|
||||
cmake-build*/
|
||||
CMakerLists.txt
|
||||
CMakeLists.txt.user
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
[submodule "linux-pe"]
|
||||
path = linux-pe
|
||||
url = https://github.com/can1357/linux-pe
|
||||
Generated
+98
@@ -0,0 +1,98 @@
|
||||
# This file is automatically generated from cmake.toml - DO NOT EDIT
|
||||
# See https://github.com/build-cpp/cmkr for more information
|
||||
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
if(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
||||
message(FATAL_ERROR "In-tree builds are not supported. Run CMake from a separate directory: cmake -B build")
|
||||
endif()
|
||||
|
||||
set(CMKR_ROOT_PROJECT OFF)
|
||||
|
||||
# Variables
|
||||
set(CMAKE_MODULE_PATH cmake)
|
||||
|
||||
project(Mergen)
|
||||
|
||||
# Packages
|
||||
find_package(LLVM REQUIRED)
|
||||
include_directories(${LLVM_INCLUDE_DIRS})
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address")
|
||||
set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -g -fsanitize=address")
|
||||
|
||||
# Subdirectory: linux-pe
|
||||
set(CMKR_CMAKE_FOLDER ${CMAKE_FOLDER})
|
||||
if(CMAKE_FOLDER)
|
||||
set(CMAKE_FOLDER "${CMAKE_FOLDER}/linux-pe")
|
||||
else()
|
||||
set(CMAKE_FOLDER linux-pe)
|
||||
endif()
|
||||
add_subdirectory(linux-pe)
|
||||
set(CMAKE_FOLDER ${CMKR_CMAKE_FOLDER})
|
||||
|
||||
# Target: Zydis
|
||||
set(Zydis_SOURCES
|
||||
"Zydis-4.1.0/Zydis/Zydis.c"
|
||||
"Zydis-4.1.0/Zydis/Zydis.h"
|
||||
cmake.toml
|
||||
)
|
||||
|
||||
add_library(Zydis STATIC)
|
||||
|
||||
target_sources(Zydis PRIVATE ${Zydis_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${Zydis_SOURCES})
|
||||
|
||||
add_library(Zydis::Zydis ALIAS Zydis)
|
||||
target_compile_definitions(Zydis PUBLIC
|
||||
ZYCORE_STATIC_BUILD
|
||||
ZYDIS_STATIC_BUILD
|
||||
)
|
||||
|
||||
target_include_directories(Zydis PUBLIC
|
||||
Zydis-4.1.0
|
||||
)
|
||||
|
||||
target_include_directories(Zydis PRIVATE
|
||||
"Zydis-4.1.0/Zydis"
|
||||
)
|
||||
|
||||
# Target: lifter
|
||||
set(lifter_SOURCES
|
||||
"lifter/CustomPasses.cpp"
|
||||
"lifter/LLVM-init.cpp"
|
||||
"lifter/OperandUtils.cpp"
|
||||
"lifter/ROPdetection.cpp"
|
||||
"lifter/Semantics.cpp"
|
||||
"lifter/lifter.cpp"
|
||||
"lifter/nacibaba_opts.cpp"
|
||||
"lifter/utils.cpp"
|
||||
"lifter/CustomPasses.h"
|
||||
"lifter/LLVM-init.h"
|
||||
"lifter/OperandUtils.h"
|
||||
"lifter/ROPdetection.h"
|
||||
"lifter/Semantics.h"
|
||||
"lifter/includes.h"
|
||||
"lifter/nacibaba_opts.h"
|
||||
"lifter/utils.h"
|
||||
cmake.toml
|
||||
)
|
||||
|
||||
add_executable(lifter)
|
||||
|
||||
target_sources(lifter PRIVATE ${lifter_SOURCES})
|
||||
source_group(TREE ${CMAKE_CURRENT_SOURCE_DIR} FILES ${lifter_SOURCES})
|
||||
|
||||
target_compile_features(lifter PRIVATE
|
||||
cxx_std_20
|
||||
)
|
||||
|
||||
target_link_libraries(lifter PRIVATE
|
||||
Zydis::Zydis
|
||||
LLVM
|
||||
linux-pe
|
||||
)
|
||||
|
||||
get_directory_property(CMKR_VS_STARTUP_PROJECT DIRECTORY ${PROJECT_SOURCE_DIR} DEFINITION VS_STARTUP_PROJECT)
|
||||
if(NOT CMKR_VS_STARTUP_PROJECT)
|
||||
set_property(DIRECTORY ${PROJECT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT lifter)
|
||||
endif()
|
||||
Vendored
+54990
File diff suppressed because one or more lines are too long
Vendored
+12113
File diff suppressed because it is too large
Load Diff
+29
@@ -0,0 +1,29 @@
|
||||
[cmake]
|
||||
version = "3.16"
|
||||
cmkr-include = "cmake/cmkr.cmake"
|
||||
|
||||
[project]
|
||||
name = "Mergen"
|
||||
|
||||
[variables]
|
||||
CMAKE_MODULE_PATH = "cmake"
|
||||
|
||||
[find-package.LLVM]
|
||||
|
||||
[subdir.linux-pe]
|
||||
|
||||
[target.Zydis]
|
||||
type = "static"
|
||||
alias = "Zydis::Zydis"
|
||||
sources = ["Zydis-4.1.0/Zydis/Zydis.c"]
|
||||
headers = ["Zydis-4.1.0/Zydis/Zydis.h"]
|
||||
include-directories = ["Zydis-4.1.0"]
|
||||
private-include-directories = ["Zydis-4.1.0/Zydis"]
|
||||
compile-definitions = ["ZYCORE_STATIC_BUILD", "ZYDIS_STATIC_BUILD"]
|
||||
|
||||
[target.lifter]
|
||||
type = "executable"
|
||||
sources = ["lifter/*.cpp"]
|
||||
headers = ["lifter/*.h"]
|
||||
link-libraries = ["Zydis::Zydis", "LLVM", "linux-pe"]
|
||||
compile-features = ["cxx_std_20"]
|
||||
@@ -1,65 +0,0 @@
|
||||
################################################################################
|
||||
# Command for variable_watch. This command issues error message, if a variable
|
||||
# is changed. If variable PROPERTY_READER_GUARD_DISABLED is TRUE nothing happens
|
||||
# variable_watch(<variable> property_reader_guard)
|
||||
################################################################################
|
||||
function(property_reader_guard VARIABLE ACCESS VALUE CURRENT_LIST_FILE STACK)
|
||||
if("${PROPERTY_READER_GUARD_DISABLED}")
|
||||
return()
|
||||
endif()
|
||||
|
||||
if("${ACCESS}" STREQUAL "MODIFIED_ACCESS")
|
||||
message(FATAL_ERROR
|
||||
" Variable ${VARIABLE} is not supposed to be changed.\n"
|
||||
" It is used only for reading target property ${VARIABLE}.\n"
|
||||
" Use\n"
|
||||
" set_target_properties(\"<target>\" PROPERTIES \"${VARIABLE}\" \"<value>\")\n"
|
||||
" or\n"
|
||||
" set_target_properties(\"<target>\" PROPERTIES \"${VARIABLE}_<CONFIG>\" \"<value>\")\n"
|
||||
" instead.\n")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
# Create variable <name> with generator expression that expands to value of
|
||||
# target property <name>_<CONFIG>. If property is empty or not set then property
|
||||
# <name> is used instead. Variable <name> has watcher property_reader_guard that
|
||||
# doesn't allow to edit it.
|
||||
# create_property_reader(<name>)
|
||||
# Input:
|
||||
# name - Name of watched property and output variable
|
||||
################################################################################
|
||||
function(create_property_reader NAME)
|
||||
set(PROPERTY_READER_GUARD_DISABLED TRUE)
|
||||
set(CONFIG_VALUE "$<TARGET_GENEX_EVAL:${PROPS_TARGET},$<TARGET_PROPERTY:${PROPS_TARGET},${NAME}_$<UPPER_CASE:$<CONFIG>>>>")
|
||||
set(IS_CONFIG_VALUE_EMPTY "$<STREQUAL:${CONFIG_VALUE},>")
|
||||
set(GENERAL_VALUE "$<TARGET_GENEX_EVAL:${PROPS_TARGET},$<TARGET_PROPERTY:${PROPS_TARGET},${NAME}>>")
|
||||
set("${NAME}" "$<IF:${IS_CONFIG_VALUE_EMPTY},${GENERAL_VALUE},${CONFIG_VALUE}>" PARENT_SCOPE)
|
||||
variable_watch("${NAME}" property_reader_guard)
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
# Set property $<name>_${PROPS_CONFIG_U} of ${PROPS_TARGET} to <value>
|
||||
# set_config_specific_property(<name> <value>)
|
||||
# Input:
|
||||
# name - Prefix of property name
|
||||
# value - New value
|
||||
################################################################################
|
||||
function(set_config_specific_property NAME VALUE)
|
||||
set_target_properties("${PROPS_TARGET}" PROPERTIES "${NAME}_${PROPS_CONFIG_U}" "${VALUE}")
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
|
||||
create_property_reader("TARGET_NAME")
|
||||
create_property_reader("OUTPUT_DIRECTORY")
|
||||
|
||||
set_config_specific_property("TARGET_NAME" "${PROPS_TARGET}")
|
||||
set_config_specific_property("OUTPUT_NAME" "${TARGET_NAME}")
|
||||
set_config_specific_property("ARCHIVE_OUTPUT_NAME" "${TARGET_NAME}")
|
||||
set_config_specific_property("LIBRARY_OUTPUT_NAME" "${TARGET_NAME}")
|
||||
set_config_specific_property("RUNTIME_OUTPUT_NAME" "${TARGET_NAME}")
|
||||
|
||||
set_config_specific_property("ARCHIVE_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}")
|
||||
set_config_specific_property("LIBRARY_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}")
|
||||
set_config_specific_property("RUNTIME_OUTPUT_DIRECTORY" "${OUTPUT_DIRECTORY}")
|
||||
@@ -1,12 +0,0 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/Default.cmake")
|
||||
|
||||
set_config_specific_property("OUTPUT_DIRECTORY" "${CMAKE_SOURCE_DIR}$<$<NOT:$<STREQUAL:${CMAKE_VS_PLATFORM_NAME},Win32>>:/${CMAKE_VS_PLATFORM_NAME}>/${PROPS_CONFIG}")
|
||||
|
||||
if(MSVC)
|
||||
create_property_reader("DEFAULT_CXX_EXCEPTION_HANDLING")
|
||||
create_property_reader("DEFAULT_CXX_DEBUG_INFORMATION_FORMAT")
|
||||
|
||||
set_target_properties("${PROPS_TARGET}" PROPERTIES MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
|
||||
set_config_specific_property("DEFAULT_CXX_EXCEPTION_HANDLING" "/EHsc")
|
||||
set_config_specific_property("DEFAULT_CXX_DEBUG_INFORMATION_FORMAT" "/Zi")
|
||||
endif()
|
||||
@@ -1,12 +0,0 @@
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/Default.cmake")
|
||||
|
||||
set_config_specific_property("OUTPUT_DIRECTORY" "${CMAKE_CURRENT_SOURCE_DIR}$<$<NOT:$<STREQUAL:${CMAKE_VS_PLATFORM_NAME},Win32>>:/${CMAKE_VS_PLATFORM_NAME}>/${PROPS_CONFIG}")
|
||||
|
||||
get_target_property(${PROPS_TARGET}_BINARY_DIR ${PROPS_TARGET} BINARY_DIR)
|
||||
set(DEFAULT_FORTRAN_MODULES_DIR "${${PROPS_TARGET}_BINARY_DIR}/${PROPS_TARGET}.Modules.dir")
|
||||
set_target_properties(${PROPS_TARGET} PROPERTIES Fortran_MODULE_DIRECTORY ${DEFAULT_FORTRAN_MODULES_DIR})
|
||||
|
||||
if(${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
||||
# Hack for visual studio generator (https://gitlab.kitware.com/cmake/cmake/issues/19552)
|
||||
add_custom_command(TARGET ${PROPS_TARGET} PRE_BUILD COMMAND ${CMAKE_COMMAND} -E make_directory $<TARGET_PROPERTY:${PROPS_TARGET},Fortran_MODULE_DIRECTORY>/${CMAKE_CFG_INTDIR})
|
||||
endif()
|
||||
@@ -1,234 +0,0 @@
|
||||
# utils file for projects came from visual studio solution with cmake-converter.
|
||||
|
||||
################################################################################
|
||||
# Wrap each token of the command with condition
|
||||
################################################################################
|
||||
cmake_policy(PUSH)
|
||||
cmake_policy(SET CMP0054 NEW)
|
||||
macro(prepare_commands)
|
||||
unset(TOKEN_ROLE)
|
||||
unset(COMMANDS)
|
||||
foreach(TOKEN ${ARG_COMMANDS})
|
||||
if("${TOKEN}" STREQUAL "COMMAND")
|
||||
set(TOKEN_ROLE "KEYWORD")
|
||||
elseif("${TOKEN_ROLE}" STREQUAL "KEYWORD")
|
||||
set(TOKEN_ROLE "CONDITION")
|
||||
elseif("${TOKEN_ROLE}" STREQUAL "CONDITION")
|
||||
set(TOKEN_ROLE "COMMAND")
|
||||
elseif("${TOKEN_ROLE}" STREQUAL "COMMAND")
|
||||
set(TOKEN_ROLE "ARG")
|
||||
endif()
|
||||
|
||||
if("${TOKEN_ROLE}" STREQUAL "KEYWORD")
|
||||
list(APPEND COMMANDS "${TOKEN}")
|
||||
elseif("${TOKEN_ROLE}" STREQUAL "CONDITION")
|
||||
set(CONDITION ${TOKEN})
|
||||
elseif("${TOKEN_ROLE}" STREQUAL "COMMAND")
|
||||
list(APPEND COMMANDS "$<$<NOT:${CONDITION}>:${DUMMY}>$<${CONDITION}:${TOKEN}>")
|
||||
elseif("${TOKEN_ROLE}" STREQUAL "ARG")
|
||||
list(APPEND COMMANDS "$<${CONDITION}:${TOKEN}>")
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
cmake_policy(POP)
|
||||
|
||||
################################################################################
|
||||
# Transform all the tokens to absolute paths
|
||||
################################################################################
|
||||
macro(prepare_output)
|
||||
unset(OUTPUT)
|
||||
foreach(TOKEN ${ARG_OUTPUT})
|
||||
if(IS_ABSOLUTE ${TOKEN})
|
||||
list(APPEND OUTPUT "${TOKEN}")
|
||||
else()
|
||||
list(APPEND OUTPUT "${CMAKE_CURRENT_SOURCE_DIR}/${TOKEN}")
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
################################################################################
|
||||
# Parse add_custom_command_if args.
|
||||
#
|
||||
# Input:
|
||||
# PRE_BUILD - Pre build event option
|
||||
# PRE_LINK - Pre link event option
|
||||
# POST_BUILD - Post build event option
|
||||
# TARGET - Target
|
||||
# OUTPUT - List of output files
|
||||
# DEPENDS - List of files on which the command depends
|
||||
# COMMANDS - List of commands(COMMAND condition1 commannd1 args1 COMMAND
|
||||
# condition2 commannd2 args2 ...)
|
||||
# Output:
|
||||
# OUTPUT - Output files
|
||||
# DEPENDS - Files on which the command depends
|
||||
# COMMENT - Comment
|
||||
# PRE_BUILD - TRUE/FALSE
|
||||
# PRE_LINK - TRUE/FALSE
|
||||
# POST_BUILD - TRUE/FALSE
|
||||
# TARGET - Target name
|
||||
# COMMANDS - Prepared commands(every token is wrapped in CONDITION)
|
||||
# NAME - Unique name for custom target
|
||||
# STEP - PRE_BUILD/PRE_LINK/POST_BUILD
|
||||
################################################################################
|
||||
function(add_custom_command_if_parse_arguments)
|
||||
cmake_parse_arguments("ARG" "PRE_BUILD;PRE_LINK;POST_BUILD" "TARGET;COMMENT" "DEPENDS;OUTPUT;COMMANDS" ${ARGN})
|
||||
|
||||
if(WIN32)
|
||||
set(DUMMY "cd.")
|
||||
elseif(UNIX)
|
||||
set(DUMMY "true")
|
||||
endif()
|
||||
|
||||
prepare_commands()
|
||||
prepare_output()
|
||||
|
||||
set(DEPENDS "${ARG_DEPENDS}")
|
||||
set(COMMENT "${ARG_COMMENT}")
|
||||
set(PRE_BUILD "${ARG_PRE_BUILD}")
|
||||
set(PRE_LINK "${ARG_PRE_LINK}")
|
||||
set(POST_BUILD "${ARG_POST_BUILD}")
|
||||
set(TARGET "${ARG_TARGET}")
|
||||
if(PRE_BUILD)
|
||||
set(STEP "PRE_BUILD")
|
||||
elseif(PRE_LINK)
|
||||
set(STEP "PRE_LINK")
|
||||
elseif(POST_BUILD)
|
||||
set(STEP "POST_BUILD")
|
||||
endif()
|
||||
set(NAME "${TARGET}_${STEP}")
|
||||
|
||||
set(OUTPUT "${OUTPUT}" PARENT_SCOPE)
|
||||
set(DEPENDS "${DEPENDS}" PARENT_SCOPE)
|
||||
set(COMMENT "${COMMENT}" PARENT_SCOPE)
|
||||
set(PRE_BUILD "${PRE_BUILD}" PARENT_SCOPE)
|
||||
set(PRE_LINK "${PRE_LINK}" PARENT_SCOPE)
|
||||
set(POST_BUILD "${POST_BUILD}" PARENT_SCOPE)
|
||||
set(TARGET "${TARGET}" PARENT_SCOPE)
|
||||
set(COMMANDS "${COMMANDS}" PARENT_SCOPE)
|
||||
set(STEP "${STEP}" PARENT_SCOPE)
|
||||
set(NAME "${NAME}" PARENT_SCOPE)
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
# Add conditional custom command
|
||||
#
|
||||
# Generating Files
|
||||
# The first signature is for adding a custom command to produce an output:
|
||||
# add_custom_command_if(
|
||||
# <OUTPUT output1 [output2 ...]>
|
||||
# <COMMANDS>
|
||||
# <COMMAND condition command1 [args1...]>
|
||||
# [COMMAND condition command2 [args2...]]
|
||||
# [DEPENDS [depends...]]
|
||||
# [COMMENT comment]
|
||||
#
|
||||
# Build Events
|
||||
# add_custom_command_if(
|
||||
# <TARGET target>
|
||||
# <PRE_BUILD | PRE_LINK | POST_BUILD>
|
||||
# <COMMAND condition command1 [args1...]>
|
||||
# [COMMAND condition command2 [args2...]]
|
||||
# [COMMENT comment]
|
||||
#
|
||||
# Input:
|
||||
# output - Output files the command is expected to produce
|
||||
# condition - Generator expression for wrapping the command
|
||||
# command - Command-line(s) to execute at build time.
|
||||
# args - Command`s args
|
||||
# depends - Files on which the command depends
|
||||
# comment - Display the given message before the commands are executed at
|
||||
# build time.
|
||||
# PRE_BUILD - Run before any other rules are executed within the target
|
||||
# PRE_LINK - Run after sources have been compiled but before linking the
|
||||
# binary
|
||||
# POST_BUILD - Run after all other rules within the target have been
|
||||
# executed
|
||||
################################################################################
|
||||
function(add_custom_command_if)
|
||||
add_custom_command_if_parse_arguments(${ARGN})
|
||||
|
||||
if(OUTPUT AND TARGET)
|
||||
message(FATAL_ERROR "Wrong syntax. A TARGET and OUTPUT can not both be specified.")
|
||||
endif()
|
||||
|
||||
if(OUTPUT)
|
||||
add_custom_command(OUTPUT ${OUTPUT}
|
||||
${COMMANDS}
|
||||
DEPENDS ${DEPENDS}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMENT ${COMMENT})
|
||||
elseif(TARGET)
|
||||
if(PRE_BUILD AND NOT ${CMAKE_GENERATOR} MATCHES "Visual Studio")
|
||||
add_custom_target(
|
||||
${NAME}
|
||||
${COMMANDS}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMENT ${COMMENT})
|
||||
add_dependencies(${TARGET} ${NAME})
|
||||
else()
|
||||
add_custom_command(
|
||||
TARGET ${TARGET}
|
||||
${STEP}
|
||||
${COMMANDS}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||
COMMENT ${COMMENT})
|
||||
endif()
|
||||
else()
|
||||
message(FATAL_ERROR "Wrong syntax. A TARGET or OUTPUT must be specified.")
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
# Use props file for a target and configs
|
||||
# use_props(<target> <configs...> <props_file>)
|
||||
# Inside <props_file> there are following variables:
|
||||
# PROPS_TARGET - <target>
|
||||
# PROPS_CONFIG - One of <configs...>
|
||||
# PROPS_CONFIG_U - Uppercase PROPS_CONFIG
|
||||
# Input:
|
||||
# target - Target to apply props file
|
||||
# configs - Build configurations to apply props file
|
||||
# props_file - CMake script
|
||||
################################################################################
|
||||
macro(use_props TARGET CONFIGS PROPS_FILE)
|
||||
set(PROPS_TARGET "${TARGET}")
|
||||
foreach(PROPS_CONFIG ${CONFIGS})
|
||||
string(TOUPPER "${PROPS_CONFIG}" PROPS_CONFIG_U)
|
||||
|
||||
get_filename_component(ABSOLUTE_PROPS_FILE "${PROPS_FILE}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_LIST_DIR}")
|
||||
if(EXISTS "${ABSOLUTE_PROPS_FILE}")
|
||||
include("${ABSOLUTE_PROPS_FILE}")
|
||||
else()
|
||||
message(WARNING "Corresponding cmake file from props \"${ABSOLUTE_PROPS_FILE}\" doesn't exist")
|
||||
endif()
|
||||
endforeach()
|
||||
endmacro()
|
||||
|
||||
################################################################################
|
||||
# Add compile options to source file
|
||||
# source_file_compile_options(<source_file> [compile_options...])
|
||||
# Input:
|
||||
# source_file - Source file
|
||||
# compile_options - Options to add to COMPILE_FLAGS property
|
||||
################################################################################
|
||||
function(source_file_compile_options SOURCE_FILE)
|
||||
if("${ARGC}" LESS_EQUAL "1")
|
||||
return()
|
||||
endif()
|
||||
|
||||
get_source_file_property(COMPILE_OPTIONS "${SOURCE_FILE}" COMPILE_OPTIONS)
|
||||
|
||||
if(COMPILE_OPTIONS)
|
||||
list(APPEND COMPILE_OPTIONS ${ARGN})
|
||||
else()
|
||||
set(COMPILE_OPTIONS "${ARGN}")
|
||||
endif()
|
||||
|
||||
set_source_files_properties("${SOURCE_FILE}" PROPERTIES COMPILE_OPTIONS "${COMPILE_OPTIONS}")
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
# Default properties of visual studio projects
|
||||
################################################################################
|
||||
set(DEFAULT_CXX_PROPS "${CMAKE_CURRENT_LIST_DIR}/DefaultCXX.cmake")
|
||||
set(DEFAULT_Fortran_PROPS "${CMAKE_CURRENT_LIST_DIR}/DefaultFortran.cmake")
|
||||
Generated
-563
@@ -1,563 +0,0 @@
|
||||
cmake_minimum_required(VERSION 3.16.0 FATAL_ERROR)
|
||||
|
||||
set(CMAKE_SYSTEM_VERSION 10.0.22621.0 CACHE STRING "" FORCE)
|
||||
|
||||
project(lifter CXX)
|
||||
|
||||
################################################################################
|
||||
# Set target arch type if empty. Visual studio solution generator provides it.
|
||||
################################################################################
|
||||
if(NOT CMAKE_VS_PLATFORM_NAME)
|
||||
set(CMAKE_VS_PLATFORM_NAME "x64")
|
||||
endif()
|
||||
message("${CMAKE_VS_PLATFORM_NAME} architecture in use")
|
||||
|
||||
if(NOT ("${CMAKE_VS_PLATFORM_NAME}" STREQUAL "x64"))
|
||||
message(FATAL_ERROR "${CMAKE_VS_PLATFORM_NAME} arch is not supported!")
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Global configuration types
|
||||
################################################################################
|
||||
set(CMAKE_CONFIGURATION_TYPES
|
||||
"Debug"
|
||||
"Release"
|
||||
CACHE STRING "" FORCE
|
||||
)
|
||||
|
||||
################################################################################
|
||||
# Global compiler options
|
||||
################################################################################
|
||||
if(MSVC)
|
||||
# remove default flags provided with CMake for MSVC
|
||||
set(CMAKE_CXX_FLAGS "")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "")
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Global linker options
|
||||
################################################################################
|
||||
if(MSVC)
|
||||
# remove default flags provided with CMake for MSVC
|
||||
set(CMAKE_EXE_LINKER_FLAGS "")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS "")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "")
|
||||
set(CMAKE_STATIC_LINKER_FLAGS "")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS}")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS_DEBUG "${CMAKE_MODULE_LINKER_FLAGS}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_DEBUG "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
set(CMAKE_STATIC_LINKER_FLAGS_DEBUG "${CMAKE_STATIC_LINKER_FLAGS}")
|
||||
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS}")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS_RELEASE "${CMAKE_MODULE_LINKER_FLAGS}")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS}")
|
||||
set(CMAKE_STATIC_LINKER_FLAGS_RELEASE "${CMAKE_STATIC_LINKER_FLAGS}")
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Nuget packages function stub.
|
||||
################################################################################
|
||||
function(use_package TARGET PACKAGE VERSION)
|
||||
message(WARNING "No implementation of use_package. Create yours. "
|
||||
"Package \"${PACKAGE}\" with version \"${VERSION}\" "
|
||||
"for target \"${TARGET}\" is ignored!")
|
||||
endfunction()
|
||||
|
||||
################################################################################
|
||||
# Common utils
|
||||
################################################################################
|
||||
include(CMake/Utils.cmake)
|
||||
|
||||
################################################################################
|
||||
# Additional Global Settings(add specific info there)
|
||||
################################################################################
|
||||
include(CMake/GlobalSettingsInclude.cmake OPTIONAL)
|
||||
|
||||
################################################################################
|
||||
# Use solution folders feature
|
||||
################################################################################
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
################################################################################
|
||||
# Sub-projects
|
||||
################################################################################
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
set(PROJECT_NAME lifter)
|
||||
|
||||
################################################################################
|
||||
# Source groups
|
||||
################################################################################
|
||||
set(Header_Files
|
||||
"CustomPasses.h"
|
||||
"includes.h"
|
||||
"LLVM-init.h"
|
||||
"nacibaba_opts.h"
|
||||
"OperandUtils.h"
|
||||
"ROPdetection.h"
|
||||
"Semantics.h"
|
||||
"utils.h"
|
||||
)
|
||||
source_group("Header Files" FILES ${Header_Files})
|
||||
|
||||
set(Source_Files
|
||||
"CustomPasses.cpp"
|
||||
"lifter.cpp"
|
||||
"LLVM-init.cpp"
|
||||
"nacibaba_opts.cpp"
|
||||
"OperandUtils.cpp"
|
||||
"ROPdetection.cpp"
|
||||
"Semantics.cpp"
|
||||
"utils.cpp"
|
||||
)
|
||||
source_group("Source Files" FILES ${Source_Files})
|
||||
|
||||
set(ALL_FILES
|
||||
${Header_Files}
|
||||
${Source_Files}
|
||||
)
|
||||
|
||||
################################################################################
|
||||
# Target
|
||||
################################################################################
|
||||
add_executable(${PROJECT_NAME} ${ALL_FILES})
|
||||
|
||||
# Set C++ standard to C++20
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
CXX_STANDARD 20
|
||||
CXX_STANDARD_REQUIRED YES
|
||||
CXX_EXTENSIONS OFF
|
||||
)
|
||||
|
||||
use_props(${PROJECT_NAME} "${CMAKE_CONFIGURATION_TYPES}" "${DEFAULT_CXX_PROPS}")
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
VS_GLOBAL_KEYWORD "Win32Proj"
|
||||
)
|
||||
################################################################################
|
||||
# Target name
|
||||
################################################################################
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
TARGET_NAME_DEBUG "lifter"
|
||||
TARGET_NAME_RELEASE "lifter"
|
||||
)
|
||||
################################################################################
|
||||
# Output directory
|
||||
################################################################################
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_SOURCE_DIR}/x64/Debug/"
|
||||
OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_SOURCE_DIR}/x64/Release/"
|
||||
)
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
ARCHIVE_OUTPUT_DIRECTORY_DEBUG "C:/Users/yusuf/Desktop/Z2LLVM/lifter/x64/Debug"
|
||||
ARCHIVE_OUTPUT_DIRECTORY_RELEASE "C:/Users/yusuf/Desktop/Z2LLVM/lifter/x64/Release"
|
||||
)
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
ARCHIVE_OUTPUT_NAME_DEBUG "lifter"
|
||||
ARCHIVE_OUTPUT_NAME_RELEASE "lifter"
|
||||
)
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES
|
||||
INTERPROCEDURAL_OPTIMIZATION_RELEASE "TRUE"
|
||||
)
|
||||
################################################################################
|
||||
# MSVC runtime library
|
||||
################################################################################
|
||||
get_property(MSVC_RUNTIME_LIBRARY_DEFAULT TARGET ${PROJECT_NAME} PROPERTY MSVC_RUNTIME_LIBRARY)
|
||||
string(CONCAT "MSVC_RUNTIME_LIBRARY_STR"
|
||||
$<$<CONFIG:Debug>:
|
||||
MultiThreadedDebugDLL
|
||||
>
|
||||
$<$<CONFIG:Release>:
|
||||
MultiThreadedDLL
|
||||
>
|
||||
$<$<NOT:$<OR:$<CONFIG:Debug>,$<CONFIG:Release>>>:${MSVC_RUNTIME_LIBRARY_DEFAULT}>
|
||||
)
|
||||
set_target_properties(${PROJECT_NAME} PROPERTIES MSVC_RUNTIME_LIBRARY ${MSVC_RUNTIME_LIBRARY_STR})
|
||||
|
||||
################################################################################
|
||||
# Include directories
|
||||
################################################################################
|
||||
target_include_directories(${PROJECT_NAME} PUBLIC
|
||||
"$<$<CONFIG:Debug>:"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../zydis-4.0.0/include;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../zydis-4.0.0/dependencies/zycore/include;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/."
|
||||
">"
|
||||
"$<$<CONFIG:Release>:"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../zydis/include;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../zydis/dependencies/zycore/include"
|
||||
">"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../llvm-project/llvm/include;"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../llvm-project/llvm/build/include"
|
||||
)
|
||||
|
||||
################################################################################
|
||||
# Compile definitions
|
||||
################################################################################
|
||||
target_compile_definitions(${PROJECT_NAME} PRIVATE
|
||||
"$<$<CONFIG:Debug>:"
|
||||
"_DEBUG;"
|
||||
"UNICODE;"
|
||||
"_UNICODE;"
|
||||
"CMAKE_INTDIR=\"Debug\";"
|
||||
"UNICODE;"
|
||||
"_UNICODE"
|
||||
">"
|
||||
"$<$<CONFIG:Release>:"
|
||||
"NDEBUG;"
|
||||
"_MBCS;"
|
||||
"CMAKE_INTDIR=\"Release\";"
|
||||
"_MBCS"
|
||||
">"
|
||||
"_CONSOLE"
|
||||
)
|
||||
|
||||
################################################################################
|
||||
# Compile and link options
|
||||
################################################################################
|
||||
if(MSVC)
|
||||
target_compile_options(${PROJECT_NAME} PRIVATE
|
||||
$<$<CONFIG:Release>:
|
||||
/MP;
|
||||
/O2;
|
||||
/Ob2;
|
||||
/GF;
|
||||
/GT;
|
||||
/Oy;
|
||||
/Gy;
|
||||
/Ot;
|
||||
/fp:fast;
|
||||
/Oi-
|
||||
>
|
||||
/permissive-;
|
||||
/sdl;
|
||||
/arch:AVX2;
|
||||
/W3;
|
||||
/Zi;
|
||||
${DEFAULT_CXX_EXCEPTION_HANDLING};
|
||||
/Y-
|
||||
)
|
||||
target_link_options(${PROJECT_NAME} PRIVATE
|
||||
$<$<CONFIG:Debug>:
|
||||
/INCREMENTAL
|
||||
>
|
||||
$<$<CONFIG:Release>:
|
||||
/OPT:REF;
|
||||
/OPT:ICF;
|
||||
/PROFILE
|
||||
>
|
||||
/MANIFEST;
|
||||
/DEBUG;
|
||||
/SUBSYSTEM:CONSOLE
|
||||
)
|
||||
endif()
|
||||
|
||||
################################################################################
|
||||
# Dependencies
|
||||
################################################################################
|
||||
set(ADDITIONAL_LIBRARY_DEPENDENCIES
|
||||
"$<$<CONFIG:Debug>:"
|
||||
"../../zydis-4.0.0/build/Debug/Zydis;"
|
||||
"../../zydis-4.0.0/build/zycore/Debug/Zycore;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMCore;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMExecutionEngine;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMC;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMCJIT;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSupport;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMX86CodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMX86Desc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMX86Info;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMOrcTargetProcess;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMOrcShared;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMRuntimeDyld;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMCDisassembler;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAsmPrinter;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMCFGuard;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMGlobalISel;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMInstrumentation;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSelectionDAG;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMTarget;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBitWriter;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMObjCARCOpts;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMScalarOpts;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAggressiveInstCombine;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMInstCombine;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMCodeGenTypes;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMTransformUtils;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAnalysis;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMProfileData;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSymbolize;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMDebugInfoDWARF;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMDebugInfoPDB;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMObject;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMIRReader;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBitReader;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMRemarks;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBitstreamReader;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMCParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMTextAPI;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBinaryFormat;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMTargetParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMDebugInfoCodeView;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMDebugInfoMSF;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMDebugInfoBTF;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMDemangle;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMPasses;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAArch64AsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAMDGPUAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMARMAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAVRAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBPFAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMHexagonAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLanaiAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLoongArchAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMipsAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMSP430AsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMPowerPCAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMRISCVAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSparcAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSystemZAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMVEAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMWebAssemblyAsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMX86AsmParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAArch64CodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAMDGPUCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMARMCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAVRCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBPFCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMHexagonCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLanaiCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLoongArchCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMipsCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMSP430CodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMNVPTXCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMPowerPCCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMRISCVCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSparcCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSystemZCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMVECodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMWebAssemblyCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMXCoreCodeGen;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAArch64Desc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAMDGPUDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMARMDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAVRDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBPFDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMHexagonDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLanaiDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLoongArchDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMipsDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMSP430Desc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMNVPTXDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMPowerPCDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMRISCVDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSparcDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSystemZDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMVEDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMWebAssemblyDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMXCoreDesc;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAArch64Info;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAMDGPUInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMARMInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAVRInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMBPFInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMHexagonInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLanaiInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLoongArchInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMipsInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMSP430Info;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMNVPTXInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMPowerPCInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMRISCVInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSparcInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMSystemZInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMVEInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMWebAssemblyInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMXCoreInfo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMCoroutines;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMExtensions;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMipo;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMIRPrinter;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMVectorize;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAArch64Utils;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMAMDGPUUtils;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMMIRParser;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMARMUtils;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMFrontendOpenMP;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMLinker;"
|
||||
"../../llvm-project/llvm/build/Debug/lib/LLVMWebAssemblyUtils"
|
||||
">"
|
||||
"$<$<CONFIG:Release>:"
|
||||
"../../zydis/ReleaseX64/Zydis;"
|
||||
"../../zydis/ReleaseX64/Zycore;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAArch64AsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAMDGPUAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMARMAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAVRAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBPFAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMHexagonAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLanaiAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLoongArchAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMipsAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMSP430AsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMPowerPCAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMRISCVAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSparcAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSystemZAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMVEAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMWebAssemblyAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMX86AsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAArch64CodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAMDGPUCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMARMCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAVRCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBPFCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMHexagonCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLanaiCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLoongArchCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMipsCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMSP430CodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMNVPTXCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMPowerPCCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMRISCVCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSparcCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSystemZCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMVECodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMWebAssemblyCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMX86CodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMXCoreCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAArch64Desc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAMDGPUDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMARMDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAVRDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBPFDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMHexagonDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLanaiDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLoongArchDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMipsDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMSP430Desc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMNVPTXDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMPowerPCDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMRISCVDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSparcDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSystemZDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMVEDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMWebAssemblyDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMX86Desc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMXCoreDesc;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAArch64Info;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAMDGPUInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMARMInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAVRInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBPFInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMHexagonInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLanaiInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLoongArchInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMipsInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMSP430Info;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMNVPTXInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMPowerPCInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMRISCVInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSparcInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSystemZInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMVEInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMWebAssemblyInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMX86Info;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMXCoreInfo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAggressiveInstCombine;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAnalysis;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAsmParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBitWriter;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMCFGuard;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMCodeGen;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMCore;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMCoroutines;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMExtensions;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMipo;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMIRReader;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMIRPrinter;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMInstCombine;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMInstrumentation;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMC;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMObjCARCOpts;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMRemarks;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMScalarOpts;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSupport;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMTarget;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMTargetParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMTransformUtils;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMVectorize;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMPasses;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAArch64Utils;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAMDGPUUtils;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMHipStdPar;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMIRParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMARMUtils;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMFrontendOpenMP;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMFrontendOffloading;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMLinker;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMWebAssemblyUtils;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMCDisassembler;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMGlobalISel;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMAsmPrinter;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSelectionDAG;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMProfileData;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMSymbolize;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMDebugInfoDWARF;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMDebugInfoPDB;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMDebugInfoMSF;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMDebugInfoBTF;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMObject;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMMCParser;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMDebugInfoCodeView;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBitReader;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMTextAPI;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBitstreamReader;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMBinaryFormat;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMCodeGenTypes;"
|
||||
"../../llvm-project/llvm/build/Release/lib/LLVMDemangle;"
|
||||
"ws2_32"
|
||||
">"
|
||||
"psapi;"
|
||||
"shell32;"
|
||||
"ole32;"
|
||||
"uuid;"
|
||||
"advapi32;"
|
||||
"delayimp;"
|
||||
"-delayload:shell32.dll;"
|
||||
"-delayload:ole32.dll;"
|
||||
"kernel32;"
|
||||
"user32;"
|
||||
"gdi32;"
|
||||
"winspool;"
|
||||
"oleaut32;"
|
||||
"comdlg32"
|
||||
)
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE "${ADDITIONAL_LIBRARY_DEPENDENCIES}")
|
||||
|
||||
+11
-15
@@ -49,7 +49,7 @@ IntegerType* getIntSize(int size, LLVMContext& context) {
|
||||
}
|
||||
|
||||
|
||||
void Init_Flags(LLVMContext& context, IRBuilder<>& builder) {
|
||||
void Init_Flags2(LLVMContext& context, IRBuilder<>& builder) {
|
||||
|
||||
auto zero = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt1Ty(context), 0);
|
||||
|
||||
@@ -80,7 +80,7 @@ Value* getFlag(LLVMContext& context, IRBuilder<>& builder, Flag flag) {
|
||||
// instead of 1 variable
|
||||
// have multiple variables that correspond to the flags
|
||||
|
||||
void Init_Flags2(LLVMContext& context, IRBuilder<>& builder) {
|
||||
void Init_Flags(LLVMContext& context, IRBuilder<>& builder) {
|
||||
|
||||
|
||||
auto zero = (ConstantInt*)llvm::ConstantInt::getSigned(llvm::Type::getInt64Ty(context), 0);
|
||||
@@ -177,18 +177,17 @@ Value* GetValueFromHighByteRegister(LLVMContext& context, IRBuilder<>& builder,
|
||||
return highByteValue;
|
||||
}
|
||||
|
||||
|
||||
// this function will probably cause issues in the future
|
||||
void SetRFLAGSValue(LLVMContext& context, IRBuilder<>& builder, Value* value) {
|
||||
|
||||
for (int flag = FLAG_CF; flag++; flag < FLAGS_END) {
|
||||
int shiftAmount = flag;
|
||||
Value* shiftedFlagValue = builder.CreateLShr(value, ConstantInt::get(Type::getInt64Ty(context), shiftAmount) ); // Value >> flag
|
||||
Value* shiftedFlagValue = builder.CreateLShr(value, ConstantInt::get(Type::getInt64Ty(context), shiftAmount)); // Value >> flag
|
||||
auto flagValue = builder.CreateTrunc(shiftedFlagValue, Type::getInt1Ty(context)); // i64 ...0001 to 1
|
||||
setFlag(context,builder,(Flag)flag,flagValue);
|
||||
setFlag(context, builder, (Flag)flag, flagValue);
|
||||
// shl and or flags to have one big flag
|
||||
}
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
Value* GetRFLAGSValue(LLVMContext& context, IRBuilder<>& builder) {
|
||||
@@ -196,7 +195,7 @@ Value* GetRFLAGSValue(LLVMContext& context, IRBuilder<>& builder) {
|
||||
|
||||
for (int flag = FLAG_CF; flag++; flag < FLAGS_END) {
|
||||
Value* flagValue = getFlag(context, builder, (Flag)flag);
|
||||
int shiftAmount = flag;
|
||||
int shiftAmount = flag;
|
||||
Value* shiftedFlagValue = builder.CreateShl(flagValue, ConstantInt::get(Type::getInt64Ty(context), shiftAmount));
|
||||
rflags = builder.CreateOr(rflags, shiftedFlagValue);
|
||||
}
|
||||
@@ -225,6 +224,7 @@ Value* GetRegisterValue(LLVMContext& context, IRBuilder<>& builder, int key) {
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
return RegisterList[newKey];
|
||||
|
||||
}
|
||||
@@ -318,7 +318,6 @@ void SetRegisterValue(LLVMContext& context, IRBuilder<>& builder, int key, Value
|
||||
value = SetValueToSubRegister2(context, builder, key, value);
|
||||
}
|
||||
|
||||
|
||||
if (key == ZYDIS_REGISTER_RFLAGS) {
|
||||
SetRFLAGSValue(context, builder, value);
|
||||
return;
|
||||
@@ -549,14 +548,12 @@ Value* GetOperandValue(LLVMContext& context, IRBuilder<>& builder, ZydisDecodedO
|
||||
|
||||
APInt readValue(byteSize * 8, tempValue);
|
||||
Constant* newVal = ConstantInt::get(loadType, readValue);
|
||||
if (newVal)
|
||||
return newVal;
|
||||
}
|
||||
|
||||
if (addr > 0 && addr < STACKP_VALUE) {
|
||||
|
||||
auto newval = globalBuffer.retrieveCombinedValue(builder, addr, byteSize);
|
||||
if (newval)
|
||||
return newval;
|
||||
|
||||
}
|
||||
@@ -630,12 +627,12 @@ Value* merge(LLVMContext& context, IRBuilder<>& builder, Value* existingValue, V
|
||||
|
||||
// responsible for setting a value in SSA Value map
|
||||
Value* SetOperandValue(LLVMContext& context, IRBuilder<>& builder, ZydisDecodedOperand& op, Value* value) {
|
||||
|
||||
switch (op.type) {
|
||||
case ZYDIS_OPERAND_TYPE_REGISTER: {
|
||||
GetRegisterValue(context, builder, op.reg.value);
|
||||
|
||||
|
||||
SetRegisterValue(context, builder, op.reg.value, value);
|
||||
return value;
|
||||
break;
|
||||
|
||||
}case ZYDIS_OPERAND_TYPE_MEMORY: {
|
||||
@@ -707,9 +704,8 @@ Value* SetOperandValue(LLVMContext& context, IRBuilder<>& builder, ZydisDecodedO
|
||||
break;
|
||||
|
||||
default: {
|
||||
printf("kurwa: %d\n", op.type);
|
||||
throw std::runtime_error("operand type not implemented"); exit(-1);
|
||||
return nullptr;
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -761,4 +757,4 @@ Value* setFlag2(LLVMContext& context, IRBuilder<>& builder, Flag flag, Value* ne
|
||||
shifted_newValue = builder.CreateOr(cleared_rflag, shifted_newValue, "setflag-or");
|
||||
SetRegisterValue(context, builder, ZYDIS_REGISTER_RFLAGS, shifted_newValue);
|
||||
return shifted_newValue;
|
||||
}
|
||||
}
|
||||
+28
-29
@@ -6,6 +6,7 @@
|
||||
void* file_base_g;
|
||||
ZyanU8* data_g;
|
||||
|
||||
#pragma once
|
||||
#ifndef GEPLoadPass_H
|
||||
#define GEPLoadPass_H
|
||||
|
||||
@@ -15,13 +16,11 @@ ZyanU8* data_g;
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/Constants.h"
|
||||
|
||||
#include "llvm/Transforms/Scalar/SROA.h"
|
||||
|
||||
|
||||
class RemovePseudoStackPass : public llvm::PassInfoMixin<RemovePseudoStackPass> {
|
||||
public:
|
||||
|
||||
|
||||
|
||||
llvm::PreservedAnalyses run(llvm::Module& M, llvm::ModuleAnalysisManager&) {
|
||||
// %stackmemory = alloca i128, i128 STACKP_VALUE
|
||||
// insert %stackmemory as first inst
|
||||
@@ -174,23 +173,23 @@ void initDetections(void* file_base, ZyanU8* data) {
|
||||
|
||||
// detects if RSP matches the starting value of RSP
|
||||
// normal function:
|
||||
//
|
||||
//
|
||||
// -- rsp = 0xffff
|
||||
// push ecx 0xfff8
|
||||
// ...etc...
|
||||
// pop ecx 0xffff
|
||||
// (before ret rsp = 0xffff)
|
||||
// ret
|
||||
//
|
||||
// ret
|
||||
//
|
||||
// fake ret/function
|
||||
//
|
||||
//
|
||||
// -- rsp = 0xffff
|
||||
// push ecx 0xfff8
|
||||
// ...etc...
|
||||
// pop ecx 0xffff
|
||||
// push (next_handler) 0xfff8
|
||||
// (before ret rsp = 0xfff8)
|
||||
// ret
|
||||
// (before ret rsp = 0xfff8)
|
||||
// ret
|
||||
//
|
||||
|
||||
// basically apply bunch of optimizations and compare RSP
|
||||
@@ -203,7 +202,7 @@ bool doesReturnRsp(Function* clonedFunc, BasicBlock& clonedBB, void* file_base,
|
||||
|
||||
|
||||
if (llvm::ConstantInt* constInt = dyn_cast<llvm::ConstantInt>(clonedBB.getTerminator()->getOperand(0))) {
|
||||
return constInt->getZExtValue() == 18446744073709551600ull;
|
||||
return constInt->getZExtValue() == 18446744073709551600;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -259,11 +258,11 @@ bool doesReturnRsp(Function* clonedFunc, BasicBlock& clonedBB, void* file_base,
|
||||
|
||||
|
||||
if (llvm::ConstantInt* constInt = dyn_cast<llvm::ConstantInt>(clonedBB.getTerminator()->getOperand(0))) {
|
||||
return constInt->getZExtValue() == 18446744073709551600ull;
|
||||
return constInt->getZExtValue() == 18446744073709551600;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// after analysis
|
||||
@@ -314,7 +313,7 @@ void test_optxd(Function* clonedFuncx) {
|
||||
modulePassManager.addPass(ReplaceTruncWithLoadPass());
|
||||
modulePassManager.run(*module, moduleAnalysisManager);
|
||||
|
||||
|
||||
|
||||
size_t afterSize = module->getInstructionCount();
|
||||
|
||||
// Check if the module has changed
|
||||
@@ -421,7 +420,7 @@ opaque_info isOpaque(Function* function) {
|
||||
llvm::PassBuilder passBuilder;
|
||||
|
||||
#ifdef _DEVELOPMENT
|
||||
std::string Filename2 = "output_opaque_noopt.ll";
|
||||
std::string Filename = "output_opaque_noopt.ll";
|
||||
std::error_code EC;
|
||||
llvm::raw_fd_ostream OS(Filename, EC);
|
||||
clonedFunc->print(OS);
|
||||
@@ -457,19 +456,19 @@ opaque_info isOpaque(Function* function) {
|
||||
do {
|
||||
changed = false;
|
||||
|
||||
|
||||
|
||||
|
||||
size_t beforeSize = module->getInstructionCount();
|
||||
|
||||
// Build and run the optimization pipeline
|
||||
|
||||
modulePassManager = passBuilder.buildPerModuleDefaultPipeline(OptimizationLevel::O0);
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass()));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::PreserveCFG)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
|
||||
modulePassManager.addPass(IPSCCPPass());
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
|
||||
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass()));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::PreserveCFG)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
|
||||
|
||||
@@ -494,7 +493,7 @@ opaque_info isOpaque(Function* function) {
|
||||
clonedFunc->print(OS2);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
size_t afterSize = module->getInstructionCount();
|
||||
|
||||
// Check if the module has changed
|
||||
@@ -505,7 +504,7 @@ opaque_info isOpaque(Function* function) {
|
||||
} while (changed);
|
||||
|
||||
|
||||
|
||||
|
||||
returnInst = dyn_cast<llvm::ReturnInst>(clonedFunc->back().getTerminator());
|
||||
// Assuming you want to check the return value of the ReturnInst
|
||||
if (returnInst->getReturnValue() != nullptr) {
|
||||
@@ -530,7 +529,7 @@ opaque_info isOpaque(Function* function) {
|
||||
ROP_info isROP(Function* clonedFunc, BasicBlock& clonedBB, uintptr_t &dest) {
|
||||
//create clone of module/function then analyze it.
|
||||
|
||||
|
||||
|
||||
|
||||
auto file_base = file_base_g;
|
||||
auto data = data_g;
|
||||
@@ -595,18 +594,18 @@ ROP_info isROP(Function* clonedFunc, BasicBlock& clonedBB, uintptr_t &dest) {
|
||||
bool haschanged = false;
|
||||
changed = false;
|
||||
|
||||
|
||||
|
||||
size_t beforeSize = module->getInstructionCount();
|
||||
|
||||
// Build and run the optimization pipeline
|
||||
|
||||
modulePassManager = passBuilder.buildPerModuleDefaultPipeline(OptimizationLevel::O0);
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass()));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::PreserveCFG)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
|
||||
modulePassManager.addPass(IPSCCPPass());
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
|
||||
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass()));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::PreserveCFG)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
|
||||
|
||||
@@ -631,7 +630,7 @@ ROP_info isROP(Function* clonedFunc, BasicBlock& clonedBB, uintptr_t &dest) {
|
||||
clonedFunc->print(OS2);
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
std::string afterOptimization;
|
||||
size_t afterSize = module->getInstructionCount();
|
||||
|
||||
@@ -666,7 +665,7 @@ ROP_info isROP(Function* clonedFunc, BasicBlock& clonedBB, uintptr_t &dest) {
|
||||
llvm::Value* returnValue = returnInst->getReturnValue();
|
||||
if (llvm::ConstantInt* constInt = llvm::dyn_cast<llvm::ConstantInt>(returnValue)) {
|
||||
dest = constInt->getZExtValue();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -697,7 +696,7 @@ JMP_info isJOP(Function* function, uintptr_t& dest) {
|
||||
JMP_info result = REAL_jmp;
|
||||
llvm::ReturnInst* returnInst = dyn_cast<llvm::ReturnInst>(function->back().getTerminator());
|
||||
|
||||
if ((returnInst = dyn_cast<llvm::ReturnInst>(function->back().getTerminator()))) {
|
||||
if (returnInst = dyn_cast<llvm::ReturnInst>(function->back().getTerminator())) {
|
||||
// Assuming you want to check the return value of the ReturnInst
|
||||
if (returnInst->getReturnValue() != nullptr) {
|
||||
// Check if the return value is a constant integer
|
||||
@@ -758,12 +757,12 @@ JMP_info isJOP(Function* function, uintptr_t& dest) {
|
||||
// Build and run the optimization pipeline
|
||||
|
||||
modulePassManager = passBuilder.buildPerModuleDefaultPipeline(OptimizationLevel::O0);
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass()));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::PreserveCFG)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
|
||||
modulePassManager.addPass(IPSCCPPass());
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
|
||||
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass()));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(SROAPass(SROAOptions::PreserveCFG)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(EarlyCSEPass(true)));
|
||||
modulePassManager.addPass(createModuleToFunctionPassAdaptor(InstCombinePass()));
|
||||
|
||||
@@ -796,7 +795,7 @@ JMP_info isJOP(Function* function, uintptr_t& dest) {
|
||||
|
||||
//we need to modify here when adding branches
|
||||
//maybe we add metadata to return instruction and search it?
|
||||
if ((returnInst = dyn_cast<llvm::ReturnInst>(clonedFunc->back().getTerminator()))) {
|
||||
if (returnInst = dyn_cast<llvm::ReturnInst>(clonedFunc->back().getTerminator() )) {
|
||||
// Assuming you want to check the return value of the ReturnInst
|
||||
if (returnInst->getReturnValue() != nullptr) {
|
||||
// Check if the return value is a constant integer
|
||||
|
||||
@@ -6,7 +6,6 @@ void test_optxd(Function* clonedFuncx);
|
||||
|
||||
void final_optpass(Function* clonedFuncx);
|
||||
|
||||
|
||||
opaque_info isOpaque(Function* function);
|
||||
|
||||
void initDetections(void* file_base, ZyanU8* data);
|
||||
@@ -14,3 +13,4 @@ void initDetections(void* file_base, ZyanU8* data);
|
||||
ROP_info isROP(Function* function, BasicBlock& clonedBB, uintptr_t& dest);
|
||||
|
||||
JMP_info isJOP(Function* function, uintptr_t& dest);
|
||||
|
||||
|
||||
@@ -814,10 +814,10 @@ namespace branches {
|
||||
auto Value = GetOperandValue(context, builder, dest, 64);
|
||||
auto ripval = GetRegisterValue(context, builder, ZYDIS_REGISTER_RIP);
|
||||
|
||||
auto newRip = builder.CreateAdd(Value, ripval, "jns");
|
||||
auto newRip = builder.CreateAdd(Value, ripval, "js");
|
||||
|
||||
|
||||
branchHelper(context, builder, instruction, blockAddresses, sf, newRip, "jns", branchnumber);
|
||||
branchHelper(context, builder, instruction, blockAddresses, sf, newRip, "js", branchnumber);
|
||||
|
||||
branchnumber++;
|
||||
|
||||
|
||||
+2
-2
@@ -5,7 +5,8 @@
|
||||
#ifndef ZYDIS_STATIC_BUILD
|
||||
#define ZYDIS_STATIC_BUILD
|
||||
#endif // ZYDIS_STATIC_BUILD
|
||||
//#define _DEVELOPMENT
|
||||
#define _DEVELOPMENT
|
||||
#pragma warning(disable: 4996)
|
||||
#pragma warning(disable:4146)
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
@@ -205,7 +206,6 @@
|
||||
#include "llvm/Transforms/Vectorize/SLPVectorizer.h"
|
||||
#include "llvm/Transforms/Vectorize/VectorCombine.h"
|
||||
|
||||
|
||||
#include "llvm/CodeGen/Passes.h"
|
||||
#include "llvm/ADT/STLExtras.h"
|
||||
#include "llvm/IR/Argument.h"
|
||||
|
||||
+1
-6
@@ -33,7 +33,6 @@
|
||||
|
||||
vector< tuple<uintptr_t, BasicBlock*, unordered_map<int, Value*> > > added_blocks_addresses;
|
||||
uintptr_t original_address = 0;
|
||||
uintptr_t instcount = 0;
|
||||
|
||||
// first of all, this function is UGLY af, so I'm sorry you are reading this.
|
||||
void asm_to_zydis_to_lift(LLVMContext& context, IRBuilder<>& builder, ZyanU8* data, ZyanU64 runtime_address, shared_ptr<vector< tuple<uintptr_t, BasicBlock*, unordered_map<int, Value*> > > > blockAddresses, Function* function, ZyanU64 file_base) {
|
||||
@@ -109,7 +108,6 @@ void asm_to_zydis_to_lift(LLVMContext& context, IRBuilder<>& builder, ZyanU8* da
|
||||
// this loop is responsible of parsing asm into zydis then LLVM.
|
||||
for (; run && runtime_address > 0; )
|
||||
{
|
||||
|
||||
//the function we know and we love
|
||||
ZydisDisassembleIntel(ZYDIS_MACHINE_MODE_LONG_64, runtime_address, data + offset, 15, &instruction);
|
||||
|
||||
@@ -121,10 +119,8 @@ void asm_to_zydis_to_lift(LLVMContext& context, IRBuilder<>& builder, ZyanU8* da
|
||||
// Print current instruction.
|
||||
|
||||
#ifdef _DEVELOPMENT
|
||||
instcount++;
|
||||
cout << instruction.text << "\n";
|
||||
cout << "runtime: " << runtime_address << "\n";
|
||||
cout << "instcount: " << instcount << "\n";
|
||||
#endif
|
||||
instruction.runtime_address += instruction.info.length;
|
||||
|
||||
@@ -200,8 +196,7 @@ void InitFunction_and_LiftInstructions(ZyanU8* data, ZyanU64 runtime_address, ui
|
||||
argTypes.push_back(llvm::Type::getInt64Ty(context)); // 16 regs
|
||||
argTypes.push_back(llvm::Type::getInt64Ty(context)); // 16 regs
|
||||
argTypes.push_back(llvm::Type::getInt64Ty(context)); // 16 regs
|
||||
argTypes.push_back(llvm::Type::getInt8PtrTy(context)); // 1 off because rsp
|
||||
//argTypes.push_back(llvm::Type::getVoidTy(context)->getPointerTo()); // 1 off because rsp
|
||||
argTypes.push_back(llvm::Type::getVoidTy(context)->getPointerTo()); // 1 off because rsp
|
||||
|
||||
auto functionType = llvm::FunctionType::get(llvm::Type::getInt64Ty(context), argTypes, 0);
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,69 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="lifter.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="LLVM-init.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Semantics.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="OperandUtils.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ROPdetection.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="nacibaba_opts.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="utils.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="CustomPasses.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="includes.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="LLVM-init.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Semantics.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="OperandUtils.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ROPdetection.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="nacibaba_opts.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="utils.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="CustomPasses.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,4 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup />
|
||||
</Project>
|
||||
Reference in New Issue
Block a user