From d94ff6126d1f6cb38382d8995cf7be21ce740af6 Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Mon, 16 Aug 2021 02:06:17 -0700 Subject: [PATCH] added another lifter (POPVSP)... --- CMakeLists.txt | 1 + dependencies/vmprofiler | 2 +- include/devirt_t.hpp | 8 ++++---- include/vm_lifters.hpp | 2 ++ src/devirt_t.cpp | 8 ++++---- src/lifters/add.cpp | 6 +++--- src/lifters/nand.cpp | 6 +++--- src/lifters/popvsp.cpp | 16 ++++++++++++++++ src/lifters/shr.cpp | 8 ++++---- src/main.cpp | 2 ++ src/vmp_rtn_t.cpp | 3 --- 11 files changed, 40 insertions(+), 22 deletions(-) create mode 100644 src/lifters/popvsp.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 60acd20..fd248be 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,6 +50,7 @@ list(APPEND vmdevirt_SOURCES "src/lifters/lreg.cpp" "src/lifters/mul.cpp" "src/lifters/nand.cpp" + "src/lifters/popvsp.cpp" "src/lifters/pushvsp.cpp" "src/lifters/read.cpp" "src/lifters/sflags.cpp" diff --git a/dependencies/vmprofiler b/dependencies/vmprofiler index 05c98b1..9b5f89f 160000 --- a/dependencies/vmprofiler +++ b/dependencies/vmprofiler @@ -1 +1 @@ -Subproject commit 05c98b1ef57c3375ffd455221a3be1be6110d4eb +Subproject commit 9b5f89f4881862598181163069c69f584257d3f0 diff --git a/include/devirt_t.hpp b/include/devirt_t.hpp index 42549c2..a6184de 100644 --- a/include/devirt_t.hpp +++ b/include/devirt_t.hpp @@ -65,10 +65,10 @@ namespace vm llvm::Value *load_value( std::uint8_t byte_size, llvm::GlobalValue *global ); llvm::Value *load_value( std::uint8_t byte_size, llvm::AllocaInst *var ); - llvm::Value *compute_sf( std::uint8_t byte_size, llvm::Value *val ); - llvm::Value *compute_zf( std::uint8_t byte_size, llvm::Value *val ); - llvm::Value *compute_pf( std::uint8_t byte_size, llvm::Value *val ); - llvm::Value *combine_flags( llvm::Value *cf, llvm::Value *pf, llvm::Value *af, llvm::Value *zf, llvm::Value *sf, + llvm::Value *sf( std::uint8_t byte_size, llvm::Value *val ); + llvm::Value *zf( std::uint8_t byte_size, llvm::Value *val ); + llvm::Value *pf( std::uint8_t byte_size, llvm::Value *val ); + llvm::Value *flags( llvm::Value *cf, llvm::Value *pf, llvm::Value *af, llvm::Value *zf, llvm::Value *sf, llvm::Value *of ); }; } // namespace vm \ No newline at end of file diff --git a/include/vm_lifters.hpp b/include/vm_lifters.hpp index e9b5717..8c4e606 100644 --- a/include/vm_lifters.hpp +++ b/include/vm_lifters.hpp @@ -36,6 +36,7 @@ namespace vm static lifter_callback_t lregq, lregdw; static lifter_callback_t pushvsp; + static lifter_callback_t popvsp; static lifter_callback_t readq, readdw; static lifter_callback_t nandq, nanddw; static lifter_callback_t shrq; @@ -56,6 +57,7 @@ namespace vm { vm::handler::ADDW, &addw }, { vm::handler::SHRQ, &shrq }, { vm::handler::PUSHVSP, &pushvsp }, + { vm::handler::POPVSP, &popvsp }, { vm::handler::SREGQ, &sregq }, { vm::handler::SREGDW, &sregdw }, { vm::handler::LREGQ, &lregq }, diff --git a/src/devirt_t.cpp b/src/devirt_t.cpp index 7f7143f..4804b97 100644 --- a/src/devirt_t.cpp +++ b/src/devirt_t.cpp @@ -129,21 +129,21 @@ namespace vm return vmp_rtn->llvm_fptr; } - llvm::Value *devirt_t::compute_sf( std::uint8_t byte_size, llvm::Value *val ) + llvm::Value *devirt_t::sf( std::uint8_t byte_size, llvm::Value *val ) { auto op_size = llvm::IntegerType::get( *llvm_ctx, byte_size * 8 ); auto msb = ir_builder->CreateLShr( val, ( byte_size * 8 ) - 1 ); return ir_builder->CreateZExt( msb, llvm::IntegerType::get( *llvm_ctx, 64 ) ); } - llvm::Value *devirt_t::compute_zf( std::uint8_t byte_size, llvm::Value *val ) + llvm::Value *devirt_t::zf( std::uint8_t byte_size, llvm::Value *val ) { auto op_size = llvm::IntegerType::get( *llvm_ctx, byte_size * 8 ); auto is_zero = ir_builder->CreateICmpEQ( val, llvm::ConstantInt::get( op_size, 0 ) ); return ir_builder->CreateZExt( is_zero, llvm::IntegerType::get( *llvm_ctx, 64 ) ); } - llvm::Value *devirt_t::compute_pf( std::uint8_t byte_size, llvm::Value *val ) + llvm::Value *devirt_t::pf( std::uint8_t byte_size, llvm::Value *val ) { auto operand_size = llvm::IntegerType::get( *llvm_ctx, byte_size * 8 ); auto popcount_intrinsic = llvm::Intrinsic::getDeclaration( llvm_module, llvm::Intrinsic::ctpop, @@ -154,7 +154,7 @@ namespace vm return ir_builder->CreateCall( popcount_intrinsic, { extended_bits } ); } - llvm::Value *devirt_t::combine_flags( llvm::Value *cf, llvm::Value *pf, llvm::Value *af, llvm::Value *zf, + llvm::Value *devirt_t::flags( llvm::Value *cf, llvm::Value *pf, llvm::Value *af, llvm::Value *zf, llvm::Value *sf, llvm::Value *of ) { auto shifted_pf = ir_builder->CreateShl( pf, 2, "shifted_pf", true, true ); diff --git a/src/lifters/add.cpp b/src/lifters/add.cpp index 1f298f0..9060c1d 100644 --- a/src/lifters/add.cpp +++ b/src/lifters/add.cpp @@ -24,12 +24,12 @@ namespace vm auto s_of_bit = rtn->ir_builder->CreateExtractValue( s_add, { 1 } ); auto of = rtn->ir_builder->CreateZExt( s_of_bit, llvm::IntegerType::get( *rtn->llvm_ctx, 64 ) ); - auto sf = rtn->compute_sf( byte_size, u_sum ); - auto zf = rtn->compute_zf( byte_size, u_sum ); + auto sf = rtn->sf( byte_size, u_sum ); + auto zf = rtn->zf( byte_size, u_sum ); auto pf = llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ); // TODO make clean PF bit computation... - auto flags_calc = rtn->combine_flags( + auto flags_calc = rtn->flags( cf, pf, llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ), zf, sf, of ); return flags_calc; diff --git a/src/lifters/nand.cpp b/src/lifters/nand.cpp index 8ec8fa0..f2ca24e 100644 --- a/src/lifters/nand.cpp +++ b/src/lifters/nand.cpp @@ -7,11 +7,11 @@ namespace vm auto cf = llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ); auto of = llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ); - auto sf = rtn->compute_sf( byte_size, result ); - auto zf = rtn->compute_zf( byte_size, result ); + auto sf = rtn->sf( byte_size, result ); + auto zf = rtn->zf( byte_size, result ); auto pf = llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ); - return rtn->combine_flags( cf, pf, llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ), + return rtn->flags( cf, pf, llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ), zf, sf, of ); } diff --git a/src/lifters/popvsp.cpp b/src/lifters/popvsp.cpp new file mode 100644 index 0000000..6d8d600 --- /dev/null +++ b/src/lifters/popvsp.cpp @@ -0,0 +1,16 @@ +#include + +namespace vm +{ + lifters_t::lifter_callback_t lifters_t::popvsp = + [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, + llvm::IRBuilder<> *ir_builder ) { + auto &vmp_rtn = rtn->vmp_rtns.back(); + auto stack = ir_builder->CreateLoad( vmp_rtn->stack ); + auto stack_ptr_ptr = ir_builder->CreatePointerCast( + stack, llvm::PointerType::get( llvm::PointerType::get( ir_builder->getInt8Ty(), 0ull ), 0ull ) ); + + auto stack_ptr = ir_builder->CreateLoad( stack_ptr_ptr ); + ir_builder->CreateStore( stack_ptr, vmp_rtn->stack ); + }; +} \ No newline at end of file diff --git a/src/lifters/shr.cpp b/src/lifters/shr.cpp index 43e5b7a..03a74f6 100644 --- a/src/lifters/shr.cpp +++ b/src/lifters/shr.cpp @@ -11,12 +11,12 @@ namespace vm auto cf = rtn->ir_builder->CreateZExt( msb, llvm::IntegerType::get( *rtn->llvm_ctx, 64 ) ); auto of = - rtn->compute_sf( byte_size, lhs ); // we reuse the compute_sf helper since the flag expression is the same - auto sf = rtn->compute_sf( byte_size, result ); - auto zf = rtn->compute_zf( byte_size, result ); + rtn->sf( byte_size, lhs ); // we reuse the compute_sf helper since the flag expression is the same + auto sf = rtn->sf( byte_size, result ); + auto zf = rtn->zf( byte_size, result ); auto pf = llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ); - return rtn->combine_flags( cf, pf, llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ), + return rtn->flags( cf, pf, llvm::ConstantInt::get( llvm::IntegerType::get( *rtn->llvm_ctx, 64 ), 0 ), zf, sf, of ); } diff --git a/src/main.cpp b/src/main.cpp index 2c25662..c300f99 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -8,6 +8,8 @@ int main( int argc, const char *argv[] ) { argparse::argument_parser_t parser( "vmdevirt", "virtual instruction pseudo code generator" ); parser.add_argument().name( "--vmp2file" ).required( true ).description( "path to .vmp2 file..." ); + parser.add_argument().name( "--bin" ).required( true ).description( + "path to the image in which to apply devirtualized code too...\n" ); parser.enable_help(); auto err = parser.parse( argc, argv ); diff --git a/src/vmp_rtn_t.cpp b/src/vmp_rtn_t.cpp index 35c2180..2f7d910 100644 --- a/src/vmp_rtn_t.cpp +++ b/src/vmp_rtn_t.cpp @@ -27,13 +27,10 @@ namespace vm void vmp_rtn_t::create_routine( void ) { - // function has no arguments and returns void... maybe change this in the future as i learn - // more and more LLVM... auto func_ty = llvm::FunctionType::get( llvm::PointerType::getInt8PtrTy( ir_builder->getContext() ), { llvm::PointerType::getInt8PtrTy( ir_builder->getContext() ) }, false ); - // convert the rtn_begin address to a hex string and prepend "rtn_" to it... std::stringstream rtn_name; rtn_name << "rtn_" << std::hex << rtn_begin; llvm_fptr = llvm::Function::Create( func_ty, llvm::GlobalValue::LinkageTypes::ExternalLinkage,