одноразовый перехватчик вызовов API-функций

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

одноразовый перехватчик вызовов API-функций

Сообщение marvan » 22.06.2006 (Чт) 10:16

У меня получился одноразовый перехватчик вызовов API-функций.
А хочется сделать - многоразовый.
В данном случае перехватывается чтение системного реестра функцией RegQueryValueEx.
Ошибка возникает в функции MyRegQueryValueEx если раскомментировать строку
' sAsm = StartSpy(pHandle, ApAdrFunction, MyAdrFunction)


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

' Перехват вызовов API функций
' Работает только в скомпиллированном виде!

Private Declare Sub CopyMemory _
                Lib "kernel32" _
                Alias "RtlMoveMemory" (lpDest As Any, _
                                       lpSource As Any, _
                                       ByVal cBytes As Long)

Private Declare Function GetModuleHandle _
                Lib "kernel32" _
                Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long

Private Declare Function GetProcAddressNum _
                Lib "kernel32" _
                Alias "GetProcAddress" (ByVal hModule As Long, _
                                        ByVal lpProcName As Long) As Long

Private Declare Function GetProcAddress _
                Lib "kernel32" (ByVal hModule As Long, _
                                ByVal lpProcName As String) As Long

Private Const PROCESS_ALL_ACCESS As Long = &H1F0FFF

Private Declare Function OpenProcess _
                Lib "kernel32" (ByVal dwDesiredAccess As Long, _
                                ByVal bInheritHandle As Long, _
                                ByVal dwProcessId As Long) As Long

Private Declare Function GetCurrentProcessId _
                Lib "kernel32" () As Long

Private Declare Function ReadProcessMemory _
                Lib "kernel32" (ByVal hProcess As Long, _
                                lpBaseAddress As Any, _
                                lpBuffer As Any, _
                                ByVal nSize As Long, _
                                lpNumberOfBytesWritten As Long) As Long

Private Declare Function WriteProcessMemory _
                Lib "kernel32" (ByVal hProcess As Long, _
                                lpBaseAddress As Any, _
                                lpBuffer As Any, _
                                ByVal nSize As Long, _
                                lpNumberOfBytesWritten As Long) As Long

Private sAsm As String 'буфер

Private MyAdrFunction As Long 'адрес замещающей функции

Private ApAdrFunction As Long 'адрес перехвытываемой функции

Private Declare Function CloseHandle _
                Lib "kernel32" (ByVal hObject As Long) As Long

Private Declare Function LoadLibrary _
                Lib "kernel32" _
                Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _
                ByVal hKey As Long, _
                ByVal lpValueName As String, _
                ByVal lpReserved As Long, _
                lpType As Long, _
                lpData As Any, _
                lpcbData As Long) As Long

Public Sub Main()
    Dim inet As Object
    Call mMain.CaptureLib
    Set inet = CreateObject("InternetExplorer.Application")
    inet.Visible = True
   
    inet.Navigate "http://bbs.vbstreets.ru/"
End Sub

' вызов этой функции приводит к запуску перехвата
' вызова функции RegQueryValueExA
Public Sub CaptureLib()
    Dim pId As Long
    Dim pHandle As Long '
    'получить идентификатор процесса
    pId = GetCurrentProcessId
    'получить описатель процесса
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pId)
    'адрес замещающей функции
    MyAdrFunction = GetAdres(AddressOf MyRegQueryValueEx)
    'адрес перехватываемой функции
    ApAdrFunction = IsFunctionExported("RegQueryValueExA", "advapi32.dll")
   
    sAsm = StartSpy(pHandle, ApAdrFunction, MyAdrFunction)
   
    CloseHandle pHandle
End Sub

'начать перехват
'pHandle - идентификатор процесса
'lApAdr - адрес перехватываемой функции
'lMyAdr - адрес замещающей функции
'возврашает строку содержащую первые 6 байт перехватываемой функции
Private Function StartSpy(pHandle As Long, _
                          lApAdr As Long, _
                          lMyAdr As Long) As String
    Dim TmpStr As String * 6
    Dim buf(0 To 5) As Byte 'буфер
    Dim jmp(0 To 5) As Byte
    Dim i As Long
   
    jmp(0) = &H68 'здесь будет код инструкции push
    CopyMemory jmp(1), lMyAdr, 4 'аргумент push
    jmp(5) = &HC3 'здесь будет код инструкции ret
    'Прочитаем и сохраним первые оригинальные 6 байт стандартной API функции
    ReadProcessMemory pHandle, ByVal lApAdr, buf(0), 6, 0&
    WriteProcessMemory pHandle, ByVal lApAdr, jmp(0), 6, 0&
   
    'перевод массива в строку
    For i = 0 To 5
        Mid$(TmpStr, i + 1, 1) = Chr$(buf(i))
    Next

    StartSpy = TmpStr
