Add-in для работы с CDECL функциями.

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Add-in для работы с CDECL функциями.

Сообщение The trick » 02.02.2021 (Вт) 3:29

Моя попытка исправить баг в VB6 из-за которого при использование CDECL функций объявленных в tlb происходит вылет среды.
Тестировался только в "тепличных" условиях, поэтому скорее всего будут баги. О них пишите либо здесь либо на гитхабе.
Пара слов как работает Add-in.

Внутри рантайма есть специальная таблица в которой насколько я понял есть баг из-за которого и происходит вылет. Add-in находит эту таблицу используя сигнатурный поиск (т.к. таблица никак не экспортируется) и исправляет там один байт, после чего вылеты больше не происходят и функции успешно компилируются в p-код. Здесь однако есть другая проблема. Разработчики видимо хотели в будущем добавить поддержку CDECL функций в VB, т.к. специально выделили для них специальные p-коды, но поддержку не добавили. Вместо них стоят заглушки которые генерируют ошибку 0x33 (Internal error), так что Add-in просто делает то что не сделали разработчики - заменяет заглушки на собственные обработчики. Эти обработчики я написал аналогично обработчикам STDCALL функций просто добавив ADD ESP, XXX (p-коды содержат размеры аргументов в байтах).

Что не реализовано - cdecl COM вызовы, только стандартные функции из DLL. Также не поддерживаются HRESULT cdecl функции, т.к. для них генерируется STDCALL вызов, но HRESULT cdecl функций я никогда не встречал. В крайнем случае их можно заменить на int аналог. Возможно в будущем я исправлю это. Не работает при компиляции EXE в p-код.

В планах добавить CDECL поддержку в Declare, но тут сложнее т.к. придется еще кодогенерацию подправлять + для компиляции в нативный код тоже исправлять генерацию ошибки.

Модуль очень слабо тестировался, т.к. p-кодов для вызова функций полно, то возможно где-то вылезет Internal error - просто отправьте мне либо код, либо exe скомпилированный в p-код - я добавлю обработчики.

https://github.com/thetrik/VBCDeclFix
UA6527P

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

Re: Add-in для работы с CDECL функциями.

Сообщение Хакер » 03.02.2021 (Ср) 14:53

Неплохо было бы в той теме дать ссылку на эту тему.

The trick писал(а):Разработчики видимо хотели в будущем добавить поддержку CDECL функций в VB, т.к. специально выделили для них специальные p-коды, но поддержку не добавили.

Они её сделали для билдов EB под Mac, а под Win заглушили.

This method returns the FUNCDESC structure where the callconv member constains the calling convention of the external function. VBA6 then uses this information inside its own structiures which describes the functions in the project. During P-code generation the runtime extracts this information to map the specified function with the corresponding p-codes. There is the table which manages the process of the codegenetraion:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 03.02.2021 (Ср) 16:21

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

Отписал там тоже.

Хакер писал(а):Они её сделали для билдов EB под Mac, а под Win заглушили.

Понятно, кстати я еще не проверял почему, но иногда ключевое слово Cdecl не вызывает ошибки:
Код: Выделить всё
Option Explicit

Public Declare Function SumInt CDecl Lib "test_lib" (ByVal a As Long, ByVal b As Long) As Long

Sub main()
   
    Debug.Print SumInt(1, 2)

End Sub

Правда результат неверный - нужно посмотреть что возвращается и можно ли это где-то использовать.


За правки спасибо, сейчас исправлю.
UA6527P

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

Re: Add-in для работы с CDECL функциями.

Сообщение Хакер » 03.02.2021 (Ср) 18:21

The trick писал(а):Понятно, кстати я еще не проверял почему, но иногда ключевое слово Cdecl не вызывает ошибки

Почему «иногда»? А что, бывает что строка Public Declare Function SumInt CDecl Lib "test_lib" (ByVal a As Long, ByVal b As Long) As Long иногда не распарсивается как следует, а становится красной? Или речь о том, что она всегда принимается, но при компиляции вызывает Compile error?

Вообще, я ещё не пробовал Add-in. Но вот такая информация/вопрос для размышлений.

