Кстати, тот способ перехвата, что я вижу почти везде в корне неправилен - в каждом вызове восстанавливается исходный код, что не допустимо в многопоточной среде и ведёт к тормозам. Вместо этого нужно использовать другую технику, но она подразумевает частичное дизасемблирование - необходимо уметь узнавать размер ЛЮБОЙ инструкции.
Source писал(а):а как насчёт записи в реестр в Vista?
keks-n писал(а):необходимо уметь узнавать размер ЛЮБОЙ инструкции.
'Opcode Length Disassembler.
'Coded by GPcH
'Email: admin@dotfix.net
'Icq: 1195723
'Original version Coded By Ms-Rem ( Ms-Rem@yandex.ru ) ICQ 286370715
Const OP_NONE = &H0
Const OP_MODRM = &H1
Const OP_DATA_I8 = &H2
Const OP_DATA_I16 = &H4
Const OP_DATA_I32 = &H8
Const OP_DATA_PRE66_67 = &H10
Const OP_WORD = &H20
Const OP_REL32 = &H40
Public OpcodeFlags
Public OpcodeFlagsExt
Public Sub DisasmInitialize()
OpcodeFlags = Array(OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_PRE66_67, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_DATA_PRE66_67, OP_MODRM Or OP_DATA_PRE66_67, OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, _
OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_PRE66_67, _
OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I32 Or OP_DATA_I16, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I8, OP_DATA_PRE66_67, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, _
OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_DATA_PRE66_67, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_DATA_I16, OP_NONE, OP_MODRM, _
OP_MODRM, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_PRE66_67, OP_DATA_I8 Or OP_DATA_I16, OP_NONE, OP_DATA_I16, OP_NONE, OP_NONE, OP_DATA_I8, OP_NONE, OP_NONE, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_DATA_I8, OP_DATA_I8, OP_NONE, OP_NONE, OP_WORD, OP_WORD, OP_WORD, _
OP_WORD, OP_WORD, OP_WORD, OP_WORD, OP_WORD, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, _
OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_I8, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_I16 Or OP_DATA_I32, OP_DATA_I8, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM Or OP_REL32)
OpcodeFlagsExt = Array(OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, _
OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, _
OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, _
OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, _
OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_DATA_PRE66_67 Or OP_REL32, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_MODRM, OP_MODRM Or OP_DATA_I8, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, OP_MODRM, _
OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_NONE, _
OP_NONE, OP_NONE, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, _
OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_NONE, _
OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, _
OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_NONE, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE, OP_MODRM, OP_MODRM, OP_MODRM, OP_NONE)
End Sub
'Получение полного размера машинной комманды по указателю на нее
Public Function SizeOfCode(Code() As Byte, ByRef pOpcode As Byte) As Long
Dim PFX66 As Boolean, PFX67 As Boolean, SibPresent As Boolean
Dim OffsetSize As Byte, Add As Byte, iMod As Byte, iRM As Byte, cPtr As Byte, Flags As Byte
OffsetSize = 0
PFX66 = False
PFX67 = False
cPtr = 0
'определяем размер преффиксов
While ((Code(cPtr) = &H2E) Or (Code(cPtr) = &H3E) Or (Code(cPtr) = &H36) Or (Code(cPtr) = &H26) Or (Code(cPtr) = &H64) Or (Code(cPtr) = &H65) Or (Code(cPtr) = &HF0) Or (Code(cPtr) = &HF2) Or (Code(cPtr) = &HF3) Or (Code(cPtr) = &H66) Or (Code(cPtr) = &H67))
If (Code(cPtr) = &H66) Then PFX66 = True
If (Code(cPtr) = &H67) Then PFX67 = True
cPtr = cPtr + 1
If (cPtr > 16) Then SizeOfCode = 0: Exit Function
Wend
If pOpcode Then pOpcode = Code(cPtr)
'определяем размер опкода и получаем флаги
If (Code(cPtr) = &HF) Then
cPtr = cPtr + 1
Flags = OpcodeFlagsExt(Code(cPtr))
Else
Flags = OpcodeFlags(Code(cPtr))
End If
cPtr = cPtr + 1
If (Flags And OP_WORD) Then cPtr = cPtr + 1
'обрабатываем MOD r/m
If (Flags And OP_MODRM) Then
iMod = Int(Code(cPtr) / (2 ^ 6))
iRM = Code(cPtr) And 7
cPtr = cPtr + 1
'обрабатываем SIB и Offset
SibPresent = (Not PFX67) And (iRM = 4)
Select Case iMod
Case 0:
If (PFX67 And (iRM = 6)) Then OffsetSize = 2
If ((Not PFX67) And (iRM = 5)) Then OffsetSize = 4
Case 1: OffsetSize = 1
Case 2: If (PFX67) Then OffsetSize = 2 Else OffsetSize = 4
Case 3: SibPresent = False
End Select
If (SibPresent) Then
If (((Code(cPtr) And 7) = 5) And ((Not iMod) Or (iMod = 2))) Then OffsetSize = 4
cPtr = cPtr + 1
End If
cPtr = cPtr + OffsetSize
End If
'обрабатываем IMM значения
If (Flags And OP_DATA_I8) Then cPtr = cPtr + 1
If (Flags And OP_DATA_I16) Then cPtr = cPtr + 2
If (Flags And OP_DATA_I32) Then cPtr = cPtr + 4
If (PFX66) Then Add = 2 Else Add = 4
If (Flags And OP_DATA_PRE66_67) Then cPtr = cPtr + Add
SizeOfCode = cPtr '- Code
End Function
'Получение размера функции по указател на нее (размер до первой комманды RET)
Public Function SizeOfProc(Proc() As Byte) As Long
Dim Length As Long, pOpcode As Byte, Result As Long
pOpcode = 1
Do
Length = SizeOfCode(Proc, pOpcode)
Result = Result + Length
If ((Length = 1) And (pOpcode = &HC3)) Then Exit Do
sProc = StrConv(Proc, vbUnicode)
sProc = Right$(sProc, Len(sProc) - Length)
Proc = StrConv(sProc, vbFromUnicode)
Loop Until (Length < 1)
SizeOfProc = Result
End Function
'определение того, имеет ли комманда rel32 offset
Public Function IsRelativeCmd(pOpcode As Byte) As Byte
Dim Flags As Byte
If (pOpcode = &HF) Then Flags = OpcodeFlagsExt(pOpcode + 1) Else Flags = OpcodeFlags(pOpcode)
IsRelativeCmd = (Flags And OP_REL32)
End Function
tyomitch писал(а):Source писал(а):а как насчёт записи в реестр в Vista?
Запись в реестр сосёт.
Потому что пользователь одновременно с твоей прогой откроет IE и очень удивится, откуда взялись картинки.
Потом пойдёт и отключит их во второй раз.
И тогда твоя прога обломается.
Source писал(а):После загрузки первоначальной страницы, если флаг отображения картинок был установлен, WB будет их показывать, что бы там пользователь не делал в IE.
EventsWB.parentWindow.event.keyCode = 0
Source писал(а):1. что там с записью в реестр Vista?
2. а как заблокировать? Form_KeyDown не получает vbKeyF5 при нажатии F5 на WB (на других контролах получает)!
keks-n писал(а):KeyPreview в свойствах формы отменили?
Сейчас этот форум просматривают: Yandex-бот и гости: 46