End Function

'закончить перехват
'ProcessId - идентификатор процесса
'lApAdr - адрес перехватываемой функции
'OldCod - строка содержащая первые 6 байт перехватываемой функции
Private Sub StopSpy(pHandle As Long, _
                    lApAdr As Long, _
                    OldCod As String)
    Dim buf(0 To 5) As Byte 'буфер
    Dim i As Long

    'перевод строки в массив
    For i = 0 To 5
        buf(i) = Asc(Mid$(OldCod, i + 1, 1))
    Next

    WriteProcessMemory pHandle, ByVal lApAdr, buf(0), 6, 0&
End Sub

Private Function GetAdres(Ptr As Long) As Long
    GetAdres = Ptr
End Function

Private Function IsFunctionExported(ByVal sFunction As String, _
                                    ByVal sModule As String) As Long
    Dim hMod As Long
    'описатель модуля
    hMod = GetModuleHandle(sModule)

    If hMod = 0 Then '
        hMod = LoadLibrary(sModule)
    End If

    If hMod Then
        If IsNumeric(sFunction) = True Then
            Dim mNum As Long
            mNum = MakeDWord(CInt(sFunction), 0)
            IsFunctionExported = GetProcAddressNum(hMod, mNum)
        Else
       
            IsFunctionExported = GetProcAddress(hMod, sFunction)
        End If
    End If

End Function

Private Function MyRegQueryValueEx( _
                ByVal hKey As Long, _
                ByVal lpValueName As String, _
                ByVal lpReserved As Long, _
                ByVal lpType As Long, _
                ByVal lpData As Long, _
                ByVal lpcbData As Long) As Long
    Dim pId As Long
    Dim pHandle As Long
    pId = GetCurrentProcessId
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pId)
    Call StopSpy(pHandle, ApAdrFunction, sAsm)
    MsgBox StrConv(lpValueName, vbUnicode)
   
    MyRegQueryValueEx = RegQueryValueEx(ByVal hKey, ByVal lpValueName, ByVal lpReserved, ByVal lpType, ByVal lpData, ByVal lpcbData)
   
    ' ошибка возникнет, если раскомментировать эту строку, чтобы перехватывать остальные вызовы
'    sAsm = StartSpy(pHandle, ApAdrFunction, MyAdrFunction)
    CloseHandle pHandle

End Function

Private Function MakeDWord(LoWord As Integer, _
                           HiWord As Integer) As Long
    CopyMemory MakeDWord, LoWord, 2&
    CopyMemory ByVal VarPtr(MakeDWord) + 2&, HiWord, 2&
End Function

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.06.2006 (Чт) 13:11

Сразу же первое замечание: вместо OpenProcess(GetCurrentProcessId) можно использовать GetCurrentProcess, а можно даже константу -1.

Второе замечание:
Код: Выделить всё
    hMod = GetModuleHandle(sModule)

    If hMod = 0 Then '
        hMod = LoadLibrary(sModule)
    End If

Почему бы не просто hMod = LoadLibrary(sModule) :?:

Третье замечание: "перевод строки в массив" и обратно делается не циклом, а простым присваиванием. Цикл с Chr/Asc работает гораздо хуже.

Четвёртое замечание: зачем вообще вся эта мутотень с Read/WriteProcessMemory? Чем не устроила CopyMemory?
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.06.2006 (Чт) 13:44

Пятое замечание: вызов mNum = MakeDWord(CInt(sFunction), 0) -- всё равно что присваивание mNum = CInt(sFunction).


После того, как объекты замечаний будут устранены, может и код заработает...
Изображение

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 22.06.2006 (Чт) 15:01

Спасибо.
Почти все замечания учёл.
Оставил WriteProcessMemory т.к. записать в память процесса с помощью CopyMemory не получилось.
Код стал как конфетка, но по прежнему валится в функции MyRegQueryValueEx если раскомментировать строку
' Call StartCapture

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

' mCapture.bas
' Перехват вызовов API функций
' Работает только в скомпиллированном виде!
' Выводит сообщение с именем читаемого параметра.

Private Declare Sub CopyMemory _
                Lib "kernel32" _
                Alias "RtlMoveMemory" (lpDest As Any, _
                                       lpSource As Any, _
                                       ByVal cBytes As Long)

