Крах системы (Проблема с ХУК'ом )

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Крах системы (Проблема с ХУК'ом )

Сообщение Gemini » 27.03.2008 (Чт) 12:27

Проблемма в следующем :ставлю глобальный хук и сразу же винда падает (без вывода ошибки выгружается explorer).
Не могу понять в чём ошибка.

Пишу Native Dll (от Хакера)
(В модуле)
Код: Выделить всё
Public Function HookProcName(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case lParam
        Case WM_CLOSE
             MsgBox "Close"
        Case WM_PAINT
             MsgBox "PAINT"
End Select
HookProcName = CallNextHookEx(0&, ncode, wParam, ByVal lParam)
End Function


В Классе:

Код: Выделить всё
Public Sub GetDllInfo(ByVal Informer As Object)
    With Informer
        .Export "HookProc", AddressOf HookProcName
        .SetEntryPoint AddressOf DllEntryPoint
       
    End With
End Sub



В программе:

Код: Выделить всё
hLib = LoadLibrary(App.Path & "\VBHook.dll")
hProc = GetProcAddress(hLib, "HookProc")
hHook = SetWindowsHookEx(WH_CALLWNDPROC, hProc, hLib, 0&)



Помогите разобраться пожалуйста...
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 27.03.2008 (Чт) 12:30

У HookProcName должно быть 4 параметра.

ADD: Был не прав, погорячился.
Последний раз редактировалось Antonariy 27.03.2008 (Чт) 13:27, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.03.2008 (Чт) 12:30

Есть подозрение, что происходит лавинное переполнение стека при обработке WM_PAINT.

Попробуй MessageBeep вместо MsgBox. Будет ли работать?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 27.03.2008 (Чт) 13:08

Тесты:
1)

Код: Выделить всё
Public Function HookProcName(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long,ByVal gParam As Long) As Long
Select Case lParam
        Case WM_CLOSE
           MsgBox "Close"
End Select
HookProcName = CallNextHookEx(0&, ncode, wParam, ByVal lParam)
End Function


2)

Код: Выделить всё
Public Function HookProcName(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long,ByVal gParam As Long) As Long
Select Case lParam
        Case WM_CLOSE
           MessageBeep 1
End Select
HookProcName = CallNextHookEx(0&, ncode, wParam, ByVal lParam)
End Function


3)


Код: Выделить всё
Public Function HookProcName(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case lParam
        Case WM_CLOSE
           MessageBeep 1
End Select
HookProcName = CallNextHookEx(0&, ncode, wParam, ByVal lParam)
End Function


Во всех трёх случаях explorer вылетает.
Но теперь при закрытии какого нибудь окна вылетает ошибка 'Память не может быть read'.

Хакер

WM_PAINT
Убрал, не помогает.


Есть ещё догадки? (я вчера весь вечер голову ломал, так и непонял в чём проблемма. т.к. ставил хук на клаву и всё работало нормально.)
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.03.2008 (Чт) 13:40

Antonariy
Почему это?

MSDN писал(а):
Код: Выделить всё
LRESULT CALLBACK CallWndProc(
  int nCode,      // hook code
  WPARAM wParam,  // current-process flag
  LPARAM lParam   // address of structure with message data
);



Gemini
1) Как у тебя объявлена CallNextHookEx и где?
2) Почему первый аргумент CallNextHookEx у тебя - 0.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 27.03.2008 (Чт) 14:11

Хакер
1.
Я не знаю hHook, поэтому ставлю 0&


2.
в модуле native dll:

Код: Выделить всё
Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long




Добавлю проект...
Вложения
VBHook.zip
Пример хука на клаву и на события WM_CLOSE.
(10.25 Кб) Скачиваний: 241
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 27.03.2008 (Чт) 21:54

Я не знаю hHook, поэтому ставлю 0&

Офигительная логика.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 28.03.2008 (Пт) 14:07

Хакер

hHook получаем от SetWindowsHookEx. И как я его должен передать в длл из программы???
Вложения
VBHook.zip
Вот так у меня не получилось...
(10.41 Кб) Скачиваний: 224
В нашем деле главное ЛОГИКА.

