GSerg писал(а):А чё, мы ничё, мы по мелочи
VB8 напишем и успокоимся
Поздно уже, есть VS8

Давайте сразу 10

А вообще, если без шуток, то жду от вас всех статей на эту тему. Может быть и правда, когда-нибудь пригодится кому-нибудь еще, кроме вас


GSerg писал(а):А чё, мы ничё, мы по мелочи
VB8 напишем и успокоимся
gaidar писал(а):ВОт читаю топик и думаю, куда это все приведет
Option Explicit
Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function PutMem4 Lib "msvbvm60" (ByVal pDst As Long, ByVal NewValue As Long) As Long
Private user As Long
Private Wrapper1Address As Long
Private Sub Command1_Click()
MsgBox Wrapper1(Me.hWnd)
End Sub
Private Sub Form_Load()
user = LoadLibrary("user32.dll")
Wrapper1Address = GetProcAddress(user, "IsWindow")
End Sub
Private Function Wrapper1(ByVal hWnd As Long) As Long
Redirect Wrapper1Address
End Function
Private Sub Redirect(ByVal Addr As Long)
PutMem4 VarPtr(Addr) - 4, Addr
End Sub
Private Sub Form_Unload(Cancel As Integer)
FreeLibrary user
End Sub
GSerg писал(а):При этом в стеке остаётся то, что там было в начале вызова Wrapper1, а именно параметр hWnd и адрес возврата в msgbox. Его получает функция IsWindow. Она же его удаляет из стека, возвращаясь в msgbox.
GSerg писал(а):Так, чё за фигня
Если в модуль вынести и скомпилировать - работает. Во всяком случае, похоже на то.
GSerg писал(а):Так, чё за фигня
Под IDE либо не пашет (если пишем по -4), либо рушится (если пишем по -8 ).
Ну дык и почему?
Option Explicit
Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long
Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private user As Long
Private Sub Form_Click()
MsgBox Wrapper1(Me.hWnd)
End Sub
Private Sub Form_Load()
user = LoadLibrary("user32.dll")
Wrapper1Address = GetProcAddress(user, "IsWindow")
InitS
End Sub
Private Sub Form_Unload(Cancel As Integer)
FreeLibrary user
End Sub
Option Explicit
Private Declare Function PutMem4 Lib "msvbvm60" (ByVal pDst As Long, ByVal NewValue As Long) As Long
Private Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" _
(ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Long)
Public Wrapper1Address As Long
Private vESP As Long, pOC As Long, pRet As Long, pMP As Long
Private OC() As Byte, MP() As Byte
Public Sub InitS()
ReDim OC(1 To 20)
ReDim MP(1 To 20)
'для проверки
'Wrapper1Address = GetPA(AddressOf Test1)
pOC = VarPtr(OC(1))
'push imm32=hWnd
OC(1) = &H68: PutMem4 VarPtr(OC(2)), 0&
'push imm32=<адрес возврата>
OC(6) = &H68: PutMem4 VarPtr(OC(7)), 0&
'jmp dword ptr ds:[imm32=VarPtr(Wrapper1Address)]
OC(11) = &HFF: OC(12) = &H25: PutMem4 VarPtr(OC(13)), VarPtr(Wrapper1Address)
'sub esp,imm8=20
MP(1) = &H83: MP(2) = &HEC: MP(3) = 4
'push imm32=<адрес возврата>
MP(4) = &H68: PutMem4 VarPtr(MP(5)), 0&
'jmp dword ptr ds:[VarPtr(Wrapper1Address)]
MP(9) = &HFF: MP(10) = &H25: PutMem4 VarPtr(MP(11)), VarPtr(Wrapper1Address)
End Sub
Public Function Wrapper1(ByVal hWnd As Long) As Long
Dim pRet As Long, vT As Long
'адрес (условный) "начала стека"
vESP = VarPtr(hWnd) - 4
'получаем адрес возврата
CopyMem VarPtr(pRet), vESP, 4
'смотрим каким было обращение
CopyMem VarPtr(vT), pRet - 5, 4
If vT = &HE8 Then
PutMem4 VarPtr(MP(5)), pRet
PutMem4 VarPtr(hWnd) - 4, pMP
Else
vESP = vESP - 4
CopyMem VarPtr(pRet), vESP, 4
PutMem4 VarPtr(OC(2)), hWnd
PutMem4 VarPtr(OC(7)), pRet
PutMem4 VarPtr(hWnd) - 8, pOC
End If
End Function
Private Function Redirect(ByVal Addr As Long) As Long
PutMem4 VarPtr(Addr) - 8, VarPtr(OC(1)) 'AddressOf Test1 'Addr
End Function
Private Function Test1(ByVal vVal As Long) As Long
MsgBox vVal, vbOKOnly, "Test1"
Test1 = vVal
End Function
Private Function GetPA(ByVal vPA As Long) As Long
GetPA = vPA
End Function
Approximator писал(а):GSerg писал(а):Так, чё за фигня
Если в модуль вынести и скомпилировать - работает. Во всяком случае, похоже на то.
Даже, если это так, то это случайность. Вообще говоря, не должно работать.
GSerg писал(а):Не, ты мне объясни, почему не работает в скомпилированном виде...
А он разве не работает в скомпилированном виде?GSerg писал(а):Ну разумеется, мой старый код, перемещённый в модуль!
GSerg писал(а):Не, ты мне объясни, почему не работает в скомпилированном виде...
Я ж хотел извратиться на предмет вызова по указателю без асмовых переходников. С ними-то я вызову
Ну почему не работает прямая перезапись адреса возврата в exe, ведь buffer overrun основан именно на этом...
GSerg писал(а):gettickcount идёт правильно...
А та же iswindow возвращает некую странную длинную цифирь, хотя известно, что должна быть единица.
tyomitch писал(а):Approximator, при чём здесь передача аргументов, если "iswindow возвращает некую странную длинную цифирь"? IsWindow при любых аргументах должна возвращать 1 либо 0; значит, вызывается не она
tyomitch писал(а):Ещё раз, в скомпилированном виде и в отдельном модуле у меня всё работает просто прекрасно, возвращается 1. Что за траблы у GSerg-а - не знаю. Попробуй, как у тебя?
tyomitch писал(а):И ещё, поясни мне, какое значение имеет положение esp. Если у Wrapper1 и вызываемой функции (IsWindow) поровну параметров, то VB вообще никак не может заметить подвоха...
push ebp
mov ebp, esp
GSerg писал(а):Точно...
Меня терзают смутные сомненья на предмет того, что если у функции есть параметры, то первые две её команды -
- Код: Выделить всё
push ebp
mov ebp, esp
Причём это выполняется до любого юзерского кода. Так что в верхушке стека оказывается ebp. Да его, к тому же, и выпихнуть надо перед возвратом.
Хреново... Без переходников-таки не обойтись...
Private Sub Redirect(ByVal Addr As Long)
PutMem4 VarPtr(Addr) - 4, AddressOf RDPlus
PutMem4 VarPtr(Addr) + 4, Addr
End Sub
Private Sub RDPlus() ' может содержать аргументы, если необходимо изменить состояние esp более чем на 4
'должно быть пусто
End Sub
GSerg писал(а):Раз ты тут, пойду дизасм помучаю. Скоро выложу, далеко не уходи
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3