MADSHI API Hooking VB Реализация

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

MADSHI API Hooking VB Реализация

Сообщение xenomorph » 02.05.2006 (Вт) 0:59

Привет всем!

Проблема:

Я занимаюсь прикручивания VB к универсальной библиотеке перехвата АПИ функций.
Проэкт: www.madshi.net

При использовании этой длл перехват любых АПИ превращаеться в тривиально простую
задачу.

В двух словах КАК это работает:

1. Библиотека перехвата АПИ - Delphi.
2. Инжекция либы во все процессы включая системные вызовом из ВБ приложения.
3. Создаётся IPC Queue внутри этого приложения.
4. При перехвате АПИ длл по IPC Queue вызывает функцию по указателю
внутри приложения инжектора, передавая внутрь параметры и указатель на
буфер для ответа.

Что у меня:

1. ДЛЛ для перехвата АПИ перехватывает.
2. Она успешно ВЫЗЫВАЕТ callback процедуру в модуле ВБ инжектора.

1) я НЕ МОГУ добраться до параметров :-(/
2) я НЕ могу записать данные в буфер ответа.
--
Memory cannot be ... и дплее по тексту.

Передаются указатели на буферы.

Примеры:
1. Длл перехватывает:
CreateProcessA
CreateProcessW
WinExec

Код callback-a:
Код: Выделить всё
'-----------------------------------------------------------------
Public Function IPCCallbackFunction(IPCname As String, _
                                    messageBuf As Long, _
                                    MessageLength As Long, _
                                    AnswerBuffer As Long, _
                                    AnswerLengh As Long) As Long

   'Любой анализ параметров - даёт сбой
End Function
'-----------------------------------------------------------------
'Установка IPC Queue:
Private Sub cb_CreateIPCQ_Click()
    If CreateIpcQueueEx("myIPCQueueName" & Chr(0), _
                        AddressOf IPCCallbackFunction, _
                        1, _
                        6000) Then
                       '^^^ Is locared in the Module!
                       '^^^ Unique IPC Name!
        M "IPC Started" & vbCrLf
    Else
        M "IPC FAILED" & vbCrLf
    End If
End Sub
'-----------------------------------------------------------------


Весь код в аттаче:
1. Перехват CP.
2. Перехват принтера.

Вопрос:

Из за чего access violation?
Как построить IPCQueue что бы не только параметры из длл передавались,
но и ответ в длл возвращался?
--
comments PO DELU are welcomed!
--
заранее огромное спасибо!
Вложения
MAD Injector VB.rar
(72.07 Кб) Скачиваний: 60
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Wild VB Code for Food
Постоялец
Постоялец
 
Сообщения: 387
Зарегистрирован: 16.06.2005 (Чт) 17:34
Откуда: ты, друг? =)) Сообщений: 1234

Сообщение Wild VB Code for Food » 02.05.2006 (Вт) 2:24

хм....странно...у меня пример совсем не пашет.....

Возможно всё дело в ByVal\ByRef
Лучше думать чем жевать.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Сообщение ANDLL » 02.05.2006 (Вт) 10:01

передавая внутрь параметры и указатель на
буфер для ответа
Внутри АП какого процесса лежат эти самые параметры и буфер для ответа? Может быть, в "жертве"? Потому что иначе возникает тех. вопрос: Каким образом эта магическая библиотека скопирует все параметры в наш АП?
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re

Сообщение xenomorph » 02.05.2006 (Вт) 10:24

To Wild VB Code for Food
and многоуважаемые All:
Рабочая верися global system interception.
Себя не хукает.
Системонезависимо.

1. Распаковать.
2. Запустить Test.exe.
3. Нажать Inject.
4. Запустьить calc.exe откуда-рибудь :-).
--
Хук снимаеться или Uninject \ reboot.
--
Теперь работает?
--
2 Andll отвечу через 1 мин. :-)
Вложения
Power_of_API_Hooking.rar
Power_of_API_hooking
(65.77 Кб) Скачиваний: 64
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Kovu
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 924
Зарегистрирован: 29.04.2005 (Пт) 17:38