косил косой косой косой.

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 28.03.2008 (Пт) 16:03

SetWindowsHookEx надо вызывать в DLL
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 28.03.2008 (Пт) 18:03

BV
SetWindowsHookEx надо вызывать в DLL

а от куда мы возьмём hProc, hLib ???
-----------------------------------

Методом научного тыка было доказано:
(Ставим хук на клаву для Калькулятора)

Из примера хука на VC++
В функции CallNextHookEx hHook = Null
код в native dll

1).
Код: Выделить всё
Public Function HookProcName(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
if lParam Then msgbox lParam

HookProcName = CallNextHookEx( [color=red] Null [/color] , ncode, wParam, ByVal lParam)
End Function


В этом случае хук ставиться нормально, но при нажатии мышкой на кнупку 'Ок' в msgbox'е хук перестаёт ловить клаву.


2).

В функции CallNextHookEx hHook = 0&
код в native dll
Всё работает нормально!

3).
if lParam = 255 Then где 255 это код клавиши

Код: Выделить всё
Public Function HookProcName(ByVal ncode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
if lParam = 255 Then msgbox lParam

HookProcName = CallNextHookEx(0& , ncode, wParam, ByVal lParam)
End Function


В этом случае: Если изначально нажать лубую другую клавишу (кроме = 255) калькулятор вылетает, если начать с клавиши =255 то какую бы после этого клавишу не нажимали всё работает нормально.

3).
Код: Выделить всё
dim msg as  String

if lParam Then [b]msg = nCode & " " & lParam & " " & wParam[/b]



Калькулятор сново вылетает.


4).
Если сравнивать if lParam = WM_CLOSE Then -Вылетаем

5).
Если сравнивать if lParam = WM_PAINT Then - Показываем очередь msgbox и Вылетаем.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 28.03.2008 (Пт) 18:36

а от куда мы возьмём hProc, hLib ???

hProc это что? Хэнд процесса или адрес процедуры, который следовало бы назвать pProc.

Если хэндл процесса, то - GetCurrentProcess
Если адрес процедуры, то - AddressOf MyProc

а от куда мы возьмём hProc, hLib ???

App.hInstance

1) Я не знаю, как у тебя Null приводился к Long-у. Должна была быть ошибка Invalid using of Null.

Null это вообще особое значение особого подтипа Variant-а, а вовсе не 0&.

2) Ноль может быть и валиден, если например цепочка хуков кончается.
3) Отладчик рулит.
3) (два пункта 3 - это плохо, -- прим.) Пытаться использовать bbcode-ы в теге code - тоже плохо.
4) Отладчик, опять же, рулит.
5) Лавинное переполнение стека. Сообщение об переполнении тоже видимо хукается, и последняя страница стека также переполняется. Затем стек окончательно заканчивается и обработать переполнение уже просто некому - процесс убивается.

Я где-то ведь писал, что в процедурах надо ОБЯЗАТЕЛЬНО делать обработку ошибок.
VB использует SEH для обработки ошибок. Когда вы в VB в процедуре её (обработку) не делаете, ошибку обработает вышестоящий обработчик, т.е. обработчик вызывающей процедуры, а если такового не имеется, рантаймовый обработчик (в этом случае выводит стандартное VB-шное сообщение об ошибке и VB-приложение завершается.)

Здесь у вас исключение сваливается ничего не подозревающему калькуляторному SEH-хэндлеру, и, естественно, последствия непредсказуемы. Скорее всего исключение проходит по всей цепочке хэндлеров так и не встретив хэндлер, который бы согласился его обработать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 28.03.2008 (Пт) 19:40

Хакер
3) (два пункта 3 - это плохо, -- прим.)


Во во уже запарился.

Хакер писал(а):Я где-то ведь писал, что в процедурах надо ОБЯЗАТЕЛЬНО делать обработку ошибок


Хакер писал(а):Поэтому, если внутри функции в вашей библиотеке произойдёт ошибка, которая при этом вами не обрабатывается (внутри функции нет On Error ... -структур), выполнение улетит чёрти-куда.
http://bbs.vbstreets.ru/viewtopic.php?t=34902


