Пошаговое исполнение

Тема в разделе "WASM.BEGINNERS", создана пользователем Spairos, 23 янв 2007.

  1. Spairos

    Spairos New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    5
    У нас есть программа с реализацией определённого алгоритма. Нужно включить в неё процесс пошагового выполнения этого алгоритма. Т.е. нажимаем кнопку и выполняется одна команда ассемблера и происходит остановка, нажимаем ещё раз следующая команда исполняется. Программа при запуске должна поддерживать два режима работы: обычный и пошаговый. Как проще всего это реализовать?
     
  2. n0name

    n0name New Member

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

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    SEH и int 3, что по сути то-же самое.
     
  4. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Гемор :)
    Для пошагового выполнения: Установи флаг трасировки TF==1 и тогда после выполнения каждой команды процессор будет генерить эксепшен. Твоя задача просто написать обработчик :)
     
  5. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    У меня если в обработчике снова поднять tf то следующая остановка будет сразу после выхода из этого обработчика.
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Туплю. Это у меня обработчик неправильно написан был.
     
  7. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Spairos
    Код (Text):
    1. start:
    2.     lea eax,SEHHandler
    3.     push eax
    4.     assume fs:nothing
    5.     xor eax,eax
    6.     push fs:[eax]
    7.     mov fs:[eax],esp
    8.  
    9.     pushfd
    10.     XCHG DWORD PTR [ESP],EAX
    11.     OR   EAX,100h              ; TF=1
    12.     XCHG DWORD PTR [ESP],EAX
    13.     POPFD
    14.  
    15. start_alg:
    16. ;твой алгоритм
    17.     nop
    18.     nop
    19.     nop
    20.     nop
    21.     nop
    22. ;конец твоего алгоритма
    23. end_alg:   
    24.  
    25.     xor eax,eax
    26.     mov fs:[eax],esp
    27. break:
    28.  
    29.     invoke ExitProcess,0
    30.     ret
    31. SEHHandler proc uses edx edi ebx ecx pExcept:DWORD, pFrame:DWORD, pContext:DWORD, pDispatch:DWORD
    32.     mov eax,pExcept
    33.     assume eax:ptr EXCEPTION_RECORD
    34. ;   mov ebx,[eax].ExceptionCode        
    35.     mov ebx,[eax].ExceptionAddress
    36.     assume eax:nothing
    37.     invoke MessageBox,0,0,0,0
    38.     mov edi,pContext
    39.     assume edi:ptr CONTEXT
    40.     .if (ebx>offset start_alg) && (ebx<offset end_alg)
    41.         or [edi].regFlag,100h
    42.     .endif
    43.     mov eax,ExceptionContinueExecution
    44.     ret
    45. SEHHandler endp
    46. end start
     
  8. Spairos

    Spairos New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    5
    1. Как можно отладить код процедуры обработки исключений? У меня Olly Debyg, и он перехватывает все исключения.

    2. Когда происходит исключение используется эти строки:
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx ; ifmt db "%x",0
    invoke SetDlgItemText, hWin, IDC_EDX, addr buf
    одним словом отображаю значение регистра eax в поле для редактирования.
    Но если данные содержат в конце нули, например 5b 3а 12 00 - они не выводятся. только 5b 3а 12, что делать?

    3. Если мне нужно вывести данные, а в [edi].regEdx - содержится их адресс, то как быть (в сам код добавлять новых переменных нельзя, только в обработчики исключений), к сожалению в Olly Debug я не знаю как посмотреть работу процедуры обр. искл. но что-то мне подсказывает, что когда в дело вступает эта процедура, по этому адресу находятся другие данные, например, например следующий код приводит к ошибке:
    mov esi, [edi].regEdx
    mov ecx, [esi]
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    1. Думаю, самое простое -- вызывать обработчик исключений прямо, т.е. 'call hndlr', искусстевнно создавая ему разные ситуации.

    2. ifmt db "%.8X",0 должно помочь.
     
  10. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    1. Поставить бряк в начало обработчика, а когда произойдёт исключение - Shift+F9.
     
  11. Spairos

    Spairos New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    5
    3. Решил, был неправильно написан обработчик.

    Хотя там всё равно, где-то есть ошибка. Под Windows Xp все работает нормально, а под Windows 2000 программа падает (основной алгоритм работает стабильно везде), в чем дело?
    Вот код обработчика:

    DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    LOCAL ps:PAINTSTRUCT, hdc:HDC, hMemDC:HDC
    .................................
    .................................
    invoke IsDlgButtonChecked, hWnd, IDC_CHK1 ;проверка на включение пошагового режима
    .IF eax==BST_CHECKED
    mov count, 0
    lea eax, SEHHandler
    push eax
    assume fs:nothing
    xor eax, eax
    push fs:[eax]
    mov fs:[eax], esp
    assume fs:error
    pushfd
    xchg dword ptr [esp], eax
    or eax, 100h ; TF=1
    xchg DWORD PTR [esp], eax
    popfd
    .ENDIF

    Range ;вставить макрос подсчета проходов
    mov esi, pMemory ;поместить в esi адрес проекции исх. файла
    fEncode label near ;метка для отладки
    ..........................
    ..........................

    invoke IsDlgButtonChecked, hWnd, IDC_CHK1
    .IF eax==BST_CHECKED
    assume fs:nothing
    xor eax, eax
    pop fs:[eax]
    add esp, 4
    assume fs:error
    .ENDIF

    SEHHandler proc uses eax edi ebx edx
    pExcept:lol: WORD, pFrame:lol: WORD, pContext:lol: WORD, pDispatch:lol: WORD

    mov eax, pExcept
    assume eax:ptr EXCEPTION_RECORD
    ; mov ebx,[eax].ExceptionCode
    mov ebx,[eax].ExceptionAddress
    assume eax:nothing
    mov edi,pContext
    assume edi:ptr CONTEXT
    or [edi].regFlag, 100h

    ; for Encode -----------------------------------------------
    lea esi, fEncode
    add esi, 0ch
    lea edx, fEncode
    add edx, 030h
    push edx

    .if (ebx == esi)
    inc count
    invoke wsprintf, addr buf, addr ifmt, [edi].regEax
    invoke SetDlgItemText, hWin, IDC_ECX, addr buf
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx
    invoke SetDlgItemText, hWin, IDC_ECX2, addr buf
    invoke MessageBox, 0, addr Input, addr MSGName, MB_OK
    .endif
    .if (ebx > esi) && (ebx <= edx)
    inc count
    invoke wsprintf, addr buf, addr ifmt, [edi].regEax
    invoke SetDlgItemText, hWin, IDC_EAX, addr buf
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx
    invoke SetDlgItemText, hWin, IDC_EDX, addr buf
    mov eax, [edi].regEdi
    mov ecx, [eax]
    invoke wsprintf, addr buf, addr ifmt, ecx
    invoke SetDlgItemText, hWin, IDC_EDI, addr buf
    add esi, 4
    .if (ebx > esi)
    mov eax, [edi].regEbx
    mov ecx, [eax]
    invoke wsprintf, addr buf, addr ifmt, ecx
    invoke SetDlgItemText, hWin, IDC_EBX, addr buf
    .endif
    invoke MessageBox, 0, addr Step, addr MSGName, MB_OKCANCEL
    .if eax==IDCANCEL
    xor [edi].regFlag, 100h
    .endif
    .endif

    pop edx
    .if (ebx == edx)
    invoke wsprintf, addr buf, addr ifmt, [edi].regEax
    invoke SetDlgItemText, hWin, IDC_FIN, addr buf
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx
    invoke SetDlgItemText, hWin, IDC_FIN2, addr buf
    invoke MessageBox, 0, addr Output, addr MSGName, MB_OK
    .endif

    ; for Decode -----------------------------------------------
    lea esi, fDecode
    sub esi, 019h

    .if (ebx > edx) && (ebx < esi)
    xor [edi].regFlag, 100h
    .endif

    add esi, 025h
    lea edx, fDecode
    add edx, 030h
    push edx

    .if (ebx == esi)
    inc count
    invoke wsprintf, addr buf, addr ifmt, [edi].regEax
    invoke SetDlgItemText, hWin, IDC_ECX, addr buf
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx
    invoke SetDlgItemText, hWin, IDC_ECX2, addr buf
    invoke MessageBox, 0, addr Input, addr MSGName, MB_OK
    .endif
    .if (ebx > esi) && (ebx <= edx)
    inc count
    invoke wsprintf, addr buf, addr ifmt, [edi].regEax
    invoke SetDlgItemText, hWin, IDC_EAX, addr buf
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx
    invoke SetDlgItemText, hWin, IDC_EDX, addr buf
    mov eax, [edi].regEdi
    mov ecx, [eax]
    invoke wsprintf, addr buf, addr ifmt, ecx
    invoke SetDlgItemText, hWin, IDC_EDI, addr buf
    add esi, 4
    .if (ebx > esi)
    mov eax, [edi].regEbx
    mov ecx, [eax]
    invoke wsprintf, addr buf, addr ifmt, ecx
    invoke SetDlgItemText, hWin, IDC_EBX, addr buf
    .endif
    invoke MessageBox, 0, addr Step, addr MSGName, MB_OKCANCEL
    .if eax==IDCANCEL
    xor [edi].regFlag, 100h
    .endif
    .endif

    pop edx
    .if (ebx == edx)
    invoke wsprintf, addr buf, addr ifmt, [edi].regEax
    invoke SetDlgItemText, hWin, IDC_FIN, addr buf
    invoke wsprintf, addr buf, addr ifmt, [edi].regEdx
    invoke SetDlgItemText, hWin, IDC_FIN2, addr buf
    invoke MessageBox, 0, addr Output, addr MSGName, MB_OK
    .endif
    .if (ebx > edx)
    xor [edi].regFlag, 100h
    .endif

    invoke wsprintf, addr buf, addr ifmt_c, count
    invoke SetDlgItemText, hWin, IDC_STC5, addr buf
    mov eax, ExceptionContinueExecution
    ret
    SEHHandler endp
     
  12. Spairos

    Spairos New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2006
    Сообщения:
    5
    Уже все перепробовал, но код по SEH данный выше не работает на Windows 2000, а на XP все в порядке. Проблемы начинаются, когда мы возвращаемся после обработки исключения обратно в основную функцию программы.... вместо этого возвращаемся куда-то в недры системных dll и программа там зацикливается.