Определение длины инструкций

Тема в разделе "WASM.WIN32", создана пользователем Clerk, 1 фев 2008.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Это необходимо для сплайсинга.
    Я использовал дизассемблер длин иснтрукций от Micro$oft, но сегодня возникла интересная идея.
    При исполнении инструкции с установленным EFLAGS.TrapFlag возникает отладочное исключение
    EXCEPTION_SINGLE_STEP, а контекст содержит адрес следующей инструкции.
    Многим будет полезно.
    Код (Text):
    1. _enter_ macro
    2.     assume fs:nothing
    3.     push ebp
    4.     push esp
    5.     push offset SehNext_
    6.     push offset SehHandler_
    7.     push FS:[0]
    8.     mov FS:[0],esp
    9. endm
    10.  
    11. _leave_ macro
    12. SehNext_:
    13.     pop FS:[0]
    14.     add esp,16
    15. endm   
    16.    
    17. SehHandler_ proc uses edx ebx ExceptionRecord:PVOID, EstablisherFrame:PSEH, ContextRecord:PCONTEXT, DispatcherContext:PVOID
    18.     mov edx,ExceptionRecord
    19.     assume edx:ptr EXCEPTION_RECORD
    20. ;   cmp [edx].ExceptionCode,EXCEPTION_SINGLE_STEP
    21.     mov ebx,EstablisherFrame
    22.     assume ebx:PSEH
    23.     mov ecx,ContextRecord
    24.     assume ecx:PCONTEXT
    25.     mov [ecx].regEax,STATUS_INVALID_PARAMETER
    26.     push [edx].ExceptionAddress
    27.     pop [ecx].regEax
    28.     push [ebx].SafeOffset
    29.     pop [ecx].regEip
    30.     push [ebx].PrevEsp
    31.     sub dword ptr [esp],16
    32.     pop [ecx].regEsp
    33.     push [ebx].PrevEbp
    34.     pop [ecx].regEbp
    35.     and [ecx].regEFlags,not EFLAGS_TF
    36.     xor eax,eax     ;ExceptionContinueExecution
    37.     ret
    38. SehHandler_ endp
    39.  
    40. QueryInstructionLength proc uses esi edi ebx Instruction:PVOID
    41. Local Buffer[32]:BYTE
    42.     lea edi,Buffer
    43.     lea esi,code_
    44.     mov ecx,9
    45.     mov ebx,edi
    46.     cld
    47.     rep movsb
    48.     mov esi,Instruction
    49.     mov ecx,32
    50.     rep movsb
    51.     _enter_
    52.     Jmp Ebx
    53.     _leave_
    54.     sub eax,ebx
    55.     sub eax,9
    56.     ret
    57. code_: 
    58.     BYTE 9Ch, 81h, 0Ch, 24h, 00h, 01h, 00h, 00h, 9Dh    ;pushfd/or dword ptr [esp],EFLAGS_TF/popfd
    59. QueryInstructionLength endp
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    это все хорошо, пока не встретится fault икслючение.

    оо кстати это какой?

    я обычно использую ldasm
     
  3. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Great
    В модуле msdis*.dll есть такой метод. Его можно использовать.
     
  4. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Да, например привилегированные команды не распознаются, но для сплайсинга обычных API - подходит.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    crypto
    где такая? я у ся чето не вижу
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    ...\MS VS 2005\Common7\IDE\msdis150.dll
     
  7. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.351
    Great
    если студия установлена, то в Common\MsDev98\Bin (для vc6)
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    btw, не советовал бы юзать ldasm. там куча ошибок как в таблицах, так и в коде.
    причем например функция IsRelativeCmd вообще корявая, точнее коряво расставленны флаги. например call reg/mem считается относительной, а jxx imm8 нет.
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а насчет идеи, долго слишком по времени происходить будет, есть места где это крайне критично.
     
  10. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    AcLayers.dll, я приводил дизассемблированный код.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Кстати в Masm32\Bin есть файл MSDIS100.DLL