Как же тогда сделать обработку?
-----------------------------------------------

сделал хук в библе...

Код: Выделить всё
Public Function DllEntryPoint(ByVal hInstance As Long, ByVal lReason As Long, ByVal lReserved As Long) As Long
     
    Select Case lReason
        Case DLL_PROCESS_ATTACH

            DllEntryPoint = 1
            TBHWND = FindWindow("SciCalc", "Калькулятор")

            If TBHWND <> 0 Then
            Th = GetWindowThreadProcessId(TBHWND, 0&)
            hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookProcName, app.hInstance, Th)
            End If
............
........
..
    End Select
End Function

Public Function HookProcName(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If lParam = WM_CLOSE Then
  MsgBox wParam
End If
   HookProcName = CallNextHookEx(hHook, nCode, wParam, ByVal lParam)
End Function


Опять же с хуком на клаву всё ок а вот на сообщения окну кальк вылетает :(

Подскажите пожалуйста Люди добрые.... ( Мне нужно отловить закрытие программы + отменить её закрытие + выполнить свой код)
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 28.03.2008 (Пт) 21:27

Как же тогда сделать обработку?

On Error ...

1. Учитывай, что ты можешь хукать какие-то рантайм-процессы (процессы в общем смысле этого слова), и получать неконтролируемую рекурсию.

2. Я бы не стал использовать MsgBox для оповещения.

3. Возьми отладчик и посмотри, почему вылетает калк. Тогда сразу будет очевидна проблема и способ её решения. Это в разы лучше, чем сидеть и гадать, а почему же он (калк) вылетает.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 29.03.2008 (Сб) 8:28

Хакер

3. Возьми отладчик и посмотри, почему вылетает калк. Тогда сразу будет очевидна проблема и способ её решения. Это в разы лучше, чем сидеть и гадать, а почему же он (калк) вылетает.

Я в этом не силён :( , но постарался...

Ошибку пишет Error_Invalid_Parameter...
Проблемма где-то здесь.

CallNextHookEx(hHook, nCode, wParam, ByVal lParam)
Вложения
Безымянный.PNG
OLLYDBG Screen
Безымянный.PNG (79.73 Кб) Просмотров: 11133
VBHook.zip
VBHOOK
(11.44 Кб) Скачиваний: 219
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 29.03.2008 (Сб) 13:05

Нашел интересную статью про Хук'и. В Данный момент изучаю.


http://www.rsdn.ru/article/baseserv/winhooks.xml[/quote]
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 29.03.2008 (Сб) 20:33

Подскажите плз...

Public Declare Function GetWindowThreadProcessId Lib "user32" Alias "GetWindowThreadProcessId" (ByVal hwnd As Long, lpdwProcessId As Long) As Long

как найти lpdwProcessId

-----------
Возможно ли поставить хук на чужое приложение(окно) вот так:
Код в native dll

Public Function Hook() as long

lpPrevWndProc = SetWindowLong(HWND, GWL_WNDPROC, AddressOf WindowProc)

End Sub

Public Sub UnHook()
Dim lngReturnValue As Long
lngReturnValue = SetWindowLong(ghw, GWL_WNDPROC, lpPrevWndProc)

End Sub

Function WindowProc(ByVal hwnd As Long, _
ByVal uMsg As Long, _
ByVal wParam As Long, _
ByVal lParam As Long) As Long

On Error Resume Next

Select Case uMsg
Case ....
WindowProc = 0
Case Else
WindowProc = CallWindowProc(lpPrevWndProc, hwnd, uMsg, wParam, lParam)

End Select

End Function
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 31.03.2008 (Пн) 9:42

Хакер

Похоже что проблемма не в корявости моих рук...
Вот код хука GET_MESSAGE

Код: Выделить всё

Public Type POINTAPI
    x As Long
    y As Long
End Type

Public Type tagMSG
    hwnd As Long     ' // Окно, чья Winproc получит сообщение
    message As Long   '// Номер сообщения
    wParam As Long
    lParam As Long
    time As Long      '// Время посылки сообщения
    pt As POINTAPI        '// Позиция указателя мыши (в экранных координатах)
End Type

Public Function SetHOOKTest() As Long

            TBHWND = FindWindow("SciCalc", "Калькулятор")
            If TBHWND <> 0 Then
              Th = GetWindowThreadProcessId(TBHWND, 0)
              hHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf HookProcName, App.hInstance, Th)
            Else
              MsgBox "Запусти калькулятор!"
            End If

End Function

Public Function UnHOOKTest() As Long
UnhookWindowsHookEx hHook
End Function


Public Function HookProcName(ByVal nCode As Long, ByVal wParam As Long, lParam As tagMSG) As Long
'On Error GoTo Errors
If lParam.message <> WM_NULL Then

        Select Case nCode
            Case HC_ACTION
             If lParam.message = WM_KEYDOWN Then

  Если здесь написать какой нибудь код то калькулятор вылетает!!!


             End If
            Case Else
        End Select
    End If
   
HookProcName = CallNextHookEx(hHook, nCode, wParam, lParam)

End Function




Так же калькулятор вылетает на функции CallNextHookEx
По кальку видно что KEYDOWN ловится и не передаётся дальше но и не вылетает... (Уже прогресс) (Если убрать CallNextHookEx и код после
If lParam.message = WM_KEYDOWN Then )

Хакер помоги пожалуйста разобраться в чём проблемма????

(Иногда меня посещает мысль что глюк в Native Dll)
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.03.2008 (Пн) 15:40

Хакер помоги пожалуйста разобраться в чём проблемма????

К сожалению, обстоятельства складываются так, что сейчас некогда. Дня через 4.

Единственное, что могу сейчас посоветывать - использовать не Delcare Function а TLB для объявления API-функций а библе.

И почему ОПЯТЬ у тебя нет во всех процедурах обработки ошибок? :?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 01.04.2008 (Вт) 23:20

Хакер

Единственное, что могу сейчас посоветывать - использовать не Delcare Function а TLB для объявления API-функций а библе.


Пожалуйста приведи пример.... А то ни разу с tbl не сталкивался. :oops:


И почему ОПЯТЬ у тебя нет во всех процедурах обработки ошибок?


Обработку ошибок я делал, просто по мере продвижения моих эксперементов они то добавляюся то убираются... (Обработка не спасает... А наоборот кальк сразу же вылетает, а без обработки живёт до выполнения кода после перехвата)


К сожалению, обстоятельства складываются так, что сейчас некогда. Дня через 4.

Хорошо я подожду.... (Этот проект уже стал делом принципа. Хочу разобраться и вникнуть...)
А пока эксперементирую с WH_CBT...
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 3:49

Пожалуйста приведи пример.... А то ни разу с tbl не сталкивался.

Пример чего? Процесса сталкивания с tlb?

Обработку ошибок я делал, просто по мере продвижения моих эксперементов они то добавляюся то убираются... (Обработка не спасает... А наоборот кальк сразу же вылетает, а без обработки живёт до выполнения кода после перехвата)

Показывай, как ты её делал в таком случае.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 02.04.2008 (Ср) 10:09

Хакер

Показывай, как ты её делал в таком случае.


Код: Выделить всё
Public Function HookProcName(ByVal nCode As Long, ByVal wParam As Long, lParam As tagMSG) As Long
On Error GoTo Errors
..........
.....
........
.........
Exit Function
Errors:
'//Пытаюсь узнать номер и описание ошибки
MsgBox Err.Description & "  " & Err.Number
Exit Function



Пример чего? Процесса сталкивания с tlb?

Я понял как создавать tbl но вот несколько вопросов:

1. Создавать нужно что Standard Dll или ActiveX Dll (а уже потом из них получать tbl.)

2. У меня не получаеться Обьявить(пробовал обьявлять в модуле и в классе) API-функций так чтобы они стали доступны в проекте (к которому подключили tbl)
Доступны в смысле не так :mytbl.FindWindow.
А просто когда я к функции обращаюсь mYWND=FindWindow(A,B)
VB не ругался что функция не определена.


Ещё один вариант tbl, как мне кажеться то что ниже это бред...
// решил сделать так: Обьявил в классе API
Создал функцию подобную API...
Public Function myFindWindow(Byval ClassName as String, Byval wCaption as String) as long
myFindWindow=FindWindow(ClassName,wCaption)
end function
Код так-то работает но вылетая кальк ругаеться уже на vbhook.dll а не на Msvbvm60.dll.

3.Если что-то не правильно обьясни по нормальному в доступной форме без такого
Офигительная логика.
потому что это делу не поможет...

---

А по поводу WH_CBT
Получилось отовить HCBT_MINMAX -->SW_MINIMIZE и пригнорировать его... Очень обрадовался.
Но как только после отлавливания решил выполнить код ShowWindow(hwnd,0) кальк вылетел... :(

Так же получилось отловить HCBT_DESTROYWND. Реакция на запрет этого действия: (нажали на крестик) Кальк рухнул
Но так же это действие работает с меню! Т.е. Если я вызову меню и у меня стоит запрет на дестрой то меню не закроеться и кальк продолжит работать... :?

Отловил HCBT_SYSCOMMAND--> SC_CLOSE (используеться для закрытия диологовых окон) запретил и кальк НЕ вылетел....

Вот я и думаю почему я не могу исполнить какой либо код после отлавливания сообщения (например: ShowWindow(hwnd,0) ) ????
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 13:00

Gemini
Если ты обработку делал точно так, как показал, я очень сомневаюсь что калк падал из-за этого.

У меня появились подозрения в том, что в контексте калка инициализация рантайма происходит как-то некорректно.

Я понял как создавать tbl но вот несколько вопросов:

1. Создавать нужно что Standard Dll или ActiveX Dll (а уже потом из них получать tbl.)

Видать не понял. TLB (а не TBL) надо делать не с помощью VB, а с помощью MIDL-а. Или любых других компиляторов IDL-языков.

2. У меня не получаеться Обьявить(пробовал обьявлять в модуле и в классе) API-функций так чтобы они стали доступны в проекте (к которому подключили tbl)
Доступны в смысле не так :mytbl.FindWindow.
А просто когда я к функции обращаюсь mYWND=FindWindow(A,B)
VB не ругался что функция не определена.

См. пункт 1.
TLB нужна для того, чтобы не использовать Declare Function. Даже если предположить, что в VB было бы можно создавать TLB, как бы ты их (API-функции) там объявлял?

Ещё один вариант tbl, как мне кажеться то что ниже это бред...
// решил сделать так: Обьявил в классе API
Создал функцию подобную API...
Public Function myFindWindow(Byval ClassName as String, Byval wCaption as String) as long
myFindWindow=FindWindow(ClassName,wCaption)
end function

а) См. пункт 1
б) Это действительно бред. Это библа-переходник к Declare Function.

Код так-то работает но вылетая кальк ругаеться уже на vbhook.dll а не на Msvbvm60.dll.

Что значит "ругается на библу"? Ты имеешь ввиду регион, в котором выброшено необработанное исключение? С этого и надо было начинать. Опять же, десять раз уже говорил - отладчик тебе в руки. Чем гадать, что там не так работае.

кальк вылетел...

Опять же, отладчик в руки. Потому что скорее всего опять переполнение стека.
Но так же это действие работает с меню! Т.е. Если я вызову меню и у меня стоит запрет на дестрой то меню не закроеться и кальк продолжит работать...

Что же ты хотел? По твоему меню -- не окно? В этой ОС всё - окна. Потому-то она так и называется.

Вот я и думаю почему я не могу исполнить какой либо код после отлавливания сообщения (например: ShowWindow(hwnd,0) ) ????

Наверное потому, что какое-то действие, совершаемое функцией ShowWindow, инициирует вызов твоего ХукПрок-а, который опять вызывает эту функцию, которая опять совершает какое-то действие, которое инициирует вызов твоего ХукПрок-а, который опять вызывает эту функцию, которая опять совершает какое-то дейсвтие, которое инициирует вызов твоего ХукПрок-а, который опять ...
И так до тех пор, пока не кончится 1 МБ стека.

Хук снимается, когда хук прок вызывается, и устанавливается, после возврата из ХукПрок? Если да, то причина в другом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.04.2008 (Ср) 14:18

Я не пойму, народ. Сидите, гадаете на кофейной гуще.
А не судьба вооружиться отладчиком, да посмотреть из-за чего именно вылетает?

Код: Выделить всё
Public Function HookProcName(ByVal nCode As Long, ByVal wParam As Long, lParam As tagMSG) As Long
'On Error GoTo Errors
If lParam.message <> WM_NULL Then

        Select Case nCode
            Case HC_ACTION
             If lParam.message = WM_KEYDOWN Then

  Если здесь написать какой нибудь код то калькулятор вылетает!!!


             End If
            Case Else
        End Select
    End If
   
HookProcName = CallNextHookEx(hHook, nCode, wParam, lParam)

End Function

Так уж и какой нибудь код? Есть подозрения, что косяк действительно в инициализации рантайма. Рекомендую переписать эту ДЛЛ один в один на человеческом языке и посмотреть, как работает предложенный код.
А я все практикую лечение травами...

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 02.04.2008 (Ср) 14:25

Хакер
Видать не понял. TLB

Я просто не правильно наисал... :oops:



Twister
На человеческом

Хорошо, может поможешь мне с переписью и отладчиком???
Буду ООООООЧень признателен!!!
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.04.2008 (Ср) 14:34

Хорошо, может поможешь мне с переписью и отладчиком???
Буду ООООООЧень признателен!!!

Хорошо. Только ты мне помоги материально.
Буду еще больше признателен. ;)
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 14:44