Сообщение Kovu » 02.05.2006 (Вт) 13:01

xenomorph
Запустил, терь експлорер каждый раз спрашивает, а можно ли создавать процесс...забавно :)
Себя не хукает.

А вот и нет, тож вопрос задает: А можно ли процессу Test.exe запустить Calc.exe
Если всё делать своими ручками, они скоро отвалятся !

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re

Сообщение xenomorph » 02.05.2006 (Вт) 13:49

Not correct!
Не только эксплорер, АБСОЛЮТНО всё будет спрашивать :-).
Если мене помогут - напишу статью как собрать USERMOD-ный фаервол на ВБ :-).

ПАМАААГИИИТЕЕЕ!!! :cry: :cry: :cry:
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 02.05.2006 (Вт) 21:28

Проблема, как уже было замечено, в том, что надо принимать параметры не по ссылке, а по значению, т. е. перед аргументом прописать ByVal. Или я не понял и помощь нужна уже в другом???
Изображение

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 02.05.2006 (Вт) 22:00

Я тут покопался немного и у самого вопросы возникли.. вот код:

Код: Выделить всё
Option Explicit
Private Declare Function WinExec Lib "kernel32.dll" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long

Private Sub cb_CreateIPCQ_Click()
  CollectHooks
  Call HookAPI("kernel32.dll", "WinExec", AddressOf WinExecHookProc, AddressOf WinExecNextHook)
  WinExec "notepad.exe", 1
  UnhookAPI AddressOf WinExecNextHook
  FlushHooks
End Sub

Модуль
Код: Выделить всё
Option Explicit
'---------------------------------
'Injection\Uninjection Routines:
'---------------------------------
'To explore:
'GetCurrentSessionId
'---------------------------------
Public Const ALL_SESSIONS = &HFFFFFFED       ' apps of all sessions
Public Const CURRENT_SESSION = &HFFFFFFEC    ' apps of current session
Public Const CURRENT_USER = &HFFFFFFEB       ' apps of current user

Public Const SYSTEM_PROCESSES = &H10  ' include this flag to include system processes + services
Public Const CURRENT_PROCESS = &H8    ' exclude this flag to exclude injection into yourself
  '---------------------------------------------------------
Public Const SYSTEM_PROCESSES_ALL_SESSIONS As Long = SYSTEM_PROCESSES + ALL_SESSIONS
Public Const SYSTEM_PROCESSES_CURRENT_SESSION As Long = SYSTEM_PROCESSES + CURRENT_SESSION
Public Const SYSTEM_PROCESSES_CURRENT_USER As Long = SYSTEM_PROCESSES + CURRENT_USER
Public Const CURRENT_PROCESS_ALL_SESSIONS As Long = CURRENT_PROCESS + ALL_SESSIONS
Public Const CURRENT_PROCESS_CURRENT_SESSION As Long = CURRENT_PROCESS + CURRENT_SESSION
Public Const CURRENT_PROCESS_CURRENT_USER As Long = CURRENT_PROCESS + CURRENT_USER

Public Declare Function InjectLibraryW Lib "MadCHook.dll" (ByVal InjectionFlags As Long, ByVal s_Dll_Name As String, Optional ByVal timeOut As Long = 7000) As Boolean
Public Declare Function UninjectLibraryW Lib "MadCHook.dll" (ByVal InjectionFlags As Long, ByVal s_Dll_Name As String, Optional ByVal timeOut As Long = 7000) As Long

