From 014c1a08cd3bb85dabcd1052b08b75efec7551aa Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Tue, 31 Aug 2021 21:17:32 -0700 Subject: [PATCH] added more lifters... --- CMakeLists.txt | 2 ++ include/vm_lifters.hpp | 10 ++++++++-- src/lifters/lconst.cpp | 6 ++++++ src/lifters/shld.cpp | 21 +++++++++++++++++++++ src/lifters/shr.cpp | 15 +++++++++++++++ src/lifters/shrd.cpp | 21 +++++++++++++++++++++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/lifters/shrd.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 8216de0..40cb428 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,7 +58,9 @@ list(APPEND vmdevirt_SOURCES "src/lifters/readgs.cpp" "src/lifters/sflags.cpp" "src/lifters/shl.cpp" + "src/lifters/shld.cpp" "src/lifters/shr.cpp" + "src/lifters/shrd.cpp" "src/lifters/sreg.cpp" "src/lifters/vmexit.cpp" "src/lifters/write.cpp" diff --git a/include/vm_lifters.hpp b/include/vm_lifters.hpp index b8cd77c..7e37a80 100644 --- a/include/vm_lifters.hpp +++ b/include/vm_lifters.hpp @@ -29,7 +29,7 @@ namespace vm const vm::instrs::virt_instr_t &vinstr, llvm::IRBuilder<> *ir_builder ) >; static lifter_callback_t lconstq, lconstdwsxq, lconstwsxq, lconstbzxw, lconstbsxq, lconstwsxdw, lconstdw, - lconstbsxdw; + lconstw, lconstbsxdw; static lifter_callback_t addq, adddw, addw, addb; static lifter_callback_t sregq, sregdw, sregw, sregb; @@ -40,8 +40,10 @@ namespace vm static lifter_callback_t writeq, writedw, writew, writeb; static lifter_callback_t readq, readdw, readw, readb; static lifter_callback_t nandq, nanddw, nandw, nandb; - static lifter_callback_t shrq, shrdw; + static lifter_callback_t shrq, shrdw, shrw; static lifter_callback_t shlq, shldw; + static lifter_callback_t shlddw; + static lifter_callback_t shrdq; static lifter_callback_t jmp; static lifter_callback_t lflagsq; static lifter_callback_t vmexit; @@ -50,6 +52,7 @@ namespace vm std::map< vm::handler::mnemonic_t, lifter_callback_t * > lifters = { { vm::handler::LCONSTQ, &lconstq }, { vm::handler::LCONSTDW, &lconstdw }, + { vm::handler::LCONSTW, &lconstw }, { vm::handler::LCONSTDWSXQ, &lconstdwsxq }, { vm::handler::LCONSTWSXQ, &lconstwsxq }, { vm::handler::LCONSTBZXW, &lconstbzxw }, @@ -62,8 +65,11 @@ namespace vm { vm::handler::ADDB, &addb }, { vm::handler::SHRQ, &shrq }, { vm::handler::SHRDW, &shrdw }, + { vm::handler::SHRW, &shrw }, { vm::handler::SHLQ, &shlq }, { vm::handler::SHLDW, &shldw }, + { vm::handler::SHLDDW, &shlddw }, + { vm::handler::SHRDQ, &shrdq }, { vm::handler::IMULQ, &imulq }, { vm::handler::IMULDW, &imuldw }, { vm::handler::PUSHVSPQ, &pushvsp }, diff --git a/src/lifters/lconst.cpp b/src/lifters/lconst.cpp index 1e7d32e..4d5e81e 100644 --- a/src/lifters/lconst.cpp +++ b/src/lifters/lconst.cpp @@ -32,6 +32,12 @@ namespace vm rtn->push( 4, llvm::ConstantInt::get( ir_builder->getInt32Ty(), vinstr.operand.imm.u ) ); }; + lifters_t::lifter_callback_t lifters_t::lconstw = + [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, + llvm::IRBuilder<> *ir_builder ) { + rtn->push( 2, llvm::ConstantInt::get( ir_builder->getInt16Ty(), vinstr.operand.imm.u ) ); + }; + lifters_t::lifter_callback_t lifters_t::lconstwsxdw = [ & ]( vm::devirt_t *rtn, const vm::instrs::code_block_t &vm_code_block, const vm::instrs::virt_instr_t &vinstr, llvm::IRBuilder<> *ir_builder ) { diff --git a/src/lifters/shld.cpp b/src/lifters/shld.cpp index e69de29..f1b1567 100644 --- a/src/lifters/shld.cpp +++ b/src/lifters/shld.cpp @@ -0,0 +1,21 @@ +#include + +namespace vm +{ + lifters_t::lifter_callback_t lifters_t::shlddw = + [ & ]( 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 t1 = rtn->pop( 4 ); + auto t2 = rtn->pop( 4 ); + auto t3 = rtn->pop( 2 ); + + // TODO: this is wrong - replace with more logic! + auto t4 = ir_builder->CreateShl( t1, ir_builder->CreateIntCast( t3, ir_builder->getInt32Ty(), false ) ); + + rtn->push( 4, t4 ); + auto &vmp_rtn = rtn->vmp_rtns.back(); + + // TODO: update rflags... + rtn->push( 8, rtn->load_value( 8, vmp_rtn->flags ) ); + }; +} \ No newline at end of file diff --git a/src/lifters/shr.cpp b/src/lifters/shr.cpp index 32800ff..d5d8a22 100644 --- a/src/lifters/shr.cpp +++ b/src/lifters/shr.cpp @@ -47,4 +47,19 @@ namespace vm rtn->push( 4, t4 ); rtn->push( 8, rtn->load_value( 8, vmp_rtn->flags ) ); }; + + lifters_t::lifter_callback_t lifters_t::shrw = + [ & ]( 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 t1 = rtn->pop( 2 ); + auto t2 = rtn->pop( 2 ); + auto t3 = ir_builder->CreateIntCast( t2, llvm::IntegerType::get( *rtn->llvm_ctx, 16 ), false ); + auto t4 = ir_builder->CreateLShr( t1, t3 ); + + auto &vmp_rtn = rtn->vmp_rtns.back(); + auto flags = lifters_t::shr_flags( rtn, 2, t1, t3, t4 ); + ir_builder->CreateStore( flags, vmp_rtn->flags ); + rtn->push( 2, t4 ); + rtn->push( 8, rtn->load_value( 8, vmp_rtn->flags ) ); + }; } // namespace vm \ No newline at end of file diff --git a/src/lifters/shrd.cpp b/src/lifters/shrd.cpp new file mode 100644 index 0000000..758ee04 --- /dev/null +++ b/src/lifters/shrd.cpp @@ -0,0 +1,21 @@ +#include + +namespace vm +{ + lifters_t::lifter_callback_t lifters_t::shrdq = + [ & ]( 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 t1 = rtn->pop( 8 ); + auto t2 = rtn->pop( 8 ); + auto t3 = rtn->pop( 2 ); + + // TODO: this is wrong - replace with more logic! + auto t4 = ir_builder->CreateLShr( t1, ir_builder->CreateIntCast( t3, ir_builder->getInt64Ty(), false ) ); + + rtn->push( 8, t4 ); + auto &vmp_rtn = rtn->vmp_rtns.back(); + + // TODO: update rflags... + rtn->push( 8, rtn->load_value( 8, vmp_rtn->flags ) ); + }; +} \ No newline at end of file