Я просто не правильно наисал...

Нет, ты не просто неправильно написал (хотя ты действительно писал везде TBL (видимо от Table) вместо TLB (Type Library)). Ты пытался сделать TLB с помощью VB, а не MIDL-ом..



Twister
Я ему три раза предлагал воспользоваться отладчиком
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 02.04.2008 (Ср) 19:35

Gemini
Короче, я так мельком глянул что там происходит и из-за чего падает -- кажется, дело в том что хук ставится ДО того как в удалённом процессе будет установлена точка входа (даже понятно почему так происходит).

Т.к. рантайм VB абильно использует сообщения, твой хук сразу же вызывается (т.е. ты хучишь инициализацию рантайма).

Т.е. инициализация рантайма прерывается на половине вызовом HookProc-а. И On Error именно поэтому наоборот сразу же валит весь процесс (потому что там (в __SetOnError)_ используется TlsGetValue, а пока рантайм неинициализирован, она получает бред на входе).

Шаги для решения проблемы:
1) Использовать флаговую перменную, устанавливаемую в DllEntryPoint, чтобы определять внутри фильтра, откуда он вызывается.
2) Использовать описанную в TLB функцию CallNextHookEx вместо обычной.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 03.04.2008 (Чт) 11:58

Хакер

Огромное тебе СПАСИБО за то что уделяешь мне столько времени!!!
(Без иронии) А то мне одному ни как не разобраться!!! :( :oops:

Нет, ты не просто неправильно написал (хотя ты действительно писал везде TBL (видимо от Table) вместо TLB (Type Library)). Ты пытался сделать TLB с помощью VB, а не MIDL-ом..


TLB ещё можно сделать из обычной ActivX DLL если стоит галочка на 'Файлы удаленного сервера' (Проект->Параметры->Компонент)
По поводу MIDL поисковик выводит много всего с этой (как я понял) абривиатурой но ни чего конкретного. (Скажи что это, как сделать CallNextHookEx в TLB )



Twister
Я ему три раза предлагал воспользоваться отладчиком

Я же ещё выше писал что нет у меня столько опыта чтоб чётко определить что и от куда растёт. :oops:

1) Использовать флаговую перменную, устанавливаемую в DllEntryPoint, чтобы определять внутри фильтра, откуда он вызывается.


Ты имеешь в виду??? :
Код: Выделить всё
Private Const DLL_PROCESS_ATTACH As Long = 1
Private Const DLL_PROCESS_DETACH As Long = 0
Private Const DLL_THREAD_ATTACH As Long = 2
Private Const DLL_THREAD_DETACH As Long = 3


Хакер Помоги мне пожалуйста доделать этот хук. :roll:
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 03.04.2008 (Чт) 13:27

Я же ещё выше писал что нет у меня столько опыта чтоб чётко определить что и от куда растёт
Но приобретать-то его надо.
В двух словах опишу извращенский способа поставить нужный breakpoint в проге на VB и брякнуться на нем в OllyDbg или другом отладчике (хотя другой для юзермода я не рекомендую):
Пишешь в коде на VB, в том месте, где нужно брякнуться какую-нибудь ерунду, типа VarPtr(0).
Открываешь скомпиленную прогу в любом HEX-едакторе (я предпочитаю HIEW), ищешь то место, где расположился VarPtr и вместо его вызова (там будет call) забиваешь опкод 0xCC (int 3), а остальные байты call'a забиваешь нопами (0x90), чтоб код не превратился в кашу. Все. Теперь в отладчике ты остановишься там, где тебе нужно.
А я все практикую лечение травами...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.04.2008 (Чт) 16:00

Gemini
1) Ты не сделаешь из ActiveX DLL никаким способом TLB, в которой была бы объявлена функция.

Это можно сделать лишь с помощью FNDLL-2, которая ещё на стадии разработки.

TLB создаётся мидлом.
Возьми исходники win32.tlb и погляди, сразу всё прояснится.


2) Нет, я не имею ввиду это.

Я имею ввиду:


Код: Выделить всё
Dim bRuntimeStarted As Boolean

... ... .. ..

Public Function DllEntryPoint(ByVal hInstance As Long, ByVal lReason As Long, ByVal lReserved As Long) As Long
    Select Case lReason
        Case DLL_PROCESS_ATTACH
            bRuntimeStarted = True

            TBHWND = FindWindow("SciCalc", "Калькулятор")
            If TBHWND <> 0 Then
                Th = GetWindowThreadProcessId(TBHWND, 0&)
                hHook = SetWindowsHookEx(WH_CALLWNDPROC, AddressOf HookProcName, App.hInstance, Th)
                DllEntryPoint = 1
            Else
                MsgBox "Window No Find"
            End If
           
        Case DLL_PROCESS_DETACH
             bRuntimeStarted = False
             If hHook <> 0 Then UnhookWindowsHookEx hHook
       
        Case DLL_THREAD_ATTACH
        Case DLL_THREAD_DETACH
    End Select