Что если add-in'у подвернётся некий особый билд VBA6.DLL, в котором никакой проблемы нет. Как поведёт себя Add-in в таком случае? Предположим, что сигнатуры для поиска ключевых мест останутся актуальными. Не получится ли так, что Add-in будет править правильное не «правильное» и что-нибудь сломает? Можно ли предусмотреть в коде какую-то проверку, которая убеждается, что неправильное поведение имеется, и если его нет, то ничего не правит?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 03.02.2021 (Ср) 19:10

Хакер писал(а):Или речь о том, что она всегда принимается, но при компиляции вызывает Compile error?

Нет я имел в виду не вызывает ошибки Bad Dll Calling Convention. К примеру если вместо Debug.Print написать Call - то уже другое поведение будет. Явно какой-то баг с кодогенерацией. Я как раз сейчас изучаю механизм генерации этих функций (хочу сделать полноценно рабочее ключевое слово Cdecl).

Хакер писал(а):Что если add-in'у подвернётся некий особый билд VBA6.DLL, в котором никакой проблемы нет. Как поведёт себя Add-in в таком случае? Предположим, что сигнатуры для поиска ключевых мест останутся актуальными.

Ну там именно проверяется, есть ли баг в таблице. Т.е. если бага нет и в таблице не 0x19 то Add-in не будет ничего делать. К примеру если скомпилировать 2 вресии Add-in'а, то вторая не будет работать т.к. баг уже пофикшен и проверка таблицы даст сбой.
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 04.02.2021 (Чт) 18:00

Небольшой прогресс есть. В общем удалось сделать рабочим ключевое слово Cdecl, но пока точно неизвестно сломается ли что-нибудь из-за того что изменяется логика кодогенерации (возможно Хакер лучше знает). В общем в рантайме есть такое место где проверяется соглашение вызова функции объявленной через Declare:

cdecl.png


Как видно дальше по коду идет проверка 3-х нижних бит, и если там 1 то выполняется кодогенерация безусловной ошибки Bad Dll Calling Convention, иначе там идет генерация кода для вызова Declare функции. Насколько я понимаю в EDI содержится дескриптор функции, т.к. к примеру если у нас есть функция объявленная через Declare с ключевым словом Cdecl то при изменении этих флагов меняется и отображаемый текст декларации функции.

В общем если эту логику поменять то можно заставить скомпилироваться проект, но тут все те же ошибки нас ждут что и с библиотекой типов. Если их исправить то все заработает! Более того все заработает и при компиляции в нативный код!



Теперь осталось только проверить несколько крупных проектов будут ли они компилироваться нормально и работать если мы изменим логику.
У вас нет доступа для просмотра вложений в этом сообщении.
UA6527P

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

Re: Add-in для работы с CDECL функциями.

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

The trick писал(а):(возможно Хакер лучше знает). В общем в рантайме есть такое место где проверяется соглашение вызова функции объявленной через Declare:

Я примерно понимаю, почему ты прячешь колонку с VA в отладчике (потому что в разных билдах разные базы и layout функций), но если бы ты всё-таки приводил адреса (по-моему у нас одинаковый билд), мне было бы проще ответить. Возможно я и разреверсил это место и оно мне знакомо, но я не могу опознать его по 5 инструкциям процессора.

The trick писал(а): Насколько я понимаю в EDI содержится дескриптор функции, т.к. к примеру если у нас есть функция объявленная через Declare с ключевым словом Cdecl то при изменении этих флагов меняется и отображаемый текст декларации функции.

Могу предположить, что эта структура известна мне под временным именем BLOCK-5 — это дочерняя структура, поддерживаемая экземплярами класса CMSNR (тоже временное рабочее название — расшифровывается как Module-specific Name-related). Этот объект в виде разных структур хранит бинарное представление различных сущностей, объявленных в модуле. Например Enum описывается структурой типа BLOCK-3.

Для BLOCK-5 у меня вот такое описание по результатам моих исследований:
block5.png

Сходится это с твоим представлением о структуре, на которую ссылается EDI? Если да, то мы будем знать, что говорим об одном и том же. К сожалению, файлик с описанием этих структур пострадал так как гит-репозиторий в целом пострадал из-за bad-блока на HDD. Поэтому у меня чёрти какая ревизия этого файла сохранилась только, в ней кроме BLOCK-3 и BLOCK-5 вообще ничего не описано.
У вас нет доступа для просмотра вложений в этом сообщении.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 04.02.2021 (Чт) 18:47