Private Declare Function GetProcAddressNum _
                Lib "kernel32" _
                Alias "GetProcAddress" (ByVal hModule As Long, _
                                        ByVal lpProcName As Long) As Long

Private Declare Function GetProcAddress _
                Lib "kernel32" (ByVal hModule As Long, _
                                ByVal lpProcName As String) As Long

Private Declare Function ReadProcessMemory _
                Lib "kernel32" (ByVal hProcess As Long, _
                                lpBaseAddress As Any, _
                                lpBuffer As Any, _
                                ByVal nSize As Long, _
                                lpNumberOfBytesWritten As Long) As Long

Private Declare Function WriteProcessMemory _
                Lib "kernel32" (ByVal hProcess As Long, _
                                lpBaseAddress As Any, _
                                lpBuffer As Any, _
                                ByVal nSize As Long, _
                                lpNumberOfBytesWritten As Long) As Long

Private Declare Function LoadLibrary _
                Lib "kernel32" _
                Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" ( _
                ByVal hKey As Long, _
                ByVal lpValueName As String, _
                ByVal lpReserved As Long, _
                lpType As Long, _
                lpData As Any, _
                lpcbData As Long) As Long
               
Private MyAdrFunction As Long 'адрес замещающей функции
Private ApAdrFunction As Long 'адрес перехвытываемой функции
Private buf(0 To 5) As Byte 'буфер
Private jmp(0 To 5) As Byte
   
Public Sub Main()
    Dim inet As Object
    Call InitCapture
    Set inet = CreateObject("InternetExplorer.Application")
    inet.Visible = True
   
    inet.Navigate "http://bbs.vbstreets.ru/"
End Sub

' вызов этой функции приводит к запуску перехвата
' вызова функции RegQueryValueExA
Public Sub InitCapture()
    'адрес замещающей функции
    MyAdrFunction = GetAdres(AddressOf MyRegQueryValueEx)
    'адрес перехватываемой функции
    ApAdrFunction = IsFunctionExported("RegQueryValueExA", "advapi32.dll")
   
    jmp(0) = &H68 'здесь будет код инструкции push
    CopyMemory jmp(1), MyAdrFunction, 4 'аргумент push
    jmp(5) = &HC3 'здесь будет код инструкции ret
    Call StartCapture
End Sub

'начать перехват
Private Sub StartCapture()
    'Cохраним первые оригинальные 6 байт стандартной API функции
    ReadProcessMemory -1&, ByVal ApAdrFunction, buf(0), 6, 0&
    WriteProcessMemory -1&, ByVal ApAdrFunction, jmp(0), 6, 0&
End Sub

'закончить перехват
Private Sub StopCapture()
    'Восстановим первые оригинальные 6 байт стандартной API функции
    WriteProcessMemory -1&, ByVal ApAdrFunction, buf(0), 6, 0&
End Sub

Private Function MyRegQueryValueEx( _
                ByVal hKey As Long, _
                ByVal lpValueName As String, _
                ByVal lpReserved As Long, _
                ByVal lpType As Long, _
                ByVal lpData As Long, _
                ByVal lpcbData As Long) As Long
    Call StopCapture
    MsgBox StrConv(lpValueName, vbUnicode)
   
    MyRegQueryValueEx = RegQueryValueEx( _
                ByVal hKey, _
                ByVal lpValueName, _
                ByVal lpReserved, _
                ByVal lpType, _
                ByVal lpData, _
                ByVal lpcbData)
   
    ' ошибка возникнет, если раскомментировать эту строку, чтобы перехватывать остальные вызовы
'   Call StartCapture
End Function

Private Function IsFunctionExported(ByVal sFunction As String, _
                                    ByVal sModule As String) As Long
    Dim hMod As Long
    'описатель модуля
    hMod = LoadLibrary(sModule)

    If hMod Then
        If IsNumeric(sFunction) = True Then
            IsFunctionExported = GetProcAddressNum(hMod, CInt(sFunction))
        Else
            IsFunctionExported = GetProcAddress(hMod, sFunction)
        End If
    End If
End Function

Private Function GetAdres(Ptr As Long) As Long
    GetAdres = Ptr
End Function

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.06.2006 (Чт) 15:34

У меня даже скомпиленное вылетает с Out of stack space...
Изображение

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

Сообщение keks-n » 22.06.2006 (Чт) 15:45

marvan
Может я тебе другой перехватчик дам, а? Принцип тот же, но работает в IDE.
Изображение

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 22.06.2006 (Чт) 16:05

2 tyomitch
Обе версии вылетают с Out of stack space? или только последняя?
Я подозреваю, что ошибка в неправильной передаче параметров MyRegQueryValueEx или вызове RegQueryValueEx.

2 keks-n
В общем - задача данной проги даже не в самом перехвате API, а в подмене результата API функции. Цель - различные фокусы при использовании COM компонентов. Например, уже есть рабочий вариант проги перехватывающей функцию ReadFile при открытии Access'овской БД через ADO. При этом происходит дешифровка считываемого фрагмента файла.
Массу неудобств при работе с компонентом SHDocVwCtl.WebBrowser доставляют настройки Internet Explorer, хранимые в реестре. Вот и пришла идея - поймать соответствующий вызов, да подменить значение на "правильное".
Если ваш код позволит это сделать - буду благодарен.

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

Сообщение keks-n » 22.06.2006 (Чт) 16:30

marvan
1) Тема замены настроек в WebBrowser уже обсуждалась, и решение, как буд-то находили без махинаций с реестром.
2) Данную функцию лучше не трогать-VB её вызывает и довольно часто.
3) Код (использовался тоже для "фокуса" с COM, он ис себя представляет почти тоже самое, но на мой взляд немного удобнее) лежит здесь:

http://bbs.vbstreets.ru/viewtopic.php?t=26330

Его немного адаптировать и усё заработает, но лучше перехват выполить в отдельной DLL, чтобы не было проблем с отладкой.

И ещё-попытался перехватить данную функцию-таки да что-то с параметрами, посмотрю ещё, если заработает-выложу правильный вариант.
Изображение

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

Сообщение keks-n » 22.06.2006 (Чт) 17:08

Ловится... Правда, строку придётся вручную по указателю вытаскивать.
Код: Выделить всё

Option Explicit

Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxA" (ByVal hwnd As Long, ByVal lpText As Long, ByVal lpCaption As String, ByVal wType As Long) As Long

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Dim RQVEBackUp As Double



Sub ReplaceFunc(ByVal Deinst As Long, ByVal Source As Long, backup As Double)
Dim buffer(5) As Byte, written As Long
Call ReadProcessMemory(GetCurrentProcess, ByVal Deinst, backup, 6, written)
buffer(0) = &H68
CopyMemory buffer(1), Source, 4
buffer(5) = &HC3
WriteProcessMemory GetCurrentProcess, ByVal Deinst, buffer(0), 6, written
End Sub
Sub RestoreFunc(ByVal Deinst As Long, ByVal backup As Double)
Dim written As Long, buffer(5) As Byte
CopyMemory buffer(0), backup, 6
WriteProcessMemory GetCurrentProcess, ByVal Deinst, buffer(0), 6, written
End Sub

