main(){ printf("size: %d bytes\n", strlen(sc)); SET_PORT(sc, 33333); SET_IP(sc, "127.0.0.1"); __asm__("call sc"); }
bool RarVM::ExecuteCode(VM_PreparedCommand *PreparedCode,int CodeSize) { int MaxOpCount=25000000; VM_PreparedCommand *Cmd=PreparedCode; while (1) { unsigned int *Op1=GetOperand(&Cmd->Op1); unsigned int *Op2=GetOperand(&Cmd->Op2); switch(Cmd->OpCode) { #ifndef NORARVM case VM_MOV: SET_VALUE(Cmd->ByteMode,Op1,GET_VALUE(Cmd->ByteMode,Op2)); break; #ifdef VM_OPTIMIZE case VM_MOVB: SET_VALUE(true,Op1,GET_VALUE(true,Op2)); break; case VM_MOVD: SET_VALUE(false,Op1,GET_VALUE(false,Op2)); break; #endif case VM_CMP: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int Result=UINT32(Value1-GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); } break; #ifdef VM_OPTIMIZE case VM_CMPB: { unsigned int Value1=GET_VALUE(true,Op1); unsigned int Result=UINT32(Value1-GET_VALUE(true,Op2)); Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); } break; case VM_CMPD: { unsigned int Value1=GET_VALUE(false,Op1); unsigned int Result=UINT32(Value1-GET_VALUE(false,Op2)); Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); } break; #endif case VM_ADD: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int Result=UINT32(Value1+GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:(Result<Value1)|(Result&VM_FS); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; #ifdef VM_OPTIMIZE case VM_ADDB: SET_VALUE(true,Op1,GET_VALUE(true,Op1)+GET_VALUE(true,Op2)); break; case VM_ADDD: SET_VALUE(false,Op1,GET_VALUE(false,Op1)+GET_VALUE(false,Op2)); break; #endif case VM_SUB: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int Result=UINT32(Value1-GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:(Result>Value1)|(Result&VM_FS); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; #ifdef VM_OPTIMIZE case VM_SUBB: SET_VALUE(true,Op1,GET_VALUE(true,Op1)-GET_VALUE(true,Op2)); break; case VM_SUBD: SET_VALUE(false,Op1,GET_VALUE(false,Op1)-GET_VALUE(false,Op2)); break; #endif case VM_JZ: if ((Flags & VM_FZ)!=0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_JNZ: if ((Flags & VM_FZ)==0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_INC: { unsigned int Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)+1); SET_VALUE(Cmd->ByteMode,Op1,Result); Flags=Result==0 ? VM_FZ:Result&VM_FS; } break; #ifdef VM_OPTIMIZE case VM_INCB: SET_VALUE(true,Op1,GET_VALUE(true,Op1)+1); break; case VM_INCD: SET_VALUE(false,Op1,GET_VALUE(false,Op1)+1); break; #endif case VM_DEC: { unsigned int Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)-1); SET_VALUE(Cmd->ByteMode,Op1,Result); Flags=Result==0 ? VM_FZ:Result&VM_FS; } break; #ifdef VM_OPTIMIZE case VM_DECB: SET_VALUE(true,Op1,GET_VALUE(true,Op1)-1); break; case VM_DECD: SET_VALUE(false,Op1,GET_VALUE(false,Op1)-1); break; #endif case VM_JMP: SET_IP(GET_VALUE(false,Op1)); continue; case VM_XOR: { unsigned int Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)^GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:Result&VM_FS; SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_AND: { unsigned int Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)&GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:Result&VM_FS; SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_OR: { unsigned int Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)|GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:Result&VM_FS; SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_TEST: { unsigned int Result=UINT32(GET_VALUE(Cmd->ByteMode,Op1)&GET_VALUE(Cmd->ByteMode,Op2)); Flags=Result==0 ? VM_FZ:Result&VM_FS; } break; case VM_JS: if ((Flags & VM_FS)!=0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_JNS: if ((Flags & VM_FS)==0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_JB: if ((Flags & VM_FC)!=0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_JBE: if ((Flags & (VM_FC|VM_FZ))!=0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_JA: if ((Flags & (VM_FC|VM_FZ))==0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_JAE: if ((Flags & VM_FC)==0) { SET_IP(GET_VALUE(false,Op1)); continue; } break; case VM_PUSH: R[7]-=4; SET_VALUE(false,(unsigned int *)&Mem[R[7]&VM_MEMMASK],GET_VALUE(false,Op1)); break; case VM_POP: SET_VALUE(false,Op1,GET_VALUE(false,(unsigned int *)&Mem[R[7] & VM_MEMMASK])); R[7]+=4; break; case VM_CALL: R[7]-=4; SET_VALUE(false,(unsigned int *)&Mem[R[7]&VM_MEMMASK],Cmd-PreparedCode+1); SET_IP(GET_VALUE(false,Op1)); continue; case VM_NOT: SET_VALUE(Cmd->ByteMode,Op1,~GET_VALUE(Cmd->ByteMode,Op1)); break; case VM_SHL: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int Value2=GET_VALUE(Cmd->ByteMode,Op2); unsigned int Result=UINT32(Value1<<Value2); Flags=(Result==0 ? VM_FZ:(Result&VM_FS))|((Value1<<(Value2-1))&0x80000000 ? VM_FC:0); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_SHR: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int Value2=GET_VALUE(Cmd->ByteMode,Op2); unsigned int Result=UINT32(Value1>>Value2); Flags=(Result==0 ? VM_FZ:(Result&VM_FS))|((Value1>>(Value2-1))&VM_FC); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_SAR: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int Value2=GET_VALUE(Cmd->ByteMode,Op2); unsigned int Result=UINT32(((int)Value1)>>Value2); Flags=(Result==0 ? VM_FZ:(Result&VM_FS))|((Value1>>(Value2-1))&VM_FC); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_NEG: { unsigned int Result=UINT32(-GET_VALUE(Cmd->ByteMode,Op1)); Flags=Result==0 ? VM_FZ:VM_FC|(Result&VM_FS); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; #ifdef VM_OPTIMIZE case VM_NEGB: SET_VALUE(true,Op1,-GET_VALUE(true,Op1)); break; case VM_NEGD: SET_VALUE(false,Op1,-GET_VALUE(false,Op1)); break; #endif case VM_PUSHA: { const int RegCount=sizeof(R)/sizeof(R[0]); for (int I=0,SP=R[7]-4;I<RegCount;I++,SP-=4) SET_VALUE(false,(unsigned int *)&Mem[SP & VM_MEMMASK],R[I]); R[7]-=RegCount*4; } break; case VM_POPA: { const int RegCount=sizeof(R)/sizeof(R[0]); for (unsigned int I=0,SP=R[7];I<RegCount;I++,SP+=4) R[7-I]=GET_VALUE(false,(unsigned int *)&Mem[SP & VM_MEMMASK]); } break; case VM_PUSHF: R[7]-=4; SET_VALUE(false,(unsigned int *)&Mem[R[7]&VM_MEMMASK],Flags); break; case VM_POPF: Flags=GET_VALUE(false,(unsigned int *)&Mem[R[7] & VM_MEMMASK]); R[7]+=4; break; case VM_MOVZX: SET_VALUE(false,Op1,GET_VALUE(true,Op2)); break; case VM_MOVSX: SET_VALUE(false,Op1,(signed char)GET_VALUE(true,Op2)); break; case VM_XCHG: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); SET_VALUE(Cmd->ByteMode,Op1,GET_VALUE(Cmd->ByteMode,Op2)); SET_VALUE(Cmd->ByteMode,Op2,Value1); } break; case VM_MUL: { unsigned int Result=GET_VALUE(Cmd->ByteMode,Op1)*GET_VALUE(Cmd->ByteMode,Op2); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_DIV: { unsigned int Divider=GET_VALUE(Cmd->ByteMode,Op2); if (Divider!=0) { unsigned int Result=GET_VALUE(Cmd->ByteMode,Op1)/Divider; SET_VALUE(Cmd->ByteMode,Op1,Result); } } break; case VM_ADC: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int FC=(Flags&VM_FC); unsigned int Result=UINT32(Value1+GET_VALUE(Cmd->ByteMode,Op2)+FC); Flags=Result==0 ? VM_FZ:(Result<Value1 || Result==Value1 && FC)|(Result&VM_FS); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; case VM_SBB: { unsigned int Value1=GET_VALUE(Cmd->ByteMode,Op1); unsigned int FC=(Flags&VM_FC); unsigned int Result=UINT32(Value1-GET_VALUE(Cmd->ByteMode,Op2)-FC); Flags=Result==0 ? VM_FZ:(Result>Value1 || Result==Value1 && FC)|(Result&VM_FS); SET_VALUE(Cmd->ByteMode,Op1,Result); } break; #endif case VM_RET: if (R[7]>=VM_MEMSIZE) return(true); SET_IP(GET_VALUE(false,(unsigned int *)&Mem[R[7] & VM_MEMMASK])); R[7]+=4; continue; #ifdef VM_STANDARDFILTERS case VM_STANDARD: ExecuteStandardFilter((VM_StandardFilters)Cmd->Op1.Data); break; #endif case VM_PRINT: #ifdef DEBUG PrintState(Cmd-PreparedCode); #endif break; } Cmd++; --MaxOpCount; } }