Хакер писал(а):Я примерно понимаю, почему ты прячешь колонку с VA в отладчике (потому что в разных билдах разные базы и layout функций), но если бы ты всё-таки приводил адреса (по-моему у нас одинаковый билд), мне было бы проще ответить. Возможно я и разреверсил это место и оно мне знакомо, но я не могу опознать его по 5 инструкциям процессора.

cdecl2.png


Хакер писал(а):Могу предположить, что эта структура известна мне под временным именем BLOCK-5 — это дочерняя структура, поддерживаемая экземплярами класса CMSNR (тоже временное рабочее название — расшифровывается как Module-specific Name-related). Этот объект в виде разных структур хранит бинарное представление различных сущностей, объявленных в модуле. Например Enum описывается структурой типа BLOCK-3.

Для BLOCK-5 у меня вот такое описание по результатам моих исследований

Да это она (проверил заменив поле IKF):
cdecl3.png


Функция изменилась на Property. Кстати можно тогда вписать что по смещению 0x3A также хранится соглашение вызова (интересно если изменить тип соглашения для внутренней функции? Это могло бы пригодится для cdecl callback вызовов)

Я в общем попробую то место пропатчить и скомпилировать несколько крупных проектов - если ничего не сломается тогда на гитхаб добавлю этот фикс.
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось The trick 04.02.2021 (Чт) 18:50, всего редактировалось 1 раз.
UA6527P

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

Re: Add-in для работы с CDECL функциями.

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

А что касается полей nameshortid***, то это отсносится к структурам NAMEREF, которые описывались тут:
viewtopic.php?f=9&t=56482
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 04.02.2021 (Чт) 19:30

В общем скомпилировал несколько проектов - никогда туда управление не передается, только когда функция объявлена Cdecl. В общем буду добавлять патч в Add-in, потом если что-то не будет работать то можно будет исправить, все-равно даже список P-кодов для CDECL неполный скорее всего.
UA6527P

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

Re: Add-in для работы с CDECL функциями.

Сообщение Хакер » 04.02.2021 (Чт) 19:40

Я бы не торопился выкладывать, если ты анонсируешь где-то подобные add-in'ы (типа vbforums), а хорошо потестировал и изучил. Потому что уйдёт в народ, а потом замучаешься искоренять неправильный add-in, если он окажется таковым.

The trick писал(а):никогда туда управление не передается

Туда это куда?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 04.02.2021 (Чт) 19:49

Хакер писал(а):Туда это куда?

Ветка где EAX = 1, это происходит тогда когда Cdecl указано в Declare.

Хакер писал(а):Я бы не торопился выкладывать, если ты анонсируешь где-то подобные add-in'ы (типа vbforums), а хорошо потестировал и изучил. Потому что уйдёт в народ, а потом замучаешься искоренять неправильный add-in, если он окажется таковым.

Наоборот же больше людей протестируют, отпишут сразу по багам.
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 04.02.2021 (Чт) 22:30

В общем обновил репозиторий, добавил поддержку слова CDecl в Declare.
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 08.02.2021 (Пн) 1:11

Играю с парсером кода VB6 - хочу сделать возможность задавать соглашение вызова для пользовательских функций (это может быть полезно для callback-функций). Я выяснил как модифицировать процесс разбора чтобы парсер разрешал ключевое слово CDecl в пользовательских функциях. Также я выяснил как модифицировать процесс вывода текста чтобы слово CDecl корректно отображалось (к примеру если этого не сделать то парсер будет принимать слово CDecl и функции будут иметь этот тип соглашения, но в редакторе кода это не будет видно). Компилятор, как и ожидалось, все корректно обрабатывает и компилирует правильный код (RET - для вызываемой функции и ADD ESP, XX для вызывающей). Одна проблема осталась - трансляция в P-код. Т.к. транслятор не может создавать CDecl функции "из коробки" нужно будет модифицировать транслятор чтобы для CDecl функций генерировался код как-будто они принимают 0 аргументов.

