purebasic.info

PureBasic forum
Текущее время: Пт янв 19, 2018 6:43 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Ср фев 08, 2012 8:27 am 
Не в сети
профессор

Зарегистрирован: Вт май 04, 2010 12:19 pm
Сообщений: 352
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Пункты репутации: 0
Для этого и существуют брэйкпоинты :)

Поставить hardware breakpoint (HBP) легко:
ставим обработчик исключений и вызываем какой нибудь exception, например int3 #EXCEPTION_BREAKPOINT, а там
*Context\Eip + 1 ;пропускаем int3, чтоб больше не всплывало
*Context\Dr0 = msgbox ;адрес HBP0 (их всего 4) - адрес MessageBox
*Context\Dr7 = 1 ;включает первый HBP на "исполнение памяти 1байт"

по идее теперь каждый вызов MessageBox даст обработчику #EXCEPTION_SINGLE_STEP.


*Context\EFlags | $100 ;включает режим трассировки флаг TF, то есть после каждой иструкции будет еще один #EXCEPTION_SINGLE_STEP.
*Context\Dr7 = 0 ;убираем HBP0 чтоб не зацикливалось, потом вернем

опа
поймали еще #EXCEPTION_SINGLE_STEP (возвращаем HBP0), теперь уже с другим адресом, ну значит вычитая старый из нового получим size, следовательно для обеспечения многопоточности перехвата после очередного #EXCEPTION_SINGLE_STEP уже не будем снимать HBP, а сразу поменяем eip на @messagebox+size.



Пример ниже перехватывает апи функцию MessageBoxA.

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
; Import ""
;       AddVectoredExceptionHandler(a, b)
; EndImport
 
Global msgbox
Global size
 
 
 
Procedure UnhandledExceptionFilter(*ExceptionInfo.EXCEPTION_POINTERS)
        If *ExceptionInfo\pExceptionRecord\ExceptionCode = #EXCEPTION_BREAKPOINT
                *ExceptionInfo\ContextRecord\Eip + 1
                *ExceptionInfo\ContextRecord\Dr0 = msgbox
                *ExceptionInfo\ContextRecord\Dr7 = 1
        ElseIf *ExceptionInfo\pExceptionRecord\ExceptionCode = #EXCEPTION_SINGLE_STEP
                If *ExceptionInfo\ContextRecord\Eip = msgbox And size = 0
                        *ExceptionInfo\ContextRecord\EFlags | $100
                        *ExceptionInfo\ContextRecord\Dr7 = 0
                ElseIf size <> 0
                        *ExceptionInfo\ContextRecord\Eip = ?new_msgbox
                Else
                        *ExceptionInfo\ContextRecord\Dr7 = 1
                        size = *ExceptionInfo\ContextRecord\Eip - msgbox
                        *ExceptionInfo\ContextRecord\Eip = ?FIRSTSETHOOK
                EndIf
        EndIf
        ProcedureReturn #EXCEPTION_CONTINUE_EXECUTION
EndProcedure
 
 
 
hDLL = GetModuleHandle_("user32.dll")
msgbox = GetProcAddress_(hDLL, "MessageBoxA")
 
SetUnhandledExceptionFilter_(@UnhandledExceptionFilter())
;AddVectoredExceptionHandler(1, @UnhandledExceptionFilter())
 
!int3
 
!pushad
!call [v_msgbox]
!popad
 
 
 
 
 
MessageBox_(0, "asd1", "asd2", 0)
 
MessageBox_(0, "second1", "second2", 0)
 
MessageBox_(0, "111111111111111111", "22222222222222", 0)
 
MessageRequester("title", "caption")
 
 
 
End
 
 
 
 
 
parametrs.l
 
parametr1.s
parametr2.s
 
new_msgbox:
!pushad      ;esp-32
 
        !mov eax, [esp+ 8 +32]
        !mov [v_parametrs], eax
        parametr1 = PeekS(parametrs) + " hooked"
        !mov eax, [v_parametr1]
        !mov [esp+ 8 +32], eax
       
        !mov eax, [esp+ 12 +32]
        !mov [v_parametrs], eax
        parametr2 = PeekS(parametrs) + " hooked"
        !mov eax, [v_parametr2]
        !mov [esp+ 12 +32], eax
 
!popad      ;esp+32
!mov eax, [v_size]
!add eax, [v_msgbox]
!jmp eax
 
 
 
 
FIRSTSETHOOK:
!retn
 




Если кто не понял строки
!pushad
!call [v_msgbox]
!popad
нужны здесь лишь как альтернатива LDE.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB