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

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 03.04.2008 (Чт) 16:24

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

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

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

Antonariy
А зачем ему их (хекс представления call-а) знать?

Gemini
Не пропусти этот пост:
http://bbs.vbstreets.ru/viewtopic.php?p=6691110#6691110

Последнее сообщение страницы обычно не замечают.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Сообщение Antonariy » 03.04.2008 (Чт) 16:58

Эээ... Twister написал, что нужно править компиленный файл hex-редактором, а я так понимаю, что у asm'овского call есть свой hex-код, как у nop. Или я чего-то не то понимаю?
Лучший способ понять что-то самому — объяснить это другому.

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

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

Разумеется есть. Причём не один, а множество вариаций (far/near, abs/rel и т.д.)

Дело в том что Gemini даже если и придётся что-то править, то знать (именно знать заведомо заранее) код башки инструкции call не нужно. Он ведь будет не по коду её искать (ибо не найдёт он её по первому байту) - а смотреть в отладчике. А отлачик показывает (во-первых) VA/RVA/оффсет инструкции и (во-вторых) - хекс-дамп инструкции. OllyDbg показывает. Ну, собственно, про неё и речь шла.
—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 (Чт) 21:10

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

Я имею ввиду:


Да, я это и имел ввиду кроме "bRuntimeStarted".

Сейчас я пробую ещё оди метод.... Уже основываясь на ваших подсказках...
Дело в том что я заметил такую вещь:
Есть программа которая делает LoadLibrary что в свою очередь вызывает в VBHook.dll функцию DllEntryPoint с lReason =DLL_PROCESS_ATTACH
Вот а здесь начинаеться самое интересное:
Допустим что мы для проверки поставили в DLL_PROCESS_ATTACH мессадж "ляляляля"...
Так вот этот мессадж выскакивает 2 раза.
1)когда происходи LoadLibrary
2)Когда окно калька обрабатывает какое либо (первое) сообщение...
Т.е. у нас vbhook.dll загружаеться 2 раза один в память программы с вызовом loadlibrary а второй в кальк (с реакцией на сообщения)..
После чего можно спокойно сделать FreeLibrary а хук останеться все равно в кальке....
Глобальный вывод...
Первая загрузка должна быть такой:
ПРИ: MELOAD (или bRuntimeStarted) =False
Код: Выделить всё
Public Function HookProcName(ByVal nCode As Long, ByVal wParam As Long, lParam As tagMSG) As Long
if MELOAD (или bRuntimeStarted) = ture then
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 if
End Function


Вторая соответственно:
ПРИ: MELOAD (или bRuntimeStarted) =True

Код: Выделить всё
Public Function HookProcName(ByVal nCode As Long, ByVal wParam As Long, lParam As tagMSG) As Long
if MELOAD (или bRuntimeStarted) = ture then
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 if
End Function

Проверять это можно способом:
CreateToolhelpSnapshot
Process32First
Module32First
если мы узнаем что нашу VBHOOK.dll использует кальк то можно сделать FreeLibrary (В программе) и ловить хуки в кальке...
(Правда метод какой то корявый но иного метода кроме отлова от куда vbhook.dll была вызвана я не знаю)
(Даже не понадобилась TLB)

Вы в этом лучше понимаете. Возможно у вас будут лучше идеи.
В нашем деле главное ЛОГИКА.

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

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

Сообщение Хакер » 04.04.2008 (Пт) 1:44

Вот а здесь начинаеться самое интересное:
Допустим что мы для проверки поставили в DLL_PROCESS_ATTACH мессадж "ляляляля"...
Так вот этот мессадж выскакивает 2 раза.
1)когда происходи LoadLibrary
2)Когда окно калька обрабатывает какое либо (первое) сообщение...
Т.е. у нас vbhook.dll загружаеться 2 раза один в память программы с вызовом loadlibrary а второй в кальк (с реакцией на сообщения)..

Да, именно так и должно быть. Но хуки в контексте калк'а начинают обрабатываться ещё до того, как пункт 2 произойдёт. Отсюда и падает всё.

(Дальше идут в противопоставление два куска кода, причём фишка в том, что куски ничем не отличаются... :? )

Проверять это можно способом:
CreateToolhelpSnapshot
Process32First
Module32First
если мы узнаем что нашу VBHOOK.dll использует кальк то можно сделать FreeLibrary (В программе) и ловить хуки в кальке...
(Правда метод какой то корявый но иного метода кроме отлова от куда vbhook.dll была вызвана я не знаю)

Проверять что? Что библа в контексте калка? А зачем это проверять?
Это не имеет никакого отношения к причине падения.

