|
Модератор
|
|||||||||||||||||||||
Вызов любых функций по указателю17.04.2014, 19:11. Показов 13966. Ответов 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
Вызов функции по указателю со смещением
Вызов функции по указателю, расположенному в структуре Вызов виртуальной функции по нулевому указателю Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|