Public Declare Function CreateIpcQueueEx Lib "MadCHook.dll" (ByVal ipc As String, ByVal callback As Long, Optional ByVal maxThreadCount As Long = 16, Optional ByVal maxQueueLen As Long = &H1000) As Boolean
Public Declare Function DestroyIpcQueue Lib "MadCHook.dll" (ByVal ipc As String) As Boolean
Public Declare Function HookAPI Lib "MadCHook.dll" (ByVal module As String, ByVal api As String, ByVal callbackFunc As Long, ByVal nextHook As Long, Optional ByVal flags As Long = 0) As Boolean
Public Declare Function UnhookAPI Lib "MadCHook.dll" (ByVal nextHook As Long) As Boolean

Public Declare Function CollectHooks Lib "MadCHook.dll" () As Long
Public Declare Function FlushHooks Lib "MadCHook.dll" () As Long

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Public Function WinExecHookProc(ByVal cmdLine As String, ByVal showCmd As Long) As Long
  If MsgBox("Execute?", VbMsgBoxStyle.vbYesNo Or VbMsgBoxStyle.vbQuestion, StrConv(cmdLine, vbUnicode)) = VbMsgBoxResult.vbYes Then
    WinExecHookProc = WinExecNextHook(cmdLine, showCmd)
  Else
    WinExecHookProc = 0
  End If
End Function


Public Function WinExecNextHook(ByVal cmdLine As String, ByVal showCmd As Long) As Long
    DoEvents
End Function


иногда все путем хучится а иногда иде с громким писком мгновенно вырубается - от чего это?
з.ы. хотя и код не меняю
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 03.05.2006 (Ср) 15:20

все, сам разобрался - я два раза получаю указатель на Next - функцию, а они изменяются и я не мог снять хук (решение - получить адрес Stub-ом и везде его юзать)
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Re

Сообщение xenomorph » 03.05.2006 (Ср) 16:03

2 Gotha:
Можно на твой код посмотреть (приаттачь проэкт пжжжалуйста!)\отошли личкой Ж-) как вариант.
--
Заранее благодарю!
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 03.05.2006 (Ср) 16:09

Код: Выделить всё
Option Explicit
Private Declare Function WinExec Lib "kernel32.dll" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long

dim funcAddr&

Private Sub cb_CreateIPCQ_Click()
  funcAddr=Stub(AddressOf WinExecNextHook)
  CollectHooks
  Call HookAPI("kernel32.dll", "WinExec", AddressOf WinExecHookProc, funcAddr)
  WinExec "notepad.exe", 1
  UnhookAPI funcAddr
  FlushHooks
End Sub

private function Stub&(byval x&)
Stub=x
end fucntion
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.

xenomorph
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 508
Зарегистрирован: 18.04.2004 (Вс) 11:41
Откуда: это не важно - на сегодня у меня есть алиби ...

Сообщение xenomorph » 09.05.2006 (Вт) 10:34

2 Gotha:

:oops: А ты код что в эксешник запихнул???!!!

Код: Выделить всё
  funcAddr=Stub(AddressOf WinExecNextHook)
  CollectHooks
  Call HookAPI("kernel32.dll", "WinExec", AddressOf WinExecHookProc, funcAddr)
  WinExec "notepad.exe", 1
  UnhookAPI funcAddr
  FlushHooks


Во изврат Ж-).
Оно ж по идее в длл юыть должно ... или как?

ОНО У ТЕБЯ НОРМАЛЬНО РАБОТАЕТ?
... Dpkjvfnm dc`xnj itdtkbnmcz, f tckb yt itdtkbnmcz hfcitdtkbnm b dpkjvfnm !!! ...

Gotha
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 106
Зарегистрирован: 20.04.2006 (Чт) 10:55
Откуда: Красногорск

Сообщение Gotha » 18.05.2006 (Чт) 16:02

ну энное количество раз запускал - работало, не падало вроде :roll:
Du stirbst. Besitz stirbt.
Die Sippen sterben.
Der einzig lebt - wir wissen es
Der Toten Tatenruhm.


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

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

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

    TopList  
cron