Приветствую всех. Пишу 64-битный дизассемблерный движок для 64-битного кода. Пока поддерживаются только "General-Purpose Instruction, System Instruction Reference и FPU (с версии 0.2.2.0)", но уже не стыдно показать. В примере для FreeBSD и Win64 тестовая програмка запускает движок и передаёт ему указатель на него же. Собственно интересует код который движок неправильно обрабатывает, или не обрабатывает (кроме mmx, sse который пока не поддерживается). П. С. С возвращаемыми значениями я ещё не совсем определился. Версия 0.2.2.0 http://depositfiles.com/files/4zuivandg Листинг выводится примерно такой: Код (Text): 402E0C: 48BBF20F400000000000 mov rbx,400FF2 402E16: 4883E203 and rdx,03 402E1A: 488D1CD3 lea rbx,[rbx+rdx*8] 402E1E: EB24 jmp 402E44 402E20: 48BB0004400000000000 mov rbx,400400 402E2A: 488B1B mov rbx,[rbx] 402E2D: 488B1CD3 mov rbx,[rbx+rdx*8] 402E31: EB11 jmp 402E44 402E33: 48BBB803400000000000 mov rbx,4003B8 402E3D: 488B1B mov rbx,[rbx] 402E40: 488B1CD3 mov rbx,[rbx+rdx*8] 402E44: 49BB3A39400000000000 mov r11,40393A 402E4E: E910F9FFFF jmp 402763
>>почему не таблицами Что имеется в виду под таблицами? Сам движок функций ОС не вызывает, надо только в тестовом примере заменить "bsd-syscall" на то чем Win64 в консоль печатает и формат файла изменить на PE64.
ну при беглом осмотре я невыявил наличия никаких табличных данных, а кучу файлов с кучей джампов, это значит что опкод разбирается искличително ими. Можно поступить по другому, составить таблицу в которой будут некоторые данные об опкоде например информацию и использовании регистров, присутсвии modr\m некоторых imm, потенциального влияния на флаги.. С какой целью это пишется, только для получения аски мнемоники опкода?
>>опкод разбирается искличително ими Не совсем так. Все таблицы в "Disas64/Opcod/TabRegName". Вначале сравнивается по таблице с однобайтовыми командами, затем с 2-байтовыми, затем с префиксами, затем с составными однобайтовыми, дальше с составными 2-байтовыми. Дальше разбирается ModRM ,SIB, disp, imme(если они есть). Байты ModRM.reg и др. используются как индекс для выбора мнемоники регистра.
Тестовая програмка больше 2 тыс. строк выводит, это все код движка ? Чем все это дело отлаживаеш ? Хорошо придумано, без всяких "0x" и лишних byte, word я про "mov al,byte ptr[rax*8+0x1C3F5678]" тоесть без byte ptr понятно что в al записывается.
Внёс пару исправлений (см. выше). Если кто знает НЕХ коды, на которых часто запинаются дизассемблеры, поделитесь.
под рукой нет 64битного никса. посмотри что0нибудь такое: Код (Text): mov rax, 0x102030405060708 mov [eax+0x10], ax mov [eax+0x1000], ebx mov [ebp+eax+0x0], esi mov qword [ebp+edi+0x1000], 0x10 mov byte [esp], 0x10 mov [eax], rax mov [r12], eax mov [r13+r12+0x0], eax mov [r8*4+0x0], sil inc rax dec rax mov [rip+0x200], rax mov rax, 0x10000 push rax push r12 call word near [r8] call qword near [rax] call word far [r8] call dword far [rax] cbw cwde cdqe cwd cdq cqo cmovl rax, [rax] cmovge eax, [rax] clflush [r14] cmp [rax], rax cmp rbx, r12 cmp r12d, r8d cmpsb cmpsw cmpsd cmpsq cmpxchg [eax], r14 cmpxchg8b [ebx] inc r12d inc dword [rax] dec r11w hlt imul rax, [eax+ebx*8+0x100000], 0x10 idiv dword [r12] enter 0x100, 0x0 enter 0x100, 0x1 enter 0x100, 0x10 in al, 0x10 in ax, 0x10 in eax, 0x10 lfs eax, [eax] lgs eax, [ebx] lea eax, [rbx] lea r11, [eax] lodsb lodsq lodsd push rax push r11 xchg [eax], sil xchg [eax], ebx xchg [eax], bx xchg r8, rax xchg r9, rax xchg cx, ax movsd movsq mov al, r11b mov sil, al mov r11b, dil ret 0x10 pop rax pop r11 pop qword [eax] insd outsd mov [r14d], cs mov cs, [ebx+ecx] pushfq scasq lar rax, [eax] lsl ax, [rbx] movups xmm0, [r12d] movupd xmm0, [r12d] movsldup xmm0, [r12d] movups xmm0, xmm1 movlps xmm0, [rax] movlps [rax], xmm0 unpcklps xmm4, xmm5 unpckhps xmm4, xmm5 movhps xmm3, [eax] movhps [rax], xmm3 movss xmm0, [eax] movss [eax], xmm0 movlpd [eax], xmm0 movlpd xmm0, [eax] unpcklpd xmm2, xmm4 unpckhpd xmm3, [eax+ebx*8+0xffffffff] movhpd xmm3, [rax] movhpd [rax], xmm2 movsd xmm3, xmm4 movddup xmm3, [rax] mov dr0, rax mov rax, dr1 movnti [eax], eax movnti [rax], rax movd dword [eax], xmm0 movd qword [eax], xmm0 movd xmm11, qword [eax] vmmcall vmrun clgi stgi mfence lfence sfence clflush [rax] mov cr8, rax push qword [eax] push word [eax] add bh, bh add dil, dil add sil, bpl add al, sil prefetcht0 [eax] prefetchnta [eax] prefetch [eax] add [r8], r9b mov [rax-0x1], eax inc rax jmp qword near [eax] jmp rax mov [0x10], rax mov rax, [0x10] mov rax, 0x102030405060708 nop xchg r8, rax push ax push rax push r11 mov rax, [0x100] выдрано из udis'a.
Нормальный код, внёс ещё несколько пар исправлений. Код (Text): 403EB6: 48B80807060504030201 mov rax,0102030405060708 403EC0: 6766894010 mov [eax+10],ax 403EC5: 67899800100000 mov [eax+00001000],ebx 403ECC: 6789740500 mov [ebp+eax+00],esi 403ED1: 6748C7843D0010000010000000 mov qword [ebp+edi+00001000],10 403EDE: 67C6042410 mov byte [esp],10 403EE3: 67488900 mov [eax],rax 403EE7: 41890424 mov [r12],eax 403EEB: 4389442500 mov [r13+r12+00],eax 403EF0: 4288348500000000 mov [r8*4+00000000],sil 403EF8: 48FFC0 inc rax 403EFB: 48FFC8 dec rax 403EFE: 48890500020000 mov [RIP+00000200],rax 403F05: 48C7C000000100 mov rax,010000 403F0C: 50 push rax 403F0D: 4154 push r12 403F0F: 6641FF10 call word [r8] 403F13: FF10 call qword [rax] 403F15: 666641FF18 call far:word [r8] 403F1A: 66FF18 call far:word [rax] 403F1D: 6698 cbw 403F1F: 98 cwde 403F20: 4898 cdqe 403F22: 6699 cwd 403F24: 99 cdq 403F25: 4899 cqo 403F27: 480F4C00 cmovl rax,[rax] 403F2B: 0F4D00 cmovnl eax,[rax] 403F2E: 410FAE3E clflush byte [r14] 403F32: 483900 cmp [rax],rax 403F35: 4C39E3 cmp rbx,r12 403F38: 4539C4 cmp r12d,r8d 403F3B: A6 cmps byte 403F3C: 66A7 cmps word 403F3E: A7 cmps dword 403F3F: 48A7 cmps qword 403F41: 674C0FB130 cmpxchg [eax],r14 403F46: 670FC70B cmpxchg8b edx:eax,[ebx] 403F4A: 41FFC4 inc r12d 403F4D: FF00 inc qword [rax] 403F4F: 6641FFCB dec r11w 403F53: F4 hlt 403F54: 67486B84D80000100010 imul rax,[eax+ebx*8+00100000],10 403F5E: 67486984D80000100044332211 imul rax,[eax+ebx*8+00100000],11223344 403F6B: 41F73C24 idiv dword [r12] 403F6F: C8000100 enter 0100,00 403F73: C8000101 enter 0100,01 403F77: C8000110 enter 0100,10 403F7B: E410 in al,10 403F7D: 66E510 in ax,10 403F80: E510 in eax,10 403F82: 670FB400 lfs eax,[eax] 403F86: 670FB503 lgs eax,[ebx] 403F8A: 8D03 lea eax,[rbx] 403F8C: 674C8D18 lea r11,[eax] 403F90: AC lods byte 403F91: 48AD lods qword 403F93: AD lods dword 403F94: 50 push rax 403F95: 4153 push r11 403F97: 67408630 xchg sil,[eax] 403F9B: 678718 xchg ebx,[eax] 403F9E: 67668718 xchg bx,[eax] 403FA2: 4990 xchg r8,rax 403FA4: 4991 xchg r9,rax 403FA6: 6691 xchg cx,ax 403FA8: A5 movs dword 403FA9: 48A5 movs qword 403FAB: 4488D8 mov al,r11b 403FAE: 4088C6 mov sil,al 403FB1: 4188FB mov r11b,dil 403FB4: C21000 ret near 10 403FB7: 58 pop rax 403FB8: 415B pop r11 403FBA: 678F00 pop qword [eax] 403FBD: 6D ins dword 403FBE: 6F outs dword 403FBF: 9C pushf qword 403FC0: 48AF scas qword 403FC2: 67480F0200 lar rax,[eax] 403FC7: 660F0303 lsl ax,[rbx] 403FCB: 0F23C0 mov dr0,rax 403FCE: 0F21C8 mov rax,dr1 403FD1: 0F01D9 vmmcall 403FD4: 0F01DD clgi 403FD7: 0F01DC stgi 403FDA: 0FAEF0 mfence 403FDD: 0FAEE8 lfence 403FE0: 0FAEF8 sfence 403FE3: 0FAE38 clflush byte [rax] 403FE6: 440F22C0 mov cr8,rax 403FEA: 67FF30 push qword [eax] 403FED: 6766FF30 push word [eax] 403FF1: 00FF add bh,bh 403FF3: 4000FF add dil,dil 403FF6: 4000EE add sil,bpl 403FF9: 4000F0 add al,sil 403FFC: 670F1808 prefetch T0 dword [eax] 404000: 670F1800 prefetch NTA dword [eax] 404004: 670F0D00 prefetch exclusive qword [eax] 404008: 450008 add [r8],r9b 40400B: 8940FF mov [rax-01],eax 40400E: 48FFC0 inc rax 404011: 67FF20 jmp qword [eax] 404014: FFE0 jmp eax 404016: 488905A3C0FFFF mov [RIP-00003F5D],rax 40401D: 488B059CC0FFFF mov rax,[RIP-00003F64] 404024: 48B80807060504030201 mov rax,0102030405060708 40402E: 90 nop 40402F: 4990 xchg r8,rax 404031: 6650 push ax 404033: 50 push rax 404034: 4153 push r11 404036: 488B0573C1FFFF mov rax,[RIP-00003E8D] Ссылка в верху.