Subclassing без модуля, но с ассемблерной вставкой...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 06.06.2008 (Пт) 14:25

Я всё равно не понял. Думаю, что тем, кто сам делает такие вставки, этот способ понятен и полезен. Но я-то такие вставки не делаю и не планирую делать Асм для меня - это вообще что-то мистическое и уму не растяжимое.


Причём здесь асм?

Способ заключается в том, чтобы заполнять байтовый массив не так:
Код: Выделить всё
Const data = "010203BABA?Я идиот! Убейте меня, кто-нибудь!??DADA"
' ... всякая гадость с циклами и mid$-ами

А так
Код: Выделить всё
code(c) = &h01
code(c) = &h02
code(c) = &h03
code(c) = &hBA
code(c) = &hBA
position1 = c(3)
code(c) = &hDA
code(c) = &hDA


при таком способе, ты всегда (даже если что-то добавишь или уберёшь) записывая по смещению position1 будешь прав. Да и быстрее это, и правильнее.

Подготовь свой вариант и выложи весь код. Я гляну и скажу в чём дело.

З.Ы. Как ты мог читать мою статью, если я её только что написал?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 06.06.2008 (Пт) 17:57

З.Ы. Как ты мог читать мою статью, если я её только что написал?

Видишь ли, то, что я читал подобную статью - очень уловно. Поскольку большую часть я просто не понимаю, можно сказать, что скорее я проглядывал по диагонали. Что-то из того, что понятно, остаётся в памяти. Основной контекст - что в копимемери очень много кода, а гетМем совсем простая - я понял. Я это уже знал, и знал, кажется, как раз от тебя - поэтому, наверное, и сработало в памяти, что уже читал.

Вот (если конечно я правильно тебя понял):
Код: Выделить всё
Option Explicit

Public Event KeyDown(ByVal KeyCode As Long)

Private Const WM_KEYDOWN As Long = &H100
Private Const cNull As Long = &H0
Private Const GWL_WNDPROC = -4

Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long


Private OldCtl      As Long
Private ASM()   As Byte 'эталон
Private asmPrc()   As Byte
Dim p1 As Long, p2 As Long
Dim mHwnd As Long

Public Function WinProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  Select Case uMsg
  Case WM_KEYDOWN
    RaiseEvent KeyDown(wParam)
  End Select
   WinProc = CallWindowProc(OldCtl, hWnd, uMsg, wParam, lParam)
End Function

Public Function Hook(ByVal hWnd As Long)
  mHwnd = hWnd
  Call StartSubclass(hWnd, OldCtl, cNull)
End Function

Public Sub Unhook()
  If OldCtl Then Call SetWindowLong(mHwnd, &HFFFC, OldCtl)
End Sub

Private Sub StartSubclass(ByVal hWnd As Long _
                          , ByRef OldWndProc As Long _
                          , ByVal ProcNumber As Long)
  Dim lng As Long
  Dim tPtr As Long
  asmPrc = ASM
 
  Call CopyMemory(tPtr, ByVal ObjPtr(Me), 4&)
  Call CopyMemory(lng, ByVal tPtr + &H1C + (4& * ProcNumber), 4&)
 
  Call CopyMemory(asmPrc(p1), ObjPtr(Me), 4&)
 
'  Относительное - [адрес метода] минус [адрес следующего байта после синего лонга].
  Call CopyMemory(asmPrc(p2), lng - VarPtr(asmPrc(p2 + 4)), 4&)
 
  OldWndProc = SetWindowLong(hWnd, GWL_WNDPROC, VarPtr(asmPrc(0)))
End Sub

Private Sub Class_Initialize()
'   0  1  2  3  4  5  6  7    8  9 10 11 12 13 14 15
'  -------------------------------------------------
'  31 C0 50 54 8D 48 04 FF   74 24 18 E0 FA 68 хх хх
'  хх хх E8 хх хх хх хх 58   C2 10 00
ReDim ASM(26)

ASM(c) = &H31
ASM(c) = &HC0
ASM(c) = &H50
ASM(c) = &H54
ASM(c) = &H8D
ASM(c) = &H48
ASM(c) = &H4
ASM(c) = &HFF
ASM(c) = &H74
ASM(c) = &H24
ASM(c) = &H18
ASM(c) = &HE0
ASM(c) = &HFA
ASM(c) = &H68
p1 = c(4) 'если я, конечно, правильно тебя понял
'ASM(c) = &H0
'ASM(c) = &H0
'ASM(c) = &H0
'ASM(c) = &H0
ASM(c) = &HE8
p2 = c(4)
'ASM(c) = &H0
'ASM(c) = &H0
'ASM(c) = &H0
'ASM(c) = &H0
ASM(c) = &H58
ASM(c) = &HC2
ASM(c) = &H10
ASM(c) = &H0
End Sub

Private Sub Class_Terminate()
  Call Unhook
End Sub

Private Function c(Optional n As Long = 1) As Long
Static cnt As Long
c = cnt
cnt = cnt + n
End Function
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Сообщение arthur2 » 10.06.2008 (Вт) 9:30

Хакер
Подготовь свой вариант и выложи весь код. Я гляну и скажу в чём дело
Так ты глянул или нет?
Артур
 
   

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

Сообщение Хакер » 10.06.2008 (Вт) 9:31

Нет, я как то пропустил этот пост. Потом гляну.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Subclassing без модуля, но с ассемблерной вставкой...

Сообщение The trick » 02.10.2013 (Ср) 13:11

В вставке Хакера небольшая ошибка: вначале xor eax,eax устанавливает флаг Z и в дальнейшем не сбрасывается ни одной инструкцией, вследствии чего цикл loopne не будет работать (тело цикла отработает один раз), можно после устновки счетчика цикла
Код: Выделить всё
lea ecx,[eax+0x4]

, выполнить
Код: Выделить всё
or esp,esp

Считаю тему важной, поэтому отписал в нее.
UA6527P

Пред.

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

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

Сейчас этот форум просматривают: Majestic-12 [Bot], SemrushBot и гости: 40

    TopList