Как прыгнуть на [GetProcAddress]?

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

Как прыгнуть на [GetProcAddress]?

Сообщение 0xy » 01.02.2010 (Пн) 18:56

Кроме CallWindowProc :)

(DLL поднята LoadLibrary из папки TEMP).

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 18:57

Делать что-ли нечего?

Если прыгнуть, то как ты собрался возвращаться?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как прыгнуть на [GetProcAddress]?

Сообщение 0xy » 01.02.2010 (Пн) 19:00

Не придирайся к опечаткам :) Call--тоже прыжок ;)

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 19:02

Call — это вызов. Вызов предусматривает возможность вернуться в место, откуда был вызов. Прыжок — нет.

Вопрос в другом: почему бы не вызвать эту функцию правильным образом? Зачем изощряться?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как прыгнуть на [GetProcAddress]?

Сообщение 0xy » 01.02.2010 (Пн) 19:11

Правильным--это через Declare? Но тогда dll в папке TEMP вряд ли найдется (собственно, в этом то и соль).

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Antonariy » 01.02.2010 (Пн) 19:54

Без CallWindowProc — никак.
Что dll делает во временной папке?
Если прыгнуть
Имеется ввиду ассемблерный jmp?
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 19:59

0xy писал(а):Правильным--это через Declare? Но тогда dll в папке TEMP вряд ли найдется (собственно, в этом то и соль).

Под правильным имелся в виду импорт через TLB. Но раз dll в папке TEMP (зачем это?!), то Declare. Найдётся прекрасно, если папка temp будет CurDir-нута, а название файла не будет конфликтовать с библиотекой из более приоритетных местоположений.

Кстати, CallWindowProc не единственный способ.

Antonariy, имеется в виду не конкретно jmp, но jmp делает в точности то, что имеется в виду. GoTo тоже делает то, что имеется в виду. Имеется в виду прыжок — как явление, при котором выполнение как правило не возвращается туда, откуда «перепрыгнуло».
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Antonariy » 01.02.2010 (Пн) 20:05

Хакер писал(а):Найдётся прекрасно, если папка temp будет CurDir-нута, а название файла не будет конфликтовать с библиотекой из более приоритетных местоположений.
А разве "поиск" библиотеки происходит при вызове функции, не при старте?
Хакер писал(а):Кстати, CallWindowProc не единственный способ.
Читал толковую статью про CallWindowProc, где автор клятвенно уверял, что без использования ассемблера это единственный способ.
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 20:11

Antonariy писал(а):А разве "поиск" библиотеки происходит при вызове функции, не при старте?

Вовсе нет. Поиск библиотеки и поиск функции в ней происходит при первой попытке вызова этой функции.

Antonariy писал(а):Читал толковую статью про CallWindowProc, где автор клятвенно уверял, что без использования ассемблера это единственный способ.

Вероятно автор не додумался. Я об этом способе тоже нигде не слышал и придумал его сам. Суть способа: перехватить вышеописанный процесс (поиск библиотеки и функции в ней) и подсунуть свой указатель вместо искомого. Получаем возможность объявлять прототип функции, которую собираемся вызывать по адресу. Почти как сишные указатели на функции: тоже указывается прототип функции, затем самому указателю присваивается значение, затем делается вызов. Единственное, что лишние конвертации по прежнему делаются без нашего желания и согласия.

Видимо, пока я не напишу статью, никто сам не доковыряется до того места, где надо делать подмену...

Ну а выглядит это как-то так:
Код: Выделить всё
Declare Function MyFuncPointer Lib "::CallByPtr::" (ByVal Foo As Long, ByRef Bar As Single) As Object

Pointers("MyFuncPointer") = 123123123

Set x = MyFuncPointer(1, 2)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как прыгнуть на [GetProcAddress]?

Сообщение jangle » 01.02.2010 (Пн) 20:35

0xy писал(а):Кроме CallWindowProc :)

(DLL поднята LoadLibrary из папки TEMP).


Что значит прыгнуть? Тебе нужно получить адрес функции в DLL не прибегая к вызову виндовой функции GetProcAddress?

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 20:38

Ему надо вызвать функцию, не прибегая к CallWindowProc, а не получить её адрес, не прибегая к GetProcAddress :?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как прыгнуть на [GetProcAddress]?

Сообщение jangle » 01.02.2010 (Пн) 21:15

Хакер писал(а):Ему надо вызвать функцию, не прибегая к CallWindowProc, а не получить её адрес, не прибегая к GetProcAddress :?


Только непонятно, зачем это нужно...

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 21:31

Так :D

Кто хочет, чтобы я написал кирпич для вызова функций по указателю через вышеописанный трюк?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как прыгнуть на [GetProcAddress]?

Сообщение 0xy » 01.02.2010 (Пн) 21:39

Хакер
Твой способ попробую вкурить (пока для меня это "ацкая сучность" :) ). Походу, это работает только в VB6, или также и в VBA5?

ДОБАВЛЕНО:
Кирпич--это хорошо :) Поможет секономить чуток травы... пока.

О CurDir знаю, но, ИХМО, это не очень эстетично, особенно в свете того, что в виду необходимости создания уникального имени файла в TEMP, имя библиотеки может оказаться отличным от оригинального.
Хакер писал(а):Поиск библиотеки и поиск функции в ней происходит при первой попытке вызова этой функции.

Означает ли это, что CurDir необходим только при первом вызове функции?

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 01.02.2010 (Пн) 21:47

ChDrive+ChDir надо делать при первом вызове.
—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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 02.02.2010 (Вт) 18:34

Хакер писал(а):Кто хочет, чтобы я написал кирпич для вызова функций по указателю через вышеописанный трюк?
Я хочу :oops: Вообще - давненько не было от тебя ни мануалов, ни кирпичей :D
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 02.02.2010 (Вт) 18:38

В заготовках 4 штуки лежат. Я хочу их разом закинуть.

По поводу кирпича: я вспомнил, какая там сложность есть с режимом отладки в VB6. Т.е. я не вижу преграды, но боюсь, что очень «брутальное» решение отпугнёт многих. Во всяком случае, без большого числа желающих такие вещи точно не хочу писать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Как прыгнуть на [GetProcAddress]?

Сообщение iGrok » 02.02.2010 (Вт) 20:12

Хакер писал(а):В заготовках 4 штуки лежат. Я хочу их разом закинуть.

По поводу кирпича: я вспомнил, какая там сложность есть с режимом отладки в VB6. Т.е. я не вижу преграды, но боюсь, что очень «брутальное» решение отпугнёт многих. Во всяком случае, без большого числа желающих такие вещи точно не хочу писать.

Так ты напиши, что за сложность. =)
Может, и желающие найдутся, если не испугаются. )
label:
cli
jmp label

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 02.02.2010 (Вт) 20:28

Да ради бога: надо перехватывать vba6!DllFunctionCall.

Оговорка: саму функцию переписывать (вставлять переходник на какой-то свой код) — нельзя, потому что это приведёт к перехвату всех её вызовов, а нужно — лишь некоторых. Импорт/экспорт для тех вызовов, которые нужно перехватывать, не используется. Т.е. это почти как локальный внутримодульный вызов. Ячейки памяти с адресом этой функции, которую бы можно было перезаписать, — не существуют, адрес функции (причём относительный) вшивается сразу в код. Да и последнее: сами фрагменты кода, которые делают вызовы, которые нас интересуют — генерируются динамически.

Если вас это не пугает — смело в путь! :)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Как прыгнуть на [GetProcAddress]?

Сообщение 0xy » 05.02.2010 (Пт) 7:45

Предлагаю заценить мой кирпич на тему :)
Код: Выделить всё
Option Explicit

Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _
           (ByVal pBinaryCode As Long, _
            ByVal Variable As Long, _
            Optional ByVal lMSG As Long, _
            Optional ByVal lp3 As Long, _
            Optional ByVal lp4 As Long) As Long

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Any, ByVal Source As Any, ByVal Length&)
Private Declare Function VirtualAlloc& Lib "kernel32" (lpAddress As Any, ByVal dwSize&, ByVal flAllocationType&, ByVal flProtect&)
Private Declare Function VirtualFree& Lib "kernel32" (lpAddress As Any, ByVal dwSize&, ByVal dwFreeType&)

Const MEM_COMMIT& = &H1000, MEM_RESERVE = &H2000, MEM_RELEASE& = &H8000
Const PAGE_READWRITE& = 4, PAGE_EXECUTE_READWRITE = &H40

Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress& Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String)
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long

Function CallEX&(DllName$, FnName$, FnParam())
'позволяет вызвать любую функцию из любой dll
'ЗАМЕЧАНИЯ:
' 1. Переменные длиной до 4-x байт, а также строки, передаются функции ByVal (если нужно ByRef, то вместо параметра следует указать его VarPtr).
' 1.1. Штатные переменные длиной более 4-х байт (Currency и т.п.) всегда передаются ByRef!
' 1.2. Для структур необходимо передавать их VarPtr.
' 1.3. Корректность передачи подтипов, отличных от Long и String, не тестировалась!
' 2. Пока х.з. :)

' ===================ASM-код=================
'      55            PUSH EBP
'      8BEC          MOV EBP,ESP
'      60            PUSHAD
'      8B5D 0C       MOV EBX,DWORD PTR SS:[EBP+C]
'      8B4D 10       MOV ECX,DWORD PTR SS:[EBP+10]
'2:    85C9          TEST ECX,ECX
'      74 06         JE SHORT 1
'      49            DEC ECX
'      FF348B        PUSH DWORD PTR DS:[EBX+ECX*4]
'    ^ EB F6         JMP SHORT 2
'1:    FF55 08       CALL DWORD PTR SS:[EBP+8]
'      61            POPAD
'      5D            POP EBP
'      C2 1000       RET 10

Const AsmCode$ = "55 8B EC 60 8B 5D 0C 8B 4D 10 85 C9 74 06 49 FF 34 8B EB F6 FF 55 08 61 5D C2 10 00 "
Dim BinCode() As Byte, hDll&, i&, n&, p&, pFnParam&()

ReDim BinCode(1 To Len(AsmCode) / 3)
For i = 1 To Len(AsmCode) / 3  ' заполняем массив
    BinCode(i) = Val("&h" & (Mid(AsmCode, (i - 1) * 3 + 1, 2)))
Next

hDll = LoadLibrary(DllName)
If hDll Then Else MsgBox DllName & " не найдена!": Exit Function
p = GetProcAddress(hDll, FnName)
If p Then
  Else
    MsgBox "Функция " & FnName & " не найдена!"
    FreeLibrary hDll
    Exit Function
End If

n = UBound(FnParam)
ReDim pFnParam(0 To n)

For i = 1 To n
    Select Case VarType(FnParam(i))
     Case vbString 'ByVal
        FnParam(i) = StrConv(FnParam(i), vbFromUnicode)
        pFnParam(i) = VarPtr(FnParam(i)) + 8
        CopyMemory VarPtr(pFnParam(i)), ByVal pFnParam(i), 4
     Case vbLong, vbInteger, vbByte, vbBoolean, vbSingle 'ByVal
        pFnParam(i) = FnParam(i)
     Case vbCurrency, vbDouble, vbDate 'ByRef
        pFnParam(i) = VarPtr(FnParam(i)) + 12
     Case vbDecimal 'хотя это уже лишьнее
        pFnParam(i) = VarPtr(FnParam(i)) 'тупо ByRef на Variant:)
     Case Else ' NOP (vbEmpty, vbNull)
    End Select
Next


i = VirtualAlloc(ByVal 0&, UBound(BinCode), MEM_COMMIT Or MEM_RESERVE, PAGE_EXECUTE_READWRITE)
CopyMemory ByVal i, ByVal VarPtr(BinCode(1)), UBound(BinCode)

CallEX = CallWindowProc(i, p, VarPtr(pFnParam(1)), n)

VirtualFree ByVal i, 0, MEM_RELEASE
FreeLibrary hDll

For i = 1 To n
    If VarType(FnParam(i)) = vbString Then FnParam(i) = StrConv(FnParam(i), vbUnicode)
Next
End Function


Пример вызова:
Код: Выделить всё
Dim p(), n&
ReDim p(0 To 2)
n = 16
p(1) = String(n, vbNullChar)
p(2) = VarPtr(n)
CallEX "kernel32", "GetComputerNameA", p
p(1) = Left(p(1), n)
Последний раз редактировалось 0xy 06.02.2010 (Сб) 3:00, всего редактировалось 2 раз(а).

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 05.02.2010 (Пт) 9:53

Предлагаю заценить

Зацениваю: плохой кирпич.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как прыгнуть на [GetProcAddress]?

Сообщение jangle » 05.02.2010 (Пт) 10:38

0xy писал(а):Предлагаю заценить мой кирпич на тему :)


Наверное я совсем тупой, но в чем смысл этого кода? В каких случаях его следует применять?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Antonariy » 05.02.2010 (Пт) 11:23

Хакер, зацени статью и особенно комментарий к ней. Читал по диагонали, ибо много букв и мало понятных, но комментатор вроде описал способ вызова по указателю без и CallWindowProc и vba6!DllFunctionCall.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Antonariy » 05.02.2010 (Пт) 11:40

jangle писал(а):
0xy писал(а):Предлагаю заценить мой кирпич на тему :)


Наверное я совсем тупой, но в чем смысл этого кода? В каких случаях его следует применять?

Спасено из кэша яндекса:
… Использовать это можно по-разному, например: представим, что у нас есть функция сортирующая массив любых объектов. Для того чтобы отсортировать объекты, нужно уметь их сравнивать. Т.е. необходимо в каждом объекте реализовывать интерфейс IComparable, либо просто передавать в нашу функцию сортировки еще одну функцию, которая будет сравнивать объекты. В принципе одно и то же, но в первом случае нам придется изменять класс, а это может быть достаточно неудобно, если вообще возможно, поэтому использование делегатов в данном случае является вполне оправданным решением.
Лучший способ понять что-то самому — объяснить это другому.

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 05.02.2010 (Пт) 12:20

Хакер, зацени

О, так это же писание GSerg-а, определяется с первых строк. Вот оригинал на нашем сайте..


Что касается комментатора, то он во многих местах неправ. Во-первых, способ действительно допустим. Но: он требует ассемблерных вставок. Мой не требует. Во-вторых, хоть это мало кого волнует, но метод непотокобезопасен из-за использования глобальных переменных. В третьих, его метод требует для кажого «функтора» объявлять кучу сущностей: функцию-заглушку с длинным (для заглушки) кодом, массив кода-переходника, одну или две переменных (не разобрался, но не важно), функцию-инициализатор для каждой заглушки (или для всех сразу), а при каждой смене значения «функтора» нужно править код-переходник. Неудобно же. В-четвёртых, хоть это и поправимо, его код не-DEP-safe. В-пятых, поскольку используется функция заглушка, это создаёт ещё одну проблему: если он передаст в функцию строку или массив или ссылку на объект, функция-заглушка честно удалит переданную ей копию или сделает ::Release объекту. В этом случае, настоящей функции достанется мусор, вместо указателей на «динамические данные» (их сотрёт, удадит, освободит заглушка). В-шестых, его метод фейлить при вызове из под IDE функций, которым нужны параметры. А именно: вызываемая функция подучить сдвиг всех параметров на 1. Последствия будут печальными.

Ну, кажется достаточно минусов назвал.

К слову, у меня ни одного из этих минусов нет. Но есть один другой (неотключаемая автоконвертация строк Unicode→Ansi→Unicode).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Как прыгнуть на [GetProcAddress]?

Сообщение jangle » 05.02.2010 (Пт) 12:27

Antonariy писал(а):
jangle писал(а):
0xy писал(а):Предлагаю заценить мой кирпич на тему :)


Наверное я совсем тупой, но в чем смысл этого кода? В каких случаях его следует применять?

Спасено из кэша яндекса:
… Использовать это можно по-разному, например: представим, что у нас есть функция сортирующая массив любых объектов. Для того чтобы отсортировать объекты, нужно уметь их сравнивать. Т.е. необходимо в каждом объекте реализовывать интерфейс IComparable, либо просто передавать в нашу функцию сортировки еще одну функцию, которая будет сравнивать объекты. В принципе одно и то же, но в первом случае нам придется изменять класс, а это может быть достаточно неудобно, если вообще возможно, поэтому использование делегатов в данном случае является вполне оправданным решением.


Причем тут делегаты и выше приведенный код?

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение arthur2 » 05.02.2010 (Пт) 12:33

Хакер писал(а):способ действительно допустим. Но: он требует ассемблерных вставок. Мой не требует.

Всё больше интригуешь? Давай уже код :) Интересно же...
Артур
 
   

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

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Хакер » 05.02.2010 (Пт) 12:40

Код надо писать. А над проблемой с vba6 ещё и думать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Twister » 05.02.2010 (Пт) 13:08

Что касается комментатора, то он во многих местах неправ
Я не вникал в тонкости рассуждений коментатора о внутренних механизмах VB (далёк я от этого), но вот этот "псевдо-код" вызвал у меня большие сомнения по поводу его компетентности в области знаний о x86:
Для указания адреса исполняемой инструкции используется регистр eip. Причём, нет инструкций явных чтения/записи из этого регистра. А в качестве неявно изменяющих содержимое регистра eip используются jmp, jxx и пары call-ret, enter-leave. VB'эшные компилятор и интерпретатор обычно используют jmp, jxx и пару call-ret. Последняя, как раз, нас и интересует. Выполнение инструкции

call operand

сводится.

push eip
jmp operand

или ещё подробнее к

mov dword ptr ds:[esp-4],eip
sub esp,4
mov eip,operand

Какой нафиг push eip? На стек ложится адрес возврата, который равен текущему eip + размер инструкции, на которую кажет eip

По поводу главного вопроса топика. Я понимаю, что VB мёртв и над ним можно издеваться как угодно не опасаясь того, что в следующих версиях придется переписывать весь "хак-код" (как в случае с недокументированными возможностями NT). Это даже полезно - изучать внутренности чего-либо опираясь только на дизассемблер. Но я не пойму одного: если задача стоит написать рабочий софт, а не очередной PoC, то зачем так насиловать себя, придумывая как прикрутить к языку то, что он не поддерживает и уже не будет поддерживать? Надо вызвать функцию по указателю - напиши dll на языке, который это умеет. Не хочешь таскать с собой dll - напиши софт на другом языке. Лично меня вот такие причины и заставили много лет назад спрыгнуть с VB...
А я все практикую лечение травами...

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Как прыгнуть на [GetProcAddress]?

Сообщение Antonariy » 05.02.2010 (Пт) 13:15

jangle писал(а):Причем тут делегаты и выше приведенный код?
При том что вышеприведенный код это вызов ф-ии по указателю. Вызов ф-ии по указателю = делегирование (насколько я понял). Выше приведенный пример (он там для сишарпа) показывает, что в этом случае можно использовать код типа приведенного еще более выше. Просто нужна голова и руки, чтобы адаптировать его для собственных нужд. И да, это не кирпич, а технологический семпл.

Здесь подробнее.
Последний раз редактировалось Antonariy 05.02.2010 (Пт) 13:18, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

След.

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

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

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

    TopList