Всегда ли AddressOf возвращает одно и то же число?

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

Всегда ли AddressOf возвращает одно и то же число?

Сообщение arthur2 » 09.07.2009 (Чт) 11:56

Ну, в экзешнике понятно - это константа, которая указывает адрес определённой функции.

А если в подключаемой библиотеке? Ведь библиотеки могут подключаться в разном порядке, а адресное пространство одно.
Артур
 
   

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Всегда ли AddressOf возвращает одно и то же число?

Сообщение ANDLL » 09.07.2009 (Чт) 14:12

Тогда разное число.
В exe теоретически то же может отличаться
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: Всегда ли AddressOf возвращает одно и то же число?

Сообщение arthur2 » 09.07.2009 (Чт) 15:26

А как тогда это компилируется? Я где-то у кого-то из гуру читал, что Addressof при компиляции просто сразу прошивается в файл. Выходит, это всё-таки что-то вроде функции?
Артур
 
   

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

Re: Всегда ли AddressOf возвращает одно и то же число?

Сообщение Хакер » 09.07.2009 (Чт) 16:04

AddressOf возвращает VA. Для скомпилированных в Native-код файлов (не важно, EXE или DLL) этот VA относительно ImageBase (то есть RVA) будет всегда константен. (Не для разных билдов, а для одного билда, сколько ни запускай его!)

Для проектов, скомпилированных в P-код: понятия не имею. Как минимум, я не знаю, что для них AddressOf создаёт Native-кодный переходник-делегат, вызывающий P-кодную процедуру. Так же это распространяется на отладку проекта из под IDE.
—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: Всегда ли AddressOf возвращает одно и то же число?

Сообщение arthur2 » 09.07.2009 (Чт) 16:56

AddressOf возвращает VA. Для скомпилированных в Native-код файлов (не важно, EXE или DLL) этот VA относительно ImageBase (то есть RVA) будет всегда константен. (Не для разных билдов, а для одного билда, сколько ни запускай его!)

Я сделал две библиотеки test1.dll и test2.dll с одним и тем же кодом и скомпилировал их:
Код: Выделить всё
Public Function getAddrOf() As Long
   getAddrOf = getadr(AddressOf winProc)
End Function

В проекте подключил обе эти библы:
Код: Выделить всё
Option Explicit
Dim t1 As New test1.cTest
Dim t2 As New test2.cTest
Sub Main()
   Debug.Print t2.getAddrOf
   Debug.Print t1.getAddrOf
End Sub

Если менять код (добавит/удалить какие-нибудь действия или функции), числа могут не меняться, а могут и меняться. В чём закономерность - я так и не понял. Кроме того, если поменять местами первый и второй дебаг, числа местами не меняются, то есть addressof зависит от порядка обращения к библам.
Артур
 
   

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

Re: Всегда ли AddressOf возвращает одно и то же число?

Сообщение Хакер » 09.07.2009 (Чт) 17:11

Если ты не начнёшь думать, я прекращу тебе помогать.

VA функции зависит от адреса загрузки модуля и RVA функции.
Адрес загрузки модуя зависит от соотв. свойства в PE-заголовке и лэйаута ВАП.
RVA функции константен.

Ты конечно же поленился поменять, и у тебя у обоих библиотек стоит база 0x11000000. Естественно, что при таком раскладе одна из библ реаллочится.
—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: Всегда ли AddressOf возвращает одно и то же число?

Сообщение arthur2 » 09.07.2009 (Чт) 17:50

Хакер писал(а):Если ты не начнёшь думать, я прекращу тебе помогать.
фи. :?

Хакер писал(а):Ты конечно же поленился поменять, и у тебя у обоих библиотек стоит база 0x11000000. Естественно, что при таком раскладе одна из библ реаллочится.
Что поленился поменять? что значит реалочится? Я специально сделал абсолютно одинаковые библиотеки, предполагая, что адреса функций у них должны совпасть.

Откуда вообще бейсик знает, что метод класса возвращает именно addressof? Обе библиотеки скомпилированы, а значит, если бы addressof в них была бы константной, должны были бы возвращать одно и то же число. Я понимаю, что чего-то не понимаю. Но это не значит, что я не думаю.
Артур
 
   

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Всегда ли AddressOf возвращает одно и то же число?

Сообщение ANDLL » 09.07.2009 (Чт) 18:06

специально сделал абсолютно одинаковые библиотеки, предполагая, что адреса функций у них должны совпасть.
Если бы у них был одинаковый адрес функций то они что получается, вдвоем поместились в одном месте?
Реалочаться значит что грузяться не по базовому адресу.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог

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

Re: Всегда ли AddressOf возвращает одно и то же число?

Сообщение Хакер » 09.07.2009 (Чт) 18:08

Фикай-фикай.

Что поленился поменять?

Свойство проекта «DLL Image Base».

arthur2 писал(а):что значит реалочится?

Значит библиотека загружается не по тому «DLL Image Base», который указан в свойствах проекта (потому что указанный там адрес уже занят библой с таким же адресом), а по какому-то другому.
При этом все места, которые перечислены в Релоках, fix-up'ятся на дельту, равную разнице желаемого ImageBase и получившегося ImageBase.
Константное число, возвращаемое AddressOf тоже фиксапится.

если бы addressof в них была бы константной, должны были бы возвращать одно и то же число.

Нифига, константы, вшитые в код, переправляются при реалокации.

Вообще, меня ещё раздражает кое-что. А именно то, что человек, который говорил «Как это я не юзаю FNDLL!? Юзаю! Во всю!» на деле эту вещь не юзает. А плодит классы, которые только вводят этого человека в заблуждения. Мало юзать какую-то фишку. Надо думать, чем юзание этой фишки может упростить жизни.

Мог бы написать библиотеку вот с таким кодом:
Код: Выделить всё
Public Function Bar() As Long
    Bar = Foo(AddressOf TraTaTa)
End Function

Public Function Foo(ByVal x As Long) As Long
    Foo = x
End Function

Public Sub TraTaTa()
    MsgBox "Actually, I remember having a fondness for balloons..."
End Sub


И посмотреть, во что скомпилируется Foo и Bar с помощью того же OllyDbg:
Код: Выделить всё
### Foo:
MOV EAX, DWORD PTR [ESP+4]
RETN 4
================================================
### Bar:
PUSH test.11001A90
CALL test.Foo
RETN


Видишь константу в инструкции push? Это и есть та константа, в которую превращается выражение с AddressOf. И эта константа тупо правится при релокации. Нет там никакой динамики. И VB ничего не узнаёт.
—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: Всегда ли AddressOf возвращает одно и то же число?

Сообщение arthur2 » 09.07.2009 (Чт) 18:50

ANDLL
ANDLL писал(а):Если бы у них был одинаковый адрес функций то они что получается, вдвоем поместились в одном месте?
Именно это я и хотел понять: как в таком случае будет разрешено противоречие.

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

Хакер писал(а):При этом все места, которые перечислены в Релоках, fix-up'ятся на дельту, равную разнице желаемого ImageBase и получившегося ImageBase.
Константное число, возвращаемое AddressOf тоже фиксапится.
Ну вот, теперь понятно :)
если бы addressof в них была бы константной, должны были бы возвращать одно и то же число.
Цитата неполная :)
Вообще, меня ещё раздражает кое-что.
Не надо раздражаться :)
Артур
 
   


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

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

Сейчас этот форум просматривают: AhrefsBot, Google-бот и гости: 7

    TopList  
cron