Небольшой пример:

Изображение

Как можно заметить слово CDecl корректно распознается парсером :D

Пример использования функции qsort из VB6:
Код: Выделить всё
Option Explicit

Private Declare Sub qsort CDecl Lib "msvcrt" ( _
                         ByRef pFirst As Any, _
                         ByVal lNumber As Long, _
                         ByVal lSize As Long, _
                         ByVal pfnComparator As Long)
                         
Sub Main()
    Dim z() As Long
    Dim i As Long
    Dim s As String
   
    ReDim z(10)
   
    For i = 0 To UBound(z)
        z(i) = Int(Rnd * 1000)
    Next
   
    qsort z(0), UBound(z) + 1, LenB(z(0)), AddressOf Comparator
   
    For i = 0 To UBound(z)
        s = s & CStr(z(i)) & vbNewLine
    Next
   
    MsgBox s
   
End Sub

Private Function Comparator CDecl( _
                 ByRef a As Long, _
                 ByRef b As Long) As Long
    Comparator = a - b
End Function


Изображение

Надеюсь что все будет работать.
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 09.02.2021 (Вт) 21:11

Обновление.

Добавлена поддержка слова CDecl в пользовательские функции. Теперь можно полноценно использовать callback-функции из C-библиотек.

Добавлены примеры:

  1. qsort - использование C-функции qsort с пользовательской callback функцией;
  2. cairo - использование оригинальной cairo.dll;
  3. sqlite - использование оригинальной sqlite3.dll

Тест Add-in производил только на 2-х версиях vba6.dll поэтому если у вас что-то не работает, сообщайте мне я обновлю сигнатуры.
UA6527P

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 10.02.2021 (Ср) 14:02

Обновил репозиторий. Убрал некоторые баги касаемые файла .gitattributes. Также изменил сигнатруры, т.к. попалась еще одна vba6.dll в которой они немного отличались от первоначальных.
UA6527P

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

Re: Add-in для работы с CDECL функциями.

Сообщение Хакер » 10.02.2021 (Ср) 17:57

The trick писал(а): т.к. попалась еще одна vba6.dll в которой они немного отличались от первоначальных.

Ты коллекционируешь разные билды vba6.dll? У меня коллекция из 17 разных билдов рантаймов, но VBA6 только тот билд 9782. Очень полезно иметь коллекцию.

Есть ли вообще более свежий билд, чем 9782, для которого есть dbg-файл?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 774
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Add-in для работы с CDECL функциями.

Сообщение The trick » 10.02.2021 (Ср) 19:38

Хакер писал(а):Ты коллекционируешь разные билды vba6.dll?

Нет. У меня нашлось только 3 билда от разных установщиков:
"Рабочий билд" - тот который используется в VB6 - 6.0.0.9782 (это с установленным SP6);
Билд без SP6 - 6.0.0.8169;
Еще один билд - 6.0.0.8495.

У меня для VBA6 нет DBG файла, точнее он есть но в нем толком ничего нет. Вот для VB6.exe есть. Кстати много полезной инфы можно извлечь из VBA 6.5 SDK. К примеру те же идентификаторы ключевых слов или константы для типов модулей. Жаль я только сейчас нашел все это:
Код: Выделить всё
//=--------------------------------------------------------------------------=
// kwid.h
//=--------------------------------------------------------------------------=
// Copyright (c) 1988-1996, Microsoft Corporation
//                 All Rights Reserved
// Information Contained Herein Is Proprietary and Confidential.
//=--------------------------------------------------------------------------=

#ifndef _KWID_H_
#define _KWID_H_