End Function

Обрати внимание на bRuntimeStarted. И в HookProc надо проверять - установлена ли bRuntimeStarted, и если вдруг не установлена - не сметь ничего от себя делать.

Идеален вариант - сделать вообще два обоаботчика, один без обработки ошибок с простым вызовом CallNextHook-а (обязательно из TLB), который будет вызываться пока bRuntimeStarted не установлена, и второй, с обработкой и со своими дейсвтями, который должен будет работать после того как bRuntimeStarted будет установлена.

Twister
В двух словах опишу извращенский способа поставить нужный breakpoint в проге на VB и брякнуться на нем в OllyDbg или другом отладчике (хотя другой для юзермода я не рекомендую):
Пишешь в коде на VB, в том месте, где нужно брякнуться какую-нибудь ерунду, типа VarPtr(0).
Открываешь скомпиленную прогу в любом HEX-едакторе (я предпочитаю HIEW), ищешь то место, где расположился VarPtr и вместо его вызова (там будет call) забиваешь опкод 0xCC (int 3), а остальные байты call'a забиваешь нопами (0x90), чтоб код не превратился в кашу. Все. Теперь в отладчике ты остановишься там, где тебе нужно.

Действительно ивзращенский, когда можно просто вставить в код вместо VarPtr(0) вызов DebugBreak(). И не надо ничего править, и вроде как даже документированный способ.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot и гости: 20

    TopList