64-битный дизассемблерный движок на fasm.

Тема в разделе "WASM.PROJECTS", создана пользователем ofCros, 6 мар 2008.

  1. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Приветствую всех.

    Пишу 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):
    1. 402E0C:  48BBF20F400000000000            mov  rbx,400FF2
    2. 402E16:  4883E203                        and  rdx,03
    3. 402E1A:  488D1CD3                        lea  rbx,[rbx+rdx*8]
    4. 402E1E:  EB24                             jmp  402E44
    5. 402E20:  48BB0004400000000000            mov  rbx,400400
    6. 402E2A:  488B1B                          mov  rbx,[rbx]
    7. 402E2D:  488B1CD3                        mov  rbx,[rbx+rdx*8]
    8. 402E31:  EB11                             jmp  402E44
    9. 402E33:  48BBB803400000000000            mov  rbx,4003B8
    10. 402E3D:  488B1B                          mov  rbx,[rbx]
    11. 402E40:  488B1CD3                        mov  rbx,[rbx+rdx*8]
    12. 402E44:  49BB3A39400000000000            mov  r11,40393A
    13. 402E4E:  E910F9FFFF                       jmp  402763
     
  2. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    сори за офтоп, но почему не таблицами? под вин это никак не собрать?
     
  3. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    >>почему не таблицами
    Что имеется в виду под таблицами?

    Сам движок функций ОС не вызывает, надо только в тестовом примере заменить "bsd-syscall" на то чем Win64 в консоль печатает и формат файла изменить на PE64.
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    ну при беглом осмотре я невыявил наличия никаких табличных данных, а кучу файлов с кучей джампов, это значит что опкод разбирается искличително ими. Можно поступить по другому, составить таблицу в которой будут некоторые данные об опкоде например информацию и использовании регистров, присутсвии modr\m некоторых imm, потенциального влияния на флаги..

    С какой целью это пишется, только для получения аски мнемоники опкода?
     
  5. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    >>опкод разбирается искличително ими
    Не совсем так.
    Все таблицы в "Disas64/Opcod/TabRegName". Вначале сравнивается по таблице с однобайтовыми командами, затем с 2-байтовыми, затем с префиксами, затем с составными однобайтовыми, дальше с составными 2-байтовыми. Дальше разбирается ModRM ,SIB, disp, imme(если они есть). Байты ModRM.reg и др. используются как индекс для выбора мнемоники регистра.
     
  6. BeliiKom

    BeliiKom New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    1
    Тестовая програмка больше 2 тыс. строк выводит, это все код движка ?
    Чем все это дело отлаживаеш ?

    Хорошо придумано, без всяких "0x" и лишних byte, word я про "mov al,byte ptr[rax*8+0x1C3F5678]" тоесть без byte ptr понятно что в al записывается.
     
  7. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    В gdb, отлаживаю.

    Добавил пример для Win64.
    Ссылка выше.
     
  8. Aerarh

    Aerarh New Member

    Публикаций:
    0
    Регистрация:
    9 мар 2008
    Сообщения:
    24
  9. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Внёс пару исправлений (см. выше).

    Если кто знает НЕХ коды, на которых часто запинаются дизассемблеры, поделитесь.
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    под рукой нет 64битного никса.
    посмотри что0нибудь такое:
    Код (Text):
    1.     mov rax, 0x102030405060708
    2.     mov [eax+0x10], ax
    3.     mov [eax+0x1000], ebx
    4.     mov [ebp+eax+0x0], esi
    5.     mov qword [ebp+edi+0x1000], 0x10
    6.     mov byte [esp], 0x10
    7.     mov [eax], rax
    8.     mov [r12], eax
    9.     mov [r13+r12+0x0], eax
    10.     mov [r8*4+0x0], sil
    11.     inc rax
    12.     dec rax
    13.     mov [rip+0x200], rax
    14.     mov rax, 0x10000
    15.     push rax
    16.     push r12
    17.     call word near [r8]
    18.     call qword near [rax]
    19.     call word far [r8]
    20.     call dword far [rax]
    21.     cbw
    22.     cwde
    23.     cdqe
    24.     cwd
    25.     cdq
    26.     cqo
    27.     cmovl rax, [rax]
    28.     cmovge eax, [rax]
    29.     clflush [r14]
    30.     cmp [rax], rax
    31.     cmp rbx, r12
    32.     cmp r12d, r8d
    33.     cmpsb
    34.     cmpsw
    35.     cmpsd
    36.     cmpsq
    37.     cmpxchg [eax], r14
    38.     cmpxchg8b [ebx]
    39.     inc r12d
    40.     inc dword [rax]
    41.     dec r11w
    42.     hlt
    43.     imul rax, [eax+ebx*8+0x100000], 0x10
    44.     idiv dword [r12]
    45.     enter 0x100, 0x0
    46.     enter 0x100, 0x1
    47.     enter 0x100, 0x10
    48.     in al, 0x10
    49.     in ax, 0x10
    50.     in eax, 0x10
    51.     lfs eax, [eax]
    52.     lgs eax, [ebx]
    53.     lea eax, [rbx]
    54.     lea r11, [eax]
    55.     lodsb
    56.     lodsq
    57.     lodsd
    58.     push rax
    59.     push r11
    60.     xchg [eax], sil
    61.     xchg [eax], ebx
    62.     xchg [eax], bx
    63.     xchg r8, rax
    64.     xchg r9, rax
    65.     xchg cx, ax
    66.     movsd
    67.     movsq
    68.     mov al, r11b
    69.     mov sil, al
    70.     mov r11b, dil
    71.     ret 0x10
    72.     pop rax
    73.     pop r11
    74.     pop qword [eax]
    75.     insd
    76.     outsd
    77.     mov [r14d], cs
    78.     mov cs, [ebx+ecx]
    79.     pushfq
    80.     scasq
    81.     lar rax, [eax]
    82.     lsl ax, [rbx]
    83.     movups xmm0, [r12d]
    84.     movupd xmm0, [r12d]
    85.     movsldup xmm0, [r12d]
    86.     movups xmm0, xmm1
    87.     movlps xmm0, [rax]
    88.     movlps [rax], xmm0
    89.     unpcklps xmm4, xmm5
    90.     unpckhps xmm4, xmm5
    91.     movhps xmm3, [eax]
    92.     movhps [rax], xmm3
    93.     movss xmm0, [eax]
    94.     movss [eax], xmm0
    95.     movlpd [eax], xmm0
    96.     movlpd xmm0, [eax]
    97.     unpcklpd xmm2, xmm4
    98.     unpckhpd xmm3, [eax+ebx*8+0xffffffff]
    99.     movhpd xmm3, [rax]
    100.     movhpd [rax], xmm2
    101.     movsd xmm3, xmm4
    102.     movddup xmm3, [rax]
    103.     mov dr0, rax
    104.     mov rax, dr1
    105.     movnti [eax], eax
    106.     movnti [rax], rax
    107.     movd dword [eax], xmm0
    108.     movd qword [eax], xmm0
    109.     movd xmm11, qword [eax]
    110.     vmmcall
    111.     vmrun
    112.     clgi
    113.     stgi
    114.     mfence
    115.     lfence
    116.     sfence
    117.     clflush [rax]
    118.     mov cr8, rax
    119.     push qword [eax]
    120.     push word [eax]
    121.     add bh, bh
    122.     add dil, dil
    123.     add sil, bpl
    124.     add al, sil
    125.     prefetcht0 [eax]
    126.     prefetchnta [eax]
    127.     prefetch [eax]
    128.     add [r8], r9b
    129.     mov [rax-0x1], eax
    130.     inc rax
    131.     jmp qword near [eax]
    132.     jmp rax
    133.     mov [0x10], rax
    134.     mov rax, [0x10]
    135.     mov rax, 0x102030405060708
    136.     nop
    137.     xchg r8, rax
    138.     push ax
    139.     push rax
    140.     push r11
    141.     mov rax, [0x100]
    выдрано из udis'a.
     
  11. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Нормальный код, внёс ещё несколько пар исправлений.

    Код (Text):
    1.  
    2. 403EB6:  48B80807060504030201            mov  rax,0102030405060708
    3. 403EC0:  6766894010                      mov  [eax+10],ax
    4. 403EC5:  67899800100000                  mov  [eax+00001000],ebx
    5. 403ECC:  6789740500                      mov  [ebp+eax+00],esi
    6. 403ED1:  6748C7843D0010000010000000      mov  qword [ebp+edi+00001000],10
    7. 403EDE:  67C6042410                      mov  byte [esp],10
    8. 403EE3:  67488900                        mov  [eax],rax
    9. 403EE7:  41890424                        mov  [r12],eax
    10. 403EEB:  4389442500                      mov  [r13+r12+00],eax
    11. 403EF0:  4288348500000000                mov  [r8*4+00000000],sil
    12. 403EF8:  48FFC0                          inc rax
    13. 403EFB:  48FFC8                          dec rax
    14. 403EFE:  48890500020000                  mov  [RIP+00000200],rax
    15. 403F05:  48C7C000000100                  mov  rax,010000
    16. 403F0C:  50                              push  rax
    17. 403F0D:  4154                            push  r12
    18. 403F0F:  6641FF10                        call word [r8]
    19. 403F13:  FF10                            call qword [rax]
    20. 403F15:  666641FF18                      call far:word [r8]
    21. 403F1A:  66FF18                          call far:word [rax]
    22. 403F1D:  6698                            cbw
    23. 403F1F:  98                              cwde
    24. 403F20:  4898                            cdqe
    25. 403F22:  6699                            cwd
    26. 403F24:  99                              cdq
    27. 403F25:  4899                            cqo
    28. 403F27:  480F4C00                        cmovl rax,[rax]
    29. 403F2B:  0F4D00                          cmovnl eax,[rax]
    30. 403F2E:  410FAE3E                        clflush byte [r14]
    31. 403F32:  483900                          cmp  [rax],rax
    32. 403F35:  4C39E3                          cmp  rbx,r12
    33. 403F38:  4539C4                          cmp  r12d,r8d
    34. 403F3B:  A6                              cmps byte
    35. 403F3C:  66A7                            cmps word
    36. 403F3E:  A7                              cmps dword
    37. 403F3F:  48A7                            cmps qword
    38. 403F41:  674C0FB130                      cmpxchg [eax],r14
    39. 403F46:  670FC70B                        cmpxchg8b edx:eax,[ebx]
    40. 403F4A:  41FFC4                          inc r12d
    41. 403F4D:  FF00                            inc qword [rax]
    42. 403F4F:  6641FFCB                        dec r11w
    43. 403F53:  F4                              hlt
    44. 403F54:  67486B84D80000100010            imul  rax,[eax+ebx*8+00100000],10
    45. 403F5E:  67486984D80000100044332211      imul  rax,[eax+ebx*8+00100000],11223344
    46. 403F6B:  41F73C24                        idiv dword [r12]
    47. 403F6F:  C8000100                        enter 0100,00
    48. 403F73:  C8000101                        enter 0100,01
    49. 403F77:  C8000110                        enter 0100,10
    50. 403F7B:  E410                            in al,10
    51. 403F7D:  66E510                          in ax,10
    52. 403F80:  E510                            in eax,10
    53. 403F82:  670FB400                        lfs eax,[eax]
    54. 403F86:  670FB503                        lgs eax,[ebx]
    55. 403F8A:  8D03                            lea  eax,[rbx]
    56. 403F8C:  674C8D18                        lea  r11,[eax]
    57. 403F90:  AC                              lods byte
    58. 403F91:  48AD                            lods qword
    59. 403F93:  AD                              lods dword
    60. 403F94:  50                              push  rax
    61. 403F95:  4153                            push  r11
    62. 403F97:  67408630                        xchg  sil,[eax]
    63. 403F9B:  678718                          xchg  ebx,[eax]
    64. 403F9E:  67668718                        xchg  bx,[eax]
    65. 403FA2:  4990                            xchg  r8,rax
    66. 403FA4:  4991                            xchg  r9,rax
    67. 403FA6:  6691                            xchg  cx,ax
    68. 403FA8:  A5                              movs dword
    69. 403FA9:  48A5                            movs qword
    70. 403FAB:  4488D8                          mov  al,r11b
    71. 403FAE:  4088C6                          mov  sil,al
    72. 403FB1:  4188FB                          mov  r11b,dil
    73. 403FB4:  C21000                          ret near 10
    74. 403FB7:  58                              pop  rax
    75. 403FB8:  415B                            pop  r11
    76. 403FBA:  678F00                          pop  qword [eax]
    77. 403FBD:  6D                              ins dword
    78. 403FBE:  6F                              outs dword
    79. 403FBF:  9C                              pushf qword
    80. 403FC0:  48AF                            scas qword
    81. 403FC2:  67480F0200                      lar rax,[eax]
    82. 403FC7:  660F0303                        lsl ax,[rbx]
    83. 403FCB:  0F23C0                          mov  dr0,rax
    84. 403FCE:  0F21C8                          mov  rax,dr1
    85. 403FD1:  0F01D9                          vmmcall
    86. 403FD4:  0F01DD                          clgi
    87. 403FD7:  0F01DC                          stgi
    88. 403FDA:  0FAEF0                          mfence
    89. 403FDD:  0FAEE8                          lfence
    90. 403FE0:  0FAEF8                          sfence
    91. 403FE3:  0FAE38                          clflush byte [rax]
    92. 403FE6:  440F22C0                        mov  cr8,rax
    93. 403FEA:  67FF30                          push  qword [eax]
    94. 403FED:  6766FF30                        push  word [eax]
    95. 403FF1:  00FF                            add  bh,bh
    96. 403FF3:  4000FF                          add  dil,dil
    97. 403FF6:  4000EE                          add  sil,bpl
    98. 403FF9:  4000F0                          add  al,sil
    99. 403FFC:  670F1808                        prefetch T0  dword [eax]
    100. 404000:  670F1800                        prefetch NTA  dword [eax]
    101. 404004:  670F0D00                        prefetch exclusive  qword [eax]
    102. 404008:  450008                          add  [r8],r9b
    103. 40400B:  8940FF                          mov  [rax-01],eax
    104. 40400E:  48FFC0                          inc rax
    105. 404011:  67FF20                           jmp  qword [eax]
    106. 404014:  FFE0                             jmp  eax
    107. 404016:  488905A3C0FFFF                  mov  [RIP-00003F5D],rax
    108. 40401D:  488B059CC0FFFF                  mov  rax,[RIP-00003F64]
    109. 404024:  48B80807060504030201            mov  rax,0102030405060708
    110. 40402E:  90                              nop
    111. 40402F:  4990                            xchg  r8,rax
    112. 404031:  6650                            push  ax
    113. 404033:  50                              push  rax
    114. 404034:  4153                            push  r11
    115. 404036:  488B0573C1FFFF                  mov  rax,[RIP-00003E8D]
    Ссылка в верху.
     
  12. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    вай нот мсдис
     
  13. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Добавил FPU инструкции.
     
  14. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    весь набор FPU?
     
  15. ofCros

    ofCros New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2007
    Сообщения:
    25
    Да, весь набор (надеюсь ничего не пропустил).
     
  16. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) поздно но держи проект отладчика для 64 битной оси на ФАСМ

    http://fdbg.x86asm.net/index.html