#define KWID_tkNone    0
#define KWID_tkABS    1
#define KWID_tkACCESS    2
#define KWID_tkADDRESSOF    3
#define KWID_tkALIAS    4
#define KWID_tkAND    5
#define KWID_tkANY    6
#define KWID_tkAPPEND    7
#define KWID_tkARRAY    8
#define KWID_tkAS    9
#define KWID_tkASSERT    10
#define KWID_tkB    11
#define KWID_tkBASE    12
#define KWID_tkBF    13
#define KWID_tkBINARY    14
#define KWID_tkBOOLEAN    15
#define KWID_tkBYREF    16
#define KWID_tkBYTE    17
#define KWID_tkBYVAL    18
#define KWID_tkCALL    19
#define KWID_tkCASE    20
#define KWID_tkCBOOL    21
#define KWID_tkCBYTE    22
#define KWID_tkCCUR    23
#define KWID_tkCDATE    24
#define KWID_tkCDEC    25
#define KWID_tkCDBL    26
#define KWID_tkCDECL    27
#define KWID_tkCHDIR    28
#define KWID_tkCINT    29
#define KWID_tkCIRCLE    30
#define KWID_tkCLNG    31
#define KWID_tkCLOSE    32
#define KWID_tkCOMPARE    33
#define KWID_tkCONST    34
#define KWID_tkCSNG    35
#define KWID_tkCSTR    36
#define KWID_tkCURDIR    37
#define KWID_tkCURDIRstr    38
#define KWID_tkCVAR    39
#define KWID_tkCVDATE    40
#define KWID_tkCVERR    41
#define KWID_tkCURRENCY    42
#define KWID_tkDATABASE    43
#define KWID_tkDATE    44
#define KWID_tkDATEstr    45
#define KWID_tkDEBUG    46
#define KWID_tkDECIMAL    47
#define KWID_tkDECLARE    48
#define KWID_tkDEFBOOL    49
#define KWID_tkDEFBYTE    50
#define KWID_tkDEFCUR    51
#define KWID_tkDEFDATE    52
#define KWID_tkDEFDEC    53
#define KWID_tkDEFDBL    54
#define KWID_tkDEFINT    55
#define KWID_tkDEFLNG    56
#define KWID_tkDEFOBJ    57
#define KWID_tkDEFSNG    58
#define KWID_tkDEFSTR    59
#define KWID_tkDEFVAR    60
#define KWID_tkDIM    61
#define KWID_tkDIR    62
#define KWID_tkDIRstr    63
#define KWID_tkDO    64
#define KWID_tkDOEVENTS    65
#define KWID_tkDOUBLE    66
#define KWID_tkEACH    67
#define KWID_tkELSE    68
#define KWID_tkELSEIF    69
#define KWID_tkEMPTY    70
#define KWID_tkEND    71
#define KWID_tkENDIF    72
#define KWID_tkENUM    73
#define KWID_tkEQV    74
#define KWID_tkERASE    75
#define KWID_tkERROR    76
#define KWID_tkERRORstr    77
#define KWID_tkEVENT    78
#define KWID_tkEXIT    79
#define KWID_tkEXPLICIT    80
#define KWID_tkF    81
#define KWID_tkFALSE    82
#define KWID_tkFIX    83
#define KWID_tkFOR    84
#define KWID_tkFORMAT    85
#define KWID_tkFORMATstr    86
#define KWID_tkFREEFILE    87
#define KWID_tkFRIEND    88
#define KWID_tkFUNCTION    89
#define KWID_tkGET    90
#define KWID_tkGLOBAL    91
#define KWID_tkGO    92
#define KWID_tkGOSUB    93
#define KWID_tkGOTO    94
#define KWID_tkIF    95
#define KWID_tkIMP    96
#define KWID_tkIMPLEMENTS    97
#define KWID_tkIN    98
#define KWID_tkINPUT    99
#define KWID_tkINPUTstr    100
#define KWID_tkINPUTB    101
#define KWID_tkINPUTBstr    102
#define KWID_tkINSTR    103
#define KWID_tkINSTRB    104
#define KWID_tkINT    105
#define KWID_tkINTEGER    106
#define KWID_tkIS    107
#define KWID_tkLBOUND    108
#define KWID_tkLEFT    109
#define KWID_tkLEN    110
#define KWID_tkLENB    111
#define KWID_tkLET    112
#define KWID_tkLIB    113
#define KWID_tkLIKE    114
#define KWID_tkLINE    115
#define KWID_tkLINEINPUT    116
#define KWID_tkLOAD    117
#define KWID_tkLOCAL    118
#define KWID_tkLOCK    119
#define KWID_tkLONG    120
#define KWID_tkLOOP    121
#define KWID_tkLSET    122
#define KWID_tkME    123
#define KWID_tkMID    124
#define KWID_tkMIDstr    125
#define KWID_tkMIDB    126
#define KWID_tkMIDBstr    127
#define KWID_tkMOD    128
#define KWID_tkMODULE    129
#define KWID_tkNAME    130
#define KWID_tkNEW    131
#define KWID_tkNEXT    132
#define KWID_tkNOT    133
#define KWID_tkNOTHING    134
#define KWID_tkNULL    135
#define KWID_tkOBJECT    136
#define KWID_tkON    137
#define KWID_tkOPEN    138
#define KWID_tkOPTION    139
#define KWID_tkOPTIONAL    140
#define KWID_tkOR    141
#define KWID_tkOUTPUT    142
#define KWID_tkPARAMARRAY    143
#define KWID_tkPRESERVE    144
#define KWID_tkPRINT    145
#define KWID_tkPRIVATE    146
#define KWID_tkPROPERTY    147
#define KWID_tkPSET    148
#define KWID_tkPUBLIC    149
#define KWID_tkPUT    150
#define KWID_tkRAISEEVENT    151
#define KWID_tkRANDOM    152
#define KWID_tkRANDOMIZE    153
#define KWID_tkREAD    154
#define KWID_tkREDIM    155
#define KWID_tkREM    156
#define KWID_tkRESUME    157
#define KWID_tkRETURN    158
#define KWID_tkRGB    159
#define KWID_tkRSET    160
#define KWID_tkSCALE    161
#define KWID_tkSEEK    162
#define KWID_tkSELECT    163
#define KWID_tkSET    164
#define KWID_tkSGN    165
#define KWID_tkSHARED    166
#define KWID_tkSINGLE    167
#define KWID_tkSPC    168
#define KWID_tkSTATIC    169
#define KWID_tkSTEP    170
#define KWID_tkSTOP    171
#define KWID_tkSTRCOMP    172
#define KWID_tkSTRING    173
#define KWID_tkSTRINGstr    174
#define KWID_tkSUB    175
#define KWID_tkTAB    176
#define KWID_tkTEXT    177
#define KWID_tkTHEN    178
#define KWID_tkTO    179
#define KWID_tkTRUE    180
#define KWID_tkTYPE    181
#define KWID_tkTYPEOF    182
#define KWID_tkUBOUND    183
#define KWID_tkUNLOAD    184
#define KWID_tkUNLOCK    185
#define KWID_tkUNKNOWN    186
#define KWID_tkUNTIL    187
#define KWID_tkVARIANT    188
#define KWID_tkWEND    189
#define KWID_tkWHILE    190
#define KWID_tkWIDTH    191
#define KWID_tkWITH    192
#define KWID_tkWITHEVENTS    193
#define KWID_tkWRITE    194
#define KWID_tkXOR    195
#define KWID_tkHackConst    196
#define KWID_tkHackElse    197
#define KWID_tkHackElseif    198
#define KWID_tkHackEnd    199
#define KWID_tkHackIf    200
#define KWID_tkATTRIBUTE    201
#define KWID_tkVB_BASE    202
#define KWID_tkVB_CONTROL    203
#define KWID_tkVB_CREATABLE    204
#define KWID_tkVB_CUSTOMIZABLE    205
#define KWID_tkVB_DESCRIPTION    206
#define KWID_tkVB_EXPOSED    207
#define KWID_tkVB_EXT_KEY    208
#define KWID_tkVB_HELPID    209
#define KWID_tkVB_INVOKE_FUNC    210
#define KWID_tkVB_INVOKE_PROPERTYGET    211
#define KWID_tkVB_INVOKE_PROPERTYPUT    212
#define KWID_tkVB_INVOKE_PROPERTYPUTREF    213
#define KWID_tkVB_MEMBERFLAGS    214
#define KWID_tkVB_NAME    215
#define KWID_tkVB_PREDECLID    216
#define KWID_tkVB_PROCDATA    217
#define KWID_tkVB_TEMPLATEDERIVED    218
#define KWID_tkVB_VARDESCRIPTION    219
#define KWID_tkVB_VARHELPID    220
#define KWID_tkVB_VARMEMBERFLAGS    221
#define KWID_tkVB_VARPROCDATA    222
#define KWID_tkVB_USERMEMID    223
#define KWID_tkVB_VARUSERMEMID    224
#define KWID_tkVB_GLOBALNAMESPACE    225
#define KWID_tkListSep    226
#define KWID_tkDecimalSep    227
#define KWID_tkDQuote    228
#define KWID_tkLineCont    229
#define KWID_tkUnused08    230
#define KWID_tkUnused09    231
#define KWID_tkUnused10    232
#define KWID_tkUnused11    233
#define KWID_tkUnused12    234
#define KWID_tkUnused13    235
#define KWID_tkUnused14    236
#define KWID_tkUnused15    237
#define KWID_tkUnused16    238
#define KWID_tkUnused17    239
#define KWID_tkUnused18    240
#define KWID_tkUnused19    241
#define KWID_tkUnused20    242
#define KWID_tkID    243
#define KWID_tkBang    244
#define KWID_tkSharp    245
#define KWID_tkConcat    246
#define KWID_tkSQuote    247
#define KWID_tkLParen    248
#define KWID_tkRParen    249
#define KWID_tkMult    250
#define KWID_tkPlus    251
#define KWID_tkMinus    252
#define KWID_tkDot    253
#define KWID_tkDiv    254
#define KWID_tkColon    255
#define KWID_tkSColon    256
#define KWID_tkLT    257
#define KWID_tkLE    258
#define KWID_tkNE    259
#define KWID_tkEQ    260
#define KWID_tkLE2    261
#define KWID_tkGE2    262
#define KWID_tkGT    263
#define KWID_tkNE2    264
#define KWID_tkGE    265
#define KWID_tkQMark    266
#define KWID_tkIDiv    267
#define KWID_tkPwr    268
#define KWID_tkColEq    269
#define KWID_tkComma    270
#define CCH_MAX_KEYWORD_LEN    80
#define CCH_MAX_LINE_LEN   1023

