단위 mlde32Unit; // 마이크로 길이 디스 어셈블러 엔진 인터페이스 // 作者忘记了 作者忘记了, 不好意思。好像出自 29a-7。 // 죄송합니다, 저자! 함수 lde32 (opcode : 포인터) : 정수; 구현 함수 lde32 (opcode : 포인터) : 정수; const // **************** //*opcode type*// *************** O_unique = 0; o_prefix = 1; o_imm8 = 2; o_imm16 = 3; o_imm24 = 4; o_imm32 = 5; o_imm48 = 6; o_modrm = 7; o_modrm8 = 8; o_modrm32 = 9; o_extended = 10; o_weird = 11; o_error = 12; 함수 mlde32 (opcode : 포인터) : 정수; asm pushad cld xor edx, edx mov esi, [esp+(8*4)+4] mov ebp, esp // 256 bytes, index-compressed opcode type table push 01097F71Ch push 0F71C6780h push 017389718h push 0101CB718h push 017302C17h push 018173017h push 0F715F547h push 04C103748H 푸시 0272CE7F7H 푸시 0F7AC6087H 푸시 01C121C52H 푸시 푸시 0201C701CH 푸시 04767602BH 푸시 푸시 040121625H 푸시 082872014 PUSH 047201014 13H 푸시 028858260H 푸시 015124045H 푸시 05016A0C7H 푸시 028191812H 푸시 02401812H 푸시 019154127H 푸시 050F011H MOV ECX, 015124710H 푸시 푸시 0111247H 047101115H MOV EAX, 012472015H 푸시 EAX 푸시 EAX 푸시 푸시 012471A10H ADD CL, 10H 푸시 엑스 서브 CL, 20H 푸시 XOR ECX, ECX DEC ECX // 코드 시작 @@ PS : INC ECX Mov EDI, ESP @@ GO : LODSB MOV BH , al @@ ft : mov ah, [edi] inc edi shr ah, 4 sub al, ah jnc @@ ft mov al, [edi-1] 및 0fh cmp al, o_error jnz @@ i7 pop edx not edx @@ i7 : inc edx cmp al, o_unique jz @@ t_exit cmp al, o_prefix jz @@ ps add edi, 51h // (@@ _ ettbl- @@ _ ttbl) cmp al, o_extended jz @@ go mov edi, [ebp+ (8*4) +4] @@ i6 : inc edx cmp al, o_imm8 jz @@ t_exit cmp al, o_modrm jz @@ t_modrm cmp al, o_weird jz @@ t_weird @@ i5 : inc edx cmp al, o_imm16 jz @ @t_exit cmp al, o_modrm8 jz @@ t_modrm @@ i4 : inc edx cmp al, o_imm24 jz @@ t_exit @@ i3 : inc edx @@ i2 : inc edx pushad mov al, 66h repnz scasb popad jnz @@ c32 @@ c32 @@. D2 : DEC EDX 12 월 EDX @@ C32 : CMP AL, O_MODRM32 JZ @@ T_MODRM SUB AL, O_IMM32 JZ @@ T_IMM32 @@ I1 : inc EDX @@ T_EXIT : MOV ESP, EBP MOV [ESP+(7*4)], EDX POPAD RET // *********************************** //*MOD/RM 바이트*// * * // * 7 6 5 3 2 0 * // * | 모드 | reg/opcode | r/m | * //* * //********************************* @@t_modrm: lodsb mov ah, al shr Al, 7 JB @@ prmk jz @@ prm 추가 dl, 4 pushad mov al, 67h repnz scasb popad jnz @@ prm @@ d3 : sub dl, 3 dec al @@ prmk : jnz @@ t_exit inc edx inc eax @ @prm : and ah, ah, 00000111b pushad mov al, 67h repnz scasb popad jz @@ prm67chk cmp ah, 04h jz @@ prmsib cmp ah, 05h jnz @@ t_exit @@ prm5chk : dec al jz @@ t_exit @@ i42 : 추가 DL, 4 JMP @@ T_EXIT @@ PRM67CHK : CMP AX, 0600H JNZ @@ T_EXIT INC EDX JMP @@ I1 @@ PRMSIB : CMP AL, 00H JNZ @@ I1 LODSB 및 AL, 00000111B SUB AL, 05H JNZ @@ I1 inc edx jmp @@ i42 // ******************************************Process Weird Opcodes*//**//* 빌어 먹을 테스트 (f6h/f7h)*//**// ********************** @@ t_weird : byte ptr 테스트 [Test byte ptr [test byte ptr [ esi], 00111000b jnz @@ t_modrm mov al, o_modrm8 shr bh, 1 adc al, 0 jmp @@ i5 // ******************************************* ********* //*다른 똥을 처리*//**//*빌어 먹을 mov (a0h/a1h/a2h/a3h)*//***// ******** ************************* @@ T_IMM32 : Sub BH, 0A0H CMP BH, 04H JAE @@ D2 Pushad Mov al, 67H Repnz SCASB POPAD JNZ @@ chk66t @@ d4 : 12 월 EDX 12 월 EDX @@ chk66T : Pushad Mov al, 66H Repnz Scasb popad jz @@ i1 jnz @@ d2 끝; ASM PUSH OPCODE CALL MLDE32 ADD ESP, 4 END; 끝; 끝. ========== 完