void SeniorVMHandle::d_sub(long _register1,long _register2) { d_not(_register1); pop(T_INVALID); pop(T_TMP_REGISTER8); d_add(T_TMP_REGISTER8,_register2); // pop(T_INVALID); pop(T_TMP_REGISTER6); //eflag 1 d_copy_stack(); d_not_and(); pop(T_TMP_REGISTER7); //eflag 2 //pop(T_TMP_REGISTER8); //结果 d_not(T_TMP_REGISTER6); pop(T_INVALID); w_push_imm_sx(0xf7ea); d_not_and(); pop(T_INVALID); pop(T_TMP_REGISTER6); d_not(T_TMP_REGISTER7); pop(T_INVALID); w_push_imm_sx(0x815); d_not_and(); pop(T_INVALID); pop(T_TMP_REGISTER7); d_add(T_TMP_REGISTER6,T_TMP_REGISTER7); pop(T_INVALID); }
void SeniorVMHandle::w_sub(long _register1,long _register2) { w_not(_register1); //sub eax,ebx = add((not eax),ebx) pop(T_INVALID); pop(T_TMP_R16_8); b_add(T_TMP_R16_8,_register2); // pop(T_INVALID); pop(T_TMP_REGISTER6); //eflag 1 w_copy_stack(); w_not_and(); pop(T_TMP_REGISTER7); //eflag 2 //pop(T_TMP_REGISTER8); //结果 d_not(T_TMP_REGISTER6); pop(T_INVALID); w_push_imm_sx(0xf7ea); d_not_and(); pop(T_INVALID); pop(T_TMP_REGISTER6); d_not(T_TMP_REGISTER7); pop(T_INVALID); w_push_imm_sx(0x815); d_not_and(); pop(T_INVALID); pop(T_TMP_REGISTER7); d_add(T_TMP_REGISTER6,T_TMP_REGISTER7); pop(T_INVALID); }
void SeniorVMHandle::d_and(long _register1,long _register2) { d_not(_register2); pop(T_INVALID); d_not(_register1); pop(T_INVALID); db(HANDLE.d_nand.handle); }
void SeniorVMHandle::d_and(long _register1,long _register2,bool is_data) { if (is_data) { d_not( _register2 , true ); pop( T_INVALID ); d_not( _register1 ); pop( T_INVALID ); db( GET_HANDLE( d_nand ) ); return; } d_not(_register2); pop(T_INVALID); d_not(_register1); pop(T_INVALID); db(HANDLE.d_nand.handle); }
void SeniorVMHandle::d_not(long _register) { if (_register == 0) { db(HANDLE.d_nand.handle); return; } char n = rand()%101; if (n <= 10) { d_not(_register); //a = nand(_r,_r); pop(T_INVALID); d_not(_register); //b = nand(_r,_r); pop(T_INVALID); db(HANDLE.d_nand.handle); //nand(a,b) pop(T_INVALID); d_not(_register); //a = nand(_r,_r); pop(T_INVALID); d_not(_register); //b = nand(_r,_r); pop(T_INVALID); db(HANDLE.d_nand.handle); //nand(a,b) pop(T_INVALID); db(HANDLE.d_nand.handle); return; } push(_register,false); db(HANDLE.push_stack_top_base.handle); db(HANDLE.d_read_mem.handle); //#ifndef PROTECT_X64 //db(HANDLE.push_stack_top_base.handle); //db(HANDLE.d_read_mem.handle); //pop(_register); //#endif db(HANDLE.d_nand.handle); }
void SeniorVMHandle::d_add(long _register1,long _register2) { //push(_register1,false); //push(_register2,false); //db(HANDLE.d_add); //return; /* db(HANDLE.d_push_imm.handle); dd(1<<31); pcode->v_pop_register(T_TMP_REGISTER3); d_and(_register1,T_TMP_REGISTER3); pcode->v_pop_register(T_INVALID); db(HANDLE.b_push_imm.handle); db(20); db(HANDLE.d_shr.handle); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_EFLAG);*/ d_xor(_register1,_register2); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER1); d_not(T_TMP_REGISTER1); pcode->v_pop_register(T_INVALID); db(HANDLE.d_push_imm.handle); dd(0x80000000); pcode->v_pop_register(T_TMP_REGISTER2); pcode->v_pop_register(T_TMP_REGISTER3); d_and(T_TMP_REGISTER3,T_TMP_REGISTER2); pcode->v_pop_register(T_INVALID); // db(HANDLE.b_push_imm.handle); // db(20); // db(HANDLE.d_shr.handle); // pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_EFLAG); d_add_d(_register1,_register2); for (int i = 0; i < 31; ++i) //6次 留一次填充标志位 { d_add_d(T_TMP_REGISTER2,T_TMP_REGISTER1); } //pcode->v_push_register(T_TMP_R32_2); // pcode->v_push_register(T_TMP_EFLAG); //pcode->v_push_register(T_TMP_REGISTER1); ///OF 判断是否溢出 d_xor(_register2,T_TMP_REGISTER1); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); db(HANDLE.d_push_imm.handle); dd(0x80000000); pcode->v_pop_register(T_TMP_REGISTER4); d_and(T_TMP_REGISTER4,T_TMP_REGISTER3); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); d_and(T_TMP_EFLAG,T_TMP_REGISTER3); pcode->v_pop_register(T_INVALID); db(HANDLE.b_push_imm.handle); db(20); db(HANDLE.d_shr.handle); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER4); //db(HANDLE.d_push_imm.handle); //dd(0x800); //pcode->v_pop_register(T_TMP_REGISTER3); // d_and(T_TMP_REGISTER3,T_TMP_REGISTER4); // pcode->v_pop_register(T_INVALID); //pcode->v_pop_register(T_TMP_REGISTER3); //d_and(T_TMP_EFLAG,T_TMP_REGISTER3); //这时候的OF还在最高位 //pcode->v_pop_register(T_INVALID); //pcode->v_pop_register(T_TMP_REGISTER3); //db(HANDLE.d_push_imm.handle); //dd(0xFFFFF7FF); //pcode->v_pop_register(T_TMP_REGISTER3); //d_or(T_TMP_REGISTER3,T_TMP_REGISTER4); //pcode->v_pop_register(T_INVALID); //pcode->v_pop_register(T_TMP_REGISTER4); d_or(T_TMP_EFLAG,T_TMP_REGISTER4); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_EFLAG); /*pcode->v_push_register(T_TMP_EFLAG); db(HANDLE.push_esp.handle); db(HANDLE.d_read_mem.handle); pcode->v_pop_register(T_TMP_EFLAG); db(HANDLE.b_push_imm.handle); db(20); db(HANDLE.d_shl.handle); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); d_xor(_register1,T_TMP_REGISTER3); pcode->v_pop_register(T_INVALID); //pcode->v_pop_register(T_TMP_REGISTER3); db(HANDLE.b_push_imm.handle); db(20); db(HANDLE.d_shr.handle); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER4); db(HANDLE.d_push_imm.handle); dd(0x800); pcode->v_pop_register(T_TMP_REGISTER3); d_and(T_TMP_REGISTER3,T_TMP_REGISTER4); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); d_and(T_TMP_EFLAG,T_TMP_REGISTER3); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); d_or(T_TMP_EFLAG,T_TMP_REGISTER3); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_EFLAG);*/ /////end OF d_and(T_TMP_REGISTER1,T_TMP_REGISTER1); pcode->v_pop_register(T_TMP_REGISTER2); //EFLAG d_or(T_TMP_EFLAG,T_TMP_REGISTER2); pcode->v_pop_register(T_INVALID); /* pcode->v_push_register(T_TMP_EFLAG); db(HANDLE.push_esp.handle); db(HANDLE.d_read_mem.handle); pcode->v_pop_register(T_TMP_EFLAG); db(HANDLE.b_push_imm.handle); db(31); db(HANDLE.d_shr.handle); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); d_or(T_TMP_REGISTER3,T_TMP_REGISTER2); pcode->v_pop_register(T_INVALID); /* pcode->v_pop_register(T_TMP_REGISTER2); pcode->v_push_register(T_TMP_EFLAG); db(HANDLE.push_esp.handle); db(HANDLE.d_read_mem.handle); pcode->v_pop_register(T_TMP_EFLAG); db(HANDLE.b_push_imm.handle); db(3); db(HANDLE.d_shr.handle); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER3); d_and(T_TMP_REGISTER3,T_TMP_REGISTER2); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER2); pcode->v_push_register(T_TMP_EFLAG); db(HANDLE.d_push_imm.handle); db(1<<11); pcode->v_pop_register(T_TMP_REGISTER3); d_xor(T_TMP_REGISTER3,T_TMP_REGISTER2); pcode->v_pop_register(T_INVALID); //pcode->v_push_register(T_TMP_REGISTER3); pcode->v_pop_register(T_TMP_REGISTER4); d_and(T_TMP_REGISTER3,T_TMP_REGISTER4); pcode->v_pop_register(T_INVALID); pcode->v_pop_register(T_TMP_REGISTER4); d_or(T_TMP_REGISTER4,T_TMP_REGISTER2); pcode->v_pop_register(T_INVALID);*/ //db(HANDLE.push_esp.handle); //db(HANDLE.d_read_mem.handle); // pcode->v_pop_register(T_EAX); }