Public Function InterceptedRegQueryValueEx(ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
RestoreFunc GetProcAddress(GetModuleHandle("advapi32.dll"), "RegQueryValueExA"), RQVEBackUp
InterceptedRegQueryValueEx = RegQueryValueEx(hKey, lpValueName, lpReserved, lpType, lpData, lpcbData)
MessageBox 0, lpValueName, "RegQueryValueEx", 0
repl
End Function
Sub main()
Dim a() As Byte
a = StrConv("Некая строка", vbFromUnicode)
ReDim Preserve a(UBound(a) + 1)
repl
RegQueryValueEx 0, VarPtr(a(0)), 0, 0, 0, 0
RegQueryValueEx 0, VarPtr(a(0)), 0, 0, 0, 0
RestoreFunc GetProcAddress(GetModuleHandle("advapi32.dll"), "RegQueryValueExA"), RQVEBackUp
End Sub

Private Sub repl()
ReplaceFunc GetProcAddress(LoadLibrary("advapi32.dll"), "RegQueryValueExA"), AddressOf InterceptedRegQueryValueEx, RQVEBackUp
End Sub

Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 22.06.2006 (Чт) 18:12

За вытаскиванием строки по указателю см. статью.


Вместо
Код: Выделить всё
Dim a() As Byte
a = StrConv("Некая строка", vbFromUnicode)
ReDim Preserve a(UBound(a) + 1)
RegQueryValueEx 0, VarPtr(a(0)), 0, 0, 0, 0
RegQueryValueEx 0, VarPtr(a(0)), 0, 0, 0, 0
, мне кажется, было бы компактнее написать:
Код: Выделить всё
Dim a As String
a = "Некая строка"
RegQueryValueEx 0, ByVal a, 0, 0, 0, 0
RegQueryValueEx 0, ByVal a, 0, 0, 0, 0

Или, при желании избежать пары конвертаций:
Код: Выделить всё
Dim a As String
a = StrConv("Некая строка", vbFromUnicode)
RegQueryValueEx 0, StrPtr(a), 0, 0, 0, 0
RegQueryValueEx 0, StrPtr(a), 0, 0, 0, 0
Изображение

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 23.06.2006 (Пт) 8:56

tyomitch и keks-n, огромное спасибо за советы. Всё заработало. Фактически получился аналог небезизвестного Regmon!

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

Сообщение keks-n » 26.06.2006 (Пн) 13:57

marvan
С тебя настройщик WebBrowser'а, основанный на данном методе :)
Изображение

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 26.06.2006 (Пн) 15:22

keks-n писал(а):marvan
С тебя настройщик WebBrowser'а, основанный на данном методе :)

Есть проблемы:
Теоретически чтение настроек отображения изображений происходит в shdocvw.dll, где прописана строка 'Display Inline Images' и происходит вызов функции чтения реестра SHQueryValueExA Lib "shlwapi.dll", а он уже вызывает RegQueryValueEx Lib "advapi32.dll"
Но весь юмор в том, что в отладчике (ollydbg) этот участок кода не выполняется!
Да и RegMon чтение этого параметра "не замечает"

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

Сообщение keks-n » 14.07.2006 (Пт) 18:30

Народ, извините за топик ап...

marvan
Посмотрел в отладчике... Вызова SHQueryValueExA действительно нет. Чтение происхлдит через его юникодный аналог - SHQueryValueExW
Изображение

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

Сообщение keks-n » 15.07.2006 (Сб) 19:59

Вот перехват юникодной версии RegQueryValueEx, которую вызывает WebBrowser:
Код: Выделить всё

Option Explicit



Declare Function GetCurrentProcess Lib "kernel32" () As Long
Public Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Public Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExW" (ByVal hKey As Long, ByVal lpValueName As Long, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
Private Declare Function MessageBox Lib "user32" Alias "MessageBoxW" (ByVal hwnd As Long, ByVal lpText As Long, ByVal lpCaption As String, ByVal wType As Long) As Long

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long

Dim RQVEBackUp As Double



Sub ReplaceFunc(ByVal Deinst As Long, ByVal Source As Long, backup As Double)
Dim buffer(5) As Byte, written As Long
Call ReadProcessMemory(GetCurrentProcess, ByVal Deinst, backup, 6, written)
buffer(0) = &H68
CopyMemory buffer(1), Source, 4
buffer(5) = &HC3
WriteProcessMemory GetCurrentProcess, ByVal Deinst, buffer(0), 6, written
End Sub
Sub RestoreFunc(ByVal Deinst As Long, ByVal backup As Double)
Dim written As Long, buffer(5) As Byte
CopyMemory buffer(0), backup, 6
WriteProcessMemory GetCurrentProcess, ByVal Deinst, buffer(0), 6, written
End Sub

Public Function InterceptedRegQueryValueEx(ByVal hKey As Long, lpValueName As String, ByVal lpReserved As Long, lpType As Long, ByVal lpData As Long, lpcbData As Long) As Long
RestoreFunc GetProcAddress(GetModuleHandle("advapi32.dll"), "RegQueryValueExW"), RQVEBackUp
InterceptedRegQueryValueEx = RegQueryValueEx(hKey, VarPtr(lpValueName), lpReserved, lpType, lpData, lpcbData)
MsgBox lpValueName

repl
End Function
Sub main()
Dim a As String
a = "Íåêàÿ ñòðîêà"

repl
RegQueryValueEx 0, VarPtr(a), 0, 0, 0, 0
RegQueryValueEx 0, VarPtr(a), 0, 0, 0, 0
RestoreFunc GetProcAddress(GetModuleHandle("advapi32.dll"), "RegQueryValueExW"), RQVEBackUp
End Sub

Private Sub repl()
ReplaceFunc GetProcAddress(LoadLibrary("advapi32.dll"), "RegQueryValueExW"), AddressOf InterceptedRegQueryValueEx, RQVEBackUp
End Sub
Изображение

vIRisium :)
Новичок
Новичок
 
Сообщения: 33
Зарегистрирован: 24.09.2006 (Вс) 8:49
Откуда: От туда

Сообщение vIRisium :) » 12.04.2007 (Чт) 14:17

keks-n
слушай скинь пример своей проги, а я тебе в замен тоже кое-что самописанное скину.


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

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

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

    TopList  
cron