katrus http://wasmforum.com/forum/YaBB.pl?num=1170142245 Тут дизасмы я как то давно искал.... А так я взял какой то опенсорс, и вырезал из него дизасм длин инструкций.. Получился довольно небольшой бинарник, его и подключал. Если интересно - гляну что юзал
katrus если это дизассемблер длин - то все сами пишут. в прологе сравнительно небольшой набор инструкций. у меня такой огрызок например прекрасно справляется Код (Text): #define JMP_SIZE 2 #define PREFIX_OPERAND 1 #define PREFIX_ADDRESS 2 void postbyte (BYTE* &pointer) { BYTE byte; pointer++; byte = *pointer; pointer++; switch (byte >> 6) { case 0: { if (4 == (byte & 7)) { byte = *pointer; pointer++; if (5 == (byte &7)) { pointer +=4; } return; } if (5 == (byte & 7)) { pointer += 4; return; } return; } case 1: { if (4 == (byte & 7)) { pointer +=2; return; } pointer++; return; } case 2: { if (4 == (byte & 7)) { pointer +=5; return; } pointer +=4; return; } } } DWORD get_size (PVOID address) { BYTE byte; BYTE* pointer; DWORD prefix; pointer = (BYTE*) address; for ( ;(pointer - address) < JMP_SIZE; ) { prefix = 0; for (;;) { byte = *pointer; if ((byte >= 0x40) && (byte <= 0x4f)) { pointer++; #ifdef _WIN64 continue; // prefix REX #else break; // inc/dec reg32 #endif } if ((byte >= 0x50) && (byte <= 0x5f)) // push/pop reg32 { pointer++; break; } if (0x2e == byte) // prefix CS (ignored in 64-bit mode) { pointer++; continue; } if (0x3e == byte) // prefix DS (ignored in 64-bit mode) { pointer++; continue; } if (0x26 == byte) // prefix ES (ignored in 64-bit mode) { pointer++; continue; } if (0x36 == byte) // prefix SS (ignored in 64-bit mode) { pointer++; continue; } if (0x64 == byte) // prefix FS { pointer++; continue; } if (0x65 == byte) // prefix GS { pointer++; continue; } if (0x66 == byte) // prefix operand-size override { prefix |= PREFIX_OPERAND; pointer++; continue; } if (0x67 == byte) // prefix address-size override { prefix |= PREFIX_ADDRESS; pointer++; continue; } if (0xf0 == byte) // prefix LOCK { pointer++; continue; } if (0xf2 == byte) // prefix REPNE { pointer++; continue; } if (0xf3 == byte) // prefix REPE { pointer++; continue; } if (0x68 == byte) // push imm32 { pointer +=5; break; } if (0x6a == byte) // push imm32 { pointer +=2; break; } if ((byte >= 0xa0) && (byte <= 0xa3)) // mov rax,imm64 { if (prefix & PREFIX_OPERAND) { #ifdef _WIN64 pointer +=5; #else pointer +=3; #endif } else { #ifdef _WIN64 pointer +=9; #else pointer +=5; #endif } break; } if ((byte >= 0xb0) && (byte <= 0xb7)) // mov al,imm8 { pointer +=2; break; } if ((byte >= 0xb8) && (byte <= 0xbf)) // mov al,imm8 { if (prefix & PREFIX_OPERAND) { #ifdef _WIN64 pointer +=5; #else pointer +=3; #endif } else { #ifdef _WIN64 pointer +=9; #else pointer +=5; #endif } break; } if ((0x89 == byte) || (0x8b == byte) || (0x8d == byte) || (0xff == byte)) { postbyte (pointer); break; } if (0x81 == byte) { postbyte (pointer); pointer += 4; break; } if (0x83 == byte) { postbyte (pointer); pointer++; break; } return 0; } } return pointer - address; } ваще это можно и на один экран запихнуть но тогда дебажить будет неудобно