📄 protectedmodeudecoder.java
字号:
bytesRead += 3; break; case 4: immediate = (source.getByte() & 0xff) | ((source.getByte() << 8) & 0xff00) | ((source.getByte() << 16) & 0xff0000) | ((source.getByte() << 24) & 0xff000000); bytesRead += 4; break; case 6: immediate = 0xffffffffl & ((source.getByte() & 0xff) | ((source.getByte() << 8) & 0xff00) | ((source.getByte() << 16) & 0xff0000) | ((source.getByte() << 24) & 0xff000000)); immediate |= ((source.getByte() & 0xffl) | ((source.getByte() << 8) & 0xff00l)) << 32; bytesRead += 6; break; default: System.err.println("Immediate Longer Than 6-bytes"); break; } //write out input operands writeInputOperands(prefices, opcode, modrm, sib, displacement, immediate); //write out calculation writeOperation(prefices, opcode, modrm); //write out output operands writeOutputOperands(prefices, opcode, modrm, sib, displacement); //write out flags writeFlags(prefices, opcode, modrm); if (isJump(opcode, modrm)) return -bytesRead; else return bytesRead; } private void writeOperation(int prefices, int opcode, int modrm) { switch (opcode) { case 0x00: //ADD Eb, Gb case 0x01: //ADD Ev, Gv case 0x02: //ADD Gb, Eb case 0x03: //ADD Gv, Ev case 0x04: //ADD AL, Ib case 0x05: //ADD eAX, Iv case 0xfc0: //XADD Eb, Gb case 0xfc1: working.write(ADD); break; //XADD Ev, Gv case 0x08: //OR Eb, Gb case 0x09: //OR Ev, Gv case 0x0a: //OR Gb, Eb case 0x0b: //OR Gv, Ev case 0x0c: //OR AL, Ib case 0x0d: working.write(OR ); break; //OR eAX, Iv case 0x10: //ADC Eb, Gb case 0x11: //ADC Ev, Gv case 0x12: //ADC Gb, Eb case 0x13: //ADC Gv, Ev case 0x14: //ADC AL, Ib case 0x15: working.write(ADC); break; //ADC eAX, Iv case 0x18: //SBB Eb, Gb case 0x19: //SBB Ev, Gv case 0x1a: //SBB Gb, Eb case 0x1b: //SBB Gv, Ev case 0x1c: //SBB AL, Ib case 0x1d: working.write(SBB); break; //SBB eAX, Iv case 0x20: //AND Eb, Gb case 0x21: //AND Ev, Gv case 0x22: //AND Gb, Eb case 0x23: //AND Gv, Ev case 0x24: //AND AL, Ib case 0x25: //AND eAX, Iv case 0x84: //TEST Eb, Gb case 0x85: //TEST Ev, Gv case 0xa8: //TEST AL, Ib case 0xa9: working.write(AND); break; //TEST eAX, Iv case 0x27: working.write(DAA); break; //DAA case 0x28: //SUB Eb, Gb case 0x29: //SUB Ev, Gv case 0x2a: //SUB Gb, Eb case 0x2b: //SUB Gv, Ev case 0x2c: //SUB AL, Ib case 0x2d: //SUB eAX, Iv case 0x38: //CMP Eb, Gb case 0x39: //CMP Ev, Gv case 0x3a: //CMP Gb, Eb case 0x3b: //CMP Gv, Ev case 0x3c: //CMP AL, Ib case 0x3d: working.write(SUB); break; //CMP eAX, Iv case 0x2f: working.write(DAS); break; //DAS case 0x30: //XOR Eb, Gb case 0x31: //XOR Ev, Gv case 0x32: //XOR Gb, Eb case 0x33: //XOR Gv, Ev case 0x34: //XOR AL, Ib case 0x35: working.write(XOR); break; //XOR eAX, Iv case 0x37: working.write(AAA); break; //AAA case 0x3f: working.write(AAS); break; //AAS case 0x40: //INC eAX case 0x41: //INC eCX case 0x42: //INC eDX case 0x43: //INC eBX case 0x44: //INC eSP case 0x45: //INC eBP case 0x46: //INC eSI case 0x47: working.write(INC); break; //INC eDI case 0x48: //DEC eAX case 0x49: //DEC eCX case 0x4a: //DEC eDX case 0x4b: //DEC eBX case 0x4c: //DEC eSP case 0x4d: //DEC eBP case 0x4e: //DEC eSI case 0x4f: working.write(DEC); break; //DEC eDI case 0x06: //PUSH ES case 0x0e: //PUSH CS case 0x16: //PUSH SS case 0x1e: //PUSH DS case 0x50: //PUSH eAX case 0x51: //PUSH eCX case 0x52: //PUSH eDX case 0x53: //PUSH eBX case 0x54: //PUSH eSP case 0x55: //PUSH eBP case 0x56: //PUSH eSI case 0x57: //PUSH eDI case 0x68: //PUSH Iv case 0x6a: //PUSH Ib case 0xfa0: //PUSH FS case 0xfa8: //PUSH GS switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) { case 0: working.write(PUSH_O16_A16); break; case PREFICES_OPERAND: working.write(PUSH_O32_A16); break; case PREFICES_ADDRESS: working.write(PUSH_O16_A32); break; case PREFICES_ADDRESS | PREFICES_OPERAND: working.write(PUSH_O32_A32); break; } break; case 0x9c: //PUSHF switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) { case 0: working.write(PUSHF_O16_A16); break; case PREFICES_OPERAND: working.write(PUSHF_O32_A16); break; case PREFICES_ADDRESS: working.write(PUSHF_O16_A32); break; case PREFICES_ADDRESS | PREFICES_OPERAND: working.write(PUSHF_O32_A32); break; } break; case 0x07: //POP ES case 0x17: //POP SS case 0x1f: //POP DS case 0x58: //POP eAX case 0x59: //POP eCX case 0x5a: //POP eDX case 0x5b: //POP eBX case 0x5c: //POP eSP case 0x5d: //POP eBP case 0x5e: //POP eSI case 0x5f: //POP eDI case 0x8f: //POP Ev case 0xfa1: //POP FS case 0xfa9: //POP GS switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) { case 0: working.write(POP_O16_A16); break; case PREFICES_OPERAND: working.write(POP_O32_A16); break; case PREFICES_ADDRESS: working.write(POP_O16_A32); break; case PREFICES_ADDRESS | PREFICES_OPERAND: working.write(POP_O32_A32); break; } break; case 0x9d: //POPF switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) { case 0: working.write(POPF_O16_A16); break; case PREFICES_OPERAND: working.write(POPF_O32_A16); break; case PREFICES_ADDRESS: working.write(POPF_O16_A32); break; case PREFICES_ADDRESS | PREFICES_OPERAND: working.write(POPF_O32_A32); break; } break; case 0x60: //PUSHA/D switch (prefices & PREFICES_OPERAND) { case 0: working.write(PUSHAD_A16); break; case PREFICES_OPERAND: working.write(PUSHAD_A32); break; } break; case 0x61: //POPA/D switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) { case 0: working.write(POPA_A16); break; case PREFICES_OPERAND: working.write(POPAD_A16); break; case PREFICES_ADDRESS: working.write(POPA_A32); break; case PREFICES_ADDRESS | PREFICES_OPERAND: working.write(POPAD_A32); break; } break; case 0x62: //BOUND if ((prefices & PREFICES_OPERAND) != 0) working.write(BOUND_O32); else working.write(BOUND_O16); break; case 0x69: //IMUL Gv, Ev, Iv case 0x6b: //IMUL Gv, Ev, Ib case 0xfaf: //IMUL Gv, Ev if ((prefices & PREFICES_OPERAND) != 0) working.write(IMUL_O32); else working.write(IMUL_O16); break; case 0x6c: //INSB if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_INSB_A32); else working.write(REP_INSB_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(INSB_A32); else working.write(INSB_A16); } break; case 0x6d: //INSW/D if ((prefices & PREFICES_OPERAND) != 0) { if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_INSD_A32); else working.write(REP_INSD_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(INSD_A32); else working.write(INSD_A16); } } else { if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_INSW_A32); else working.write(REP_INSW_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(INSW_A32); else working.write(INSW_A16); } } break; case 0x6e: //OUTSB if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_OUTSB_A32); else working.write(REP_OUTSB_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(OUTSB_A32); else working.write(OUTSB_A16); } break; case 0x6f: //OUTS DX, Xv if ((prefices & PREFICES_OPERAND) != 0) { if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_OUTSD_A32); else working.write(REP_OUTSD_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(OUTSD_A32); else working.write(OUTSD_A16); } } else { if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_OUTSW_A32); else working.write(REP_OUTSW_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(OUTSW_A32); else working.write(OUTSW_A16); } } break; case 0x70: working.write(JO_O8); break; //JC Jb case 0x71: working.write(JNO_O8); break; //JNC Jb case 0x72: working.write(JC_O8); break; //JC Jb case 0x73: working.write(JNC_O8); break; //JNC Jb case 0x74: working.write(JZ_O8); break; //JZ Jb case 0x75: working.write(JNZ_O8); break; //JNZ Jb case 0x76: working.write(JNA_O8); break; //JNA Jb case 0x77: working.write(JA_O8); break; //JA Jb case 0x78: working.write(JS_O8); break; //JS Jb case 0x79: working.write(JNS_O8); break; //JNS Jb case 0x7a: working.write(JP_O8); break; //JP Jb case 0x7b: working.write(JNP_O8); break; //JNP Jb case 0x7c: working.write(JL_O8); break; //JL Jb case 0x7d: working.write(JNL_O8); break; //JNL Jb case 0x7e: working.write(JNG_O8); break; //JNG Jb case 0x7f: working.write(JG_O8); break; //JG Jb case 0x80: //IMM GP1 Eb, Ib case 0x81: //IMM GP1 Ev, Iv case 0x82: //IMM GP1 Eb, Ib case 0x83: //IMM GP1 Ev, Ib (will have been sign extended to short/int) switch (modrm & 0x38) { case 0x00: working.write(ADD); break; case 0x08: working.write(OR); break; case 0x10: working.write(ADC); break; case 0x18: working.write(SBB); break; case 0x20: working.write(AND); break; case 0x28: case 0x38: //CMP working.write(SUB); break; case 0x30: working.write(XOR); break; } break; case 0x98: //CBW/CWDE if ((prefices & PREFICES_OPERAND) != 0) { working.write(LOAD0_AX); working.write(SIGN_EXTEND_16_32); working.write(STORE0_EAX); } else { working.write(LOAD0_AL); working.write(SIGN_EXTEND_8_16); working.write(STORE0_AX); } break; case 0x99: if ((prefices & PREFICES_OPERAND) != 0) working.write(CDQ); else working.write(CWD); break; case 0x9a: //CALLF switch (prefices & (PREFICES_OPERAND | PREFICES_ADDRESS)) { case 0: working.write(CALL_FAR_O16_A16); break; case PREFICES_OPERAND: working.write(CALL_FAR_O32_A16); break; case PREFICES_ADDRESS: working.write(CALL_FAR_O16_A32); break; case PREFICES_ADDRESS | PREFICES_OPERAND: working.write(CALL_FAR_O32_A32); break; } break; case 0x9b: working.write(FWAIT); break; //FWAIT case 0x9e: working.write(SAHF); break; case 0x9f: working.write(LAHF); break; case 0xa4: //MOVSB if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_MOVSB_A32); else working.write(REP_MOVSB_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(MOVSB_A32); else working.write(MOVSB_A16); } break; case 0xa5: //MOVSW/D if ((prefices & PREFICES_OPERAND) != 0) { if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_MOVSD_A32); else working.write(REP_MOVSD_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(MOVSD_A32); else working.write(MOVSD_A16); } } else { if ((prefices & PREFICES_REP) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REP_MOVSW_A32); else working.write(REP_MOVSW_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(MOVSW_A32); else working.write(MOVSW_A16); } } break; case 0xa6: //CMPSB if ((prefices & PREFICES_REPE) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REPE_CMPSB_A32); else working.write(REPE_CMPSB_A16); } else if ((prefices & PREFICES_REPNE) != 0) { if ((prefices & PREFICES_ADDRESS) != 0) working.write(REPNE_CMPSB_A32); else working.write(REPNE_CMPSB_A16); } else { if ((prefices & PREFICES_ADDRESS) != 0) working.write(CMPSB_A32); else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -