parent
9e26605601
commit
1840945596
@ -0,0 +1,25 @@
|
|||||||
|
#include <vmp2.hpp>
|
||||||
|
#include <vmprofiles.hpp>
|
||||||
|
#include <vtil/vtil>
|
||||||
|
|
||||||
|
namespace vm::lifters
|
||||||
|
{
|
||||||
|
using lifter_callback_t = std::function< void( vtil::basic_block *, vm::instrs::virt_instr_t * ) >;
|
||||||
|
using lifter_t = std::pair< vm::handler::mnemonic_t, lifter_callback_t >;
|
||||||
|
|
||||||
|
// taken from
|
||||||
|
// https://github.com/can1357/NoVmp/blob/6c23c9a335f70e8d5ed6299668fd802f2314c896/NoVmp/vmprotect/il2vtil.cpp#L66
|
||||||
|
inline constexpr vtil::register_desc make_virtual_register( uint8_t context_offset, uint8_t size )
|
||||||
|
{
|
||||||
|
fassert( ( ( context_offset & 7 ) + size ) <= 8 && size );
|
||||||
|
|
||||||
|
return { vtil::register_virtual, ( size_t )context_offset / 8, size * 8, ( context_offset % 8 ) * 8 };
|
||||||
|
}
|
||||||
|
|
||||||
|
extern lifter_t lregq;
|
||||||
|
extern lifter_t addq, adddw, addw;
|
||||||
|
|
||||||
|
inline std::map< vm::handler::mnemonic_t, lifter_callback_t > all = {
|
||||||
|
lregq, addq, adddw, addw
|
||||||
|
};
|
||||||
|
} // namespace vm::lifters
|
@ -0,0 +1,37 @@
|
|||||||
|
#include <vmlifters.hpp>
|
||||||
|
|
||||||
|
namespace vm::lifters
|
||||||
|
{
|
||||||
|
lifter_t addq = {
|
||||||
|
// vsp[0] = vsp[1] + vsp[0];
|
||||||
|
vm::handler::ADDQ, []( vtil::basic_block *blk, vm::instrs::virt_instr_t *vinstr ) {
|
||||||
|
auto [ t0, t1 ] = blk->tmp( 64, 64 );
|
||||||
|
blk->pop( t0 );
|
||||||
|
blk->pop( t1 );
|
||||||
|
blk->add( t1, t0 );
|
||||||
|
blk->push( t1 );
|
||||||
|
blk->pushf();
|
||||||
|
} };
|
||||||
|
|
||||||
|
lifter_t adddw = {
|
||||||
|
// vsp[0] = vsp[1] + vsp[0];
|
||||||
|
vm::handler::ADDDW, []( vtil::basic_block *blk, vm::instrs::virt_instr_t *vinstr ) {
|
||||||
|
auto [ t0, t1 ] = blk->tmp( 32, 32 );
|
||||||
|
blk->pop( t0 );
|
||||||
|
blk->pop( t1 );
|
||||||
|
blk->add( t1, t0 );
|
||||||
|
blk->push( t1 );
|
||||||
|
blk->pushf();
|
||||||
|
} };
|
||||||
|
|
||||||
|
lifter_t addw = {
|
||||||
|
// vsp[0] = vsp[1] + vsp[0];
|
||||||
|
vm::handler::ADDW, []( vtil::basic_block *blk, vm::instrs::virt_instr_t *vinstr ) {
|
||||||
|
auto [ t0, t1 ] = blk->tmp( 16, 16 );
|
||||||
|
blk->pop( t0 );
|
||||||
|
blk->pop( t1 );
|
||||||
|
blk->add( t1, t0 );
|
||||||
|
blk->push( t1 );
|
||||||
|
blk->pushf();
|
||||||
|
} };
|
||||||
|
} // namespace vm::lifters
|
@ -0,0 +1,10 @@
|
|||||||
|
#include <vmlifters.hpp>
|
||||||
|
|
||||||
|
namespace vm::lifters
|
||||||
|
{
|
||||||
|
lifter_t lregq = {
|
||||||
|
// push vregX
|
||||||
|
vm::handler::LREGQ, []( vtil::basic_block *blk, vm::instrs::virt_instr_t *vinstr ) {
|
||||||
|
blk->push( make_virtual_register( vinstr->operand.imm.u, 8 ) );
|
||||||
|
} };
|
||||||
|
}
|
Loading…
Reference in new issue