#endif // ifndef _KWID_H_
У вас нет доступа для просмотра вложений в этом сообщении.
UA6527P

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

Re: Add-in для работы с CDECL функциями.

Сообщение Хакер » 10.02.2021 (Ср) 20:07

The trick писал(а): меня для VBA6 нет DBG файла, точнее он есть но в нем толком ничего нет.

На самом деле толком что-то есть. В нём нет директории COFF-таблицы, поэтому мы не имеем имён функций и переменных, что конечно можно назвать самое главное.

Однако в нём есть FPO-информация, что позволяет матчить процедуры между VBA6.DLL и MSVMVM60.DLL, и таким образом для множества процедур из EB можно найти близнецов между рантаймовой и IDE-шной инкарнациями EB.

Во-вторых, там есть две OMAP-директории, которые описывают карту перестановок фрагментов во время легофикации, а также там есть директория релокаций (для DLL это не так критично, но для VB6.EXE это бесценная информация), что вместе с OMAP-директориями позволяет произвести антилегофикацию.

Ну и в целом, даже если отбросить шаманскую процендуру ANTILEGO-фикации, просто выписывание адресов процедуры в пре-логофикационном порядке даёт некую информацию о сути процедур исходя из знаний о соседних процедурах. То есть если у тебя есть 3 процедуры, из которых ты знаешь суть первой и третьей (например это методы какого-то класса), то можно смело считать, что вторая тоже является методом того же класса, потому что в прелегофицированном образе порядок следования процедур в образе соответствует порядку следования процедур в исходнике. Точно также и с переменными: для блока из из 100 переменных, если у тебя есть соображения о том, в какому исходному модулю относятся первые 5 и последние 5 из блока, можно смело записывать средние «90» в число переменных, объявленных в том же исходном файле.

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

loquat
Начинающий
Начинающий
 
Сообщения: 6
Зарегистрирован: 08.02.2021 (Пн) 3:51

Re: Add-in для работы с CDECL функциями.

Сообщение loquat » 19.09.2022 (Пн) 8:21

msvbvm60.dbg vb6.dbg vba6.dbg with dll and exe file
not sure if you already have them.
url:https://share.lexar.com/share/s/d52df3a6831b470b878c24a42d4b7729
psw:kvm9


Вернуться в Наши проекты

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

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

    TopList