Сам по себе код HookProcName (который существуют в двух одинаковых экземплярах) кривой. По следующим причинам:

1) Если флаг не установлен, код CallNextHookEx вообще не вызывается. Это катастрофическая ошибка.

2) Если исправить пункт 1. - венести вызов CallNextHookEx из If-блока, то это не спасёт ситуацию, т.к. добавится обработка ошибок + вызов через Declare использует TLS (не путать с TLB!).

Поэтому за пределами If-блока надо использовать вызов CallNextHookEx, объявленной именно в TLB. Потому как это превратится в обычный вызов через таблицу импорта.

(Даже не понадобилась TLB)

Как видишь - всё-таки она понадобится.

Возможно у вас будут лучше идеи.

Скорее, у меня есть правильные идеи. Потому как твоя идея просто-напросто нерабочая.
—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 » 04.04.2008 (Пт) 7:06

Хакер
Ну, считай, что я предложил реализовать DebugBreak() ручками... :) Просто если там трабла с вызовом АПИ, то DebugBreak() имеет все шансы не быть вызванным.
и вроде как даже документированный способ
А вставка 0xCC как буд-то не документирована... :wink:
А я все практикую лечение травами...

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

Сообщение Хакер » 04.04.2008 (Пт) 12:41

Twister
Так я уже который раз твержу о TLB. С вызовом API через TLB никаких проблем быть не может по определению.

VB для Declare-функций имеет свою таблицу импорта, и свой загрузчик для неё (DllCallFunction, которая нифига не call, которая по праву должна называться DllGetProcAddress). Эта DllGetProcAddress использует TLS. TLS инициализируется в процессе инициализации рантайма.

Вывод: использовать DllCallFunction (т.е. вызывать Declare Api) функции в процессе инициализации библиотеки нельзя.

Хотя я помню, у ГСерга в его NativeDLL было можно, а там вообще никакой инициализации не было.


А вставка 0xCC как буд-то не документирована...

Конечно. Где ты в MSDN увидал призывы использовать хекс-редакторы для расстановки бреков?
—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 » 04.04.2008 (Пт) 14:57

Где ты в MSDN увидал призывы использовать хекс-редакторы для расстановки бреков?
Я увидел это в коде функции DebugBreak(). Чем IDA хуже MSDN? :wink:

... Впрочем, не будем разводить флуд...
А я все практикую лечение травами...

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

Сообщение Gemini » 05.04.2008 (Сб) 9:30

Хакер

Да, именно так и должно быть. Но хуки в контексте калк'а начинают обрабатываться ещё до того, как пункт 2 произойдёт. Отсюда и падает всё.

Возможно это можно как-то определить и не обрабатывать до появления певого сообщения, или вообще самому послать кальку сообщения до того как он вылетит....
А я раньше думал что всё падает из-за того что хук сначала ставится
на vb'шную программу...

Точно баз тлб не разобаться...

Я нашел исходник одной тлб, но туда надо загнать ещё одну структуру.

Код: Выделить всё
Public Type tagMSG
    hwnd As Long   
    message As Long 
    wParam As Long
    lParam As Long
    time As Long   
    pt As POINTAPI       
End Type



вот код idl:

Код: Выделить всё
[uuid(5080FEFB-E810-4502-8884-2BDA3563E10B), version(1.0),
helpstring("Declarations]

library HookDeclares
{
    importlib("stdole2.tlb");
    typedef struct
    {
      long Data1;
      short Data2;
      short Data3;
      unsigned char Data4[8];
    } VBGUID;
    typedef [public] VBGUID CLSID;
    typedef [public] VBGUID IID;
    typedef VBGUID* REFGUID;
    typedef VBGUID* REFIID;
    typedef VBGUID* REFCLSID;
    typedef enum
    {
      CLSCTX_INPROC_SERVER   = 1,
      CLSCTX_INPROC_HANDLER  = 2,     
      CLSCTX_LOCAL_SERVER    = 4,
      CLSCTX_REMOTE_SERVER   = 16
    } CLSCTX;

[dllname("user32.dll")]
module user32 {
[entry("CallNextHookEx")] long stdcall CallNextHookEx ([in] long hHook, [in] long nCode, [in] long wParam, [in] long lParam);
}
Где lParam должен стать tagMSG типом.


Будьте так добры... Сделайте пожалуйста из этого кода - тлб и idl (для изучения).
В нашем деле главное ЛОГИКА.

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

Пред.

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

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

Сейчас этот форум просматривают: AhrefsBot, Mail.ru [бот] и гости: 7

    TopList