|
Модератор
|
|||||||||||||||||||||
Вызов любых функций по указателю17.04.2014, 19:11. Показов 13454. Ответов 57
Пока не работал форум, ковырялся в рантайме VB
.Иследуя функции VBA6 придумал способ вызова функций по указателю. Все просто. Объявляем прототип функции (пустую функцию), где дополнительно первым параметром будет передаваться адрес функции. Далее пропатчиваем его, таким образом чтобы он перекидывал нас по адресу заданному первым параметром. Таким образом можно вызывать функции в стандартных модулях, модулях класса, формы, API-функции (например полученные через LoadLibrary и GetProcAddress). Одно замечание, пока не выяснил причину, желательно запускать проект через Ctrl+F5, т.к. иногда может не работать указатель или же вообще происходить вылет. А так работает и в IDE и в скомпилированном виде. Пример вызова по указателю обычных функций модуля. Кликните здесь для просмотра всего текста
Вызов метода класса (как вычислить адреса напишу позже). Кликните здесь для просмотра всего текста
Вызов API функций: Кликните здесь для просмотра всего текста
5
|
|||||||||||||||||||||
| 17.04.2014, 19:11 | |
|
Ответы с готовыми решениями:
57
Вызов функции по указателю с параметрами Вызов функции по указателю из класса |
|
|
||
| 17.04.2014, 20:11 | ||
|
да, AddressOf в классе не работает
0
|
||
|
Модератор
|
|||||||||||||||||||||
| 17.04.2014, 21:39 [ТС] | |||||||||||||||||||||
|
Насчет получения адреса функций в классах.
Как известно каждый VB-шный класс реализует интерфейс IDispatch, что позволяет любой объект присвоить к типу Object, и вызывать методы по имени (например в CreateObject). Чтобы получить интерфейс в VB есть функция ObjPtr, которая возвращает указатель на данные объекта, первым Long'ом в котором идет указатель на VTable объекта; по этому смещению можно получить много чео интересного (пиватные переменные, количество ссылок и т.п). Итак, мы имеем указатель на VTable, сама vTable представляет собой список адресов методов поддерживаемыми экземпляром класса. Т.е. имея 2 разных объекта одного класса, указатель на vTable будет один и тот же. Т.к. каждый класс реализует IDispatch, а IDispatch наследует IUnknown (любой COM объект вообще) то смотрим в MSDN список методов IDispatch и IUnknown, соответственно 4 и 3. Получается что наши методы начнутся после них, получается 28 (&H1C) байт смещение в vTable содержит адрес первого метода (считаем сверху как описано в классе), + 4 - следующего и т.д. В ходе реверс-инжиниринга я обнаружил что после всех публичных методов идут приватные (так же сверху), Class_initialize, Class_terminate считаем также приватными методами (можно вызывать их повторно для переинициализации данных).Но просто так нельзя вызвать метод, т.к. если мы обращаемся к приватным данным из кода класса, как узнать изнутри метода их расположение? Для этого при любом вызове метода из vTable первым параметром передается указатель на объект (ObjPtr). Это дает очень много воможностей, но я не буду их описывать. Так же каждый метод (исходя из COM) должен возвращать значение HRESULT, что обеспечивает контроль правильного вызова метода. В VB конечно для нас это недоступно, все функции (процедуры) в классах работают так как мы захотим и возвращают то, что нам надо. В реальности каждый метод возвращает HRESULT как и положено (т.к. к примеру мы можем делать ActiveX DLL которая является COM библиотекой и работает в любых программах написанных на других языах), а возвращаемы параметр описаный в функции, в реальности передается последним. Фактически метод:
Добавлено через 12 минут Вот еще пример с классами: Модуль:
4
|
|||||||||||||||||||||
|
|
||
| 17.04.2014, 21:44 | ||
|
конечно будет интересно я так думаю ... я как-раз к подобным трюкам уже подбираюсь, но пока только подбираюсь, и вероятно столкнусь с таким вопросом спасибо за разъяснения ! Добавлено через 2 минуты а пока на всякий случай, сохраню страницу у себя
0
|
||
|
Модератор
|
||||||
| 17.04.2014, 21:57 [ТС] | ||||||
|
Кстати в модуле формы (обычной), смещение пользовательских функций начинается с &H6F8 байт от начала vTable. Вот пример вызова Form_Load по указателю.
3
|
||||||
|
|
|||
| 17.04.2014, 22:24 | |||
|
Не по теме:
1
|
|||
|
Модератор
|
|||||||||||
| 17.04.2014, 23:03 [ТС] | |||||||||||
|
Вот еще недокументированные возможности (получение любых приватных, публичных переменных в экземпляре класса).
Модуль.
3
|
|||||||||||
|
|
||||||||
| 17.04.2014, 23:21 | ||||||||
|
и вообще очевидно у меня встанет такой вопрос если я буду пользовать объекты этим способом
Добавлено через 3 минуты
0
|
||||||||
|
Модератор
|
|||
| 18.04.2014, 00:11 [ТС] | |||
|
Добавлено через 58 секунд
1
|
|||
|
|
|
| 18.04.2014, 00:21 | |
|
0
|
|
|
|
||||||
| 18.04.2014, 17:22 | ||||||
|
затем чтобы видеть перечисления Enum так как они были записанны
другие переменные мне не нужны, они отображаються а вообще я сейчас делаю программу, которая генерирует документацию к любому компоненту, но в ней надо указывать исходный проект позже так-же выложу в готовых решениях текст на выходе будет примерно таким
0
|
||||||
|
Модератор
|
|
| 18.04.2014, 21:21 [ТС] | |
|
Я написал как это сделать в общем. Как приеду домой в блоге напишу как получить то, что мы видим в Object Browser (для конкретной библиотеки).
Видимо особо никого не интересует тема работы с указателяи в VB6.
1
|
|
|
|
||
| 18.04.2014, 21:34 | ||
|
поэтому не могу сейчас встревать во чтото другое
0
|
||
|
Модератор
|
|
| 18.04.2014, 22:29 [ТС] | |
|
Это лицензионный ключ http://visualbasic.freetutes.c... 4/p40.html
1
|
|
|
|
|
| 18.04.2014, 22:45 | |
|
Тоесть надо чтоб он был пустой чтоб небыло проблем у клиента, правильно я понял ?
0
|
|
|
Модератор
|
|||||||
| 18.04.2014, 22:48 [ТС] | |||||||
1
|
|||||||
|
|
||||
| 18.04.2014, 22:54 | ||||
![]() А вообще хотелось бы услышать какие еще можно решать реальные задачи такими знаниями, кроме как: Вот к примеру интересно было бы иметь возможность подключиться к работающей программе и в реальном времени отслеживать состояние всех переменных. Пусть даже при первом запуске она передает для отслеживания нужные адреса.
0
|
||||
|
Модератор
|
|||||||
| 19.04.2014, 00:39 [ТС] | |||||||
3
|
|||||||
|
Модератор
|
||
| 19.04.2014, 00:47 [ТС] | ||
|
И самое главное легкий вызов ассемблерных вставок. Я в скором времени сделаю класс для работ с MMX и SSE тогда я там активно буду применять эти знания.
0
|
||
| 19.04.2014, 00:47 | |
|
Помогаю со студенческими работами здесь
20
Вызов функции по указателю со смещением
Вызов функции по указателю, расположенному в структуре Вызов виртуальной функции по нулевому указателю Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|