Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 11

Размер функции

22.06.2019, 02:36. Показов 840. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток! Работаю в VS2015. Проект в x64.

Появилась необходимость узнать размер функции, мне посоветовали подобное:

C++
1
2
extern "C" int WINAPI LDE(void *, int);
DWORD funcSize = (DWORD)LDE(pAddress, 64);
Но ловлю ошибку линкера: error LNK2019: ссылка на неразрешенный внешний символ LDE.

Необходимая мне функция находится в DLL, я узнаю ее адрес с помощью GetProcAdress, но как получить размер функции имея лишь адрес - понятия не имею.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.06.2019, 02:36
Ответы с готовыми решениями:

1. Вызов функции 2. Размер массива
Уважаемые форумчане! случился баттхерт с ниже перечисленными вопросами, помогите пожалуйста! 1. void swap(void *v, int i, int j) { ...

Как измерить размер функции в байтах?
вот есть функция. сколько байт она занимает?

Файлы, функции. Определить размер трех файлов с данными именами.
3. Описать функцию IntFileSize(Name) целого типа, возвращающую размер файла целых чисел с именем Name. Если файл не существует, то функция...

6
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
22.06.2019, 04:05
1) Зачем? Если для перехвата вызова, то как минимум на 32-битовых системах для этого был hot-patch point (пространство для короткого jmp в начале функции, плюс пять nop перед функцией для длинного jmp "куда надо"). Полагаю, и на 64-битовых он никуда не делся.
2) В общем случае никак. DLL нигде не хранит размер функции. Методы проверки размера сводятся либо к "пролог функции совпадает с известным образцом", либо к попыткам дизассемблирования. Второй вариант грохнется как только в процессор добавят новую, неизвестную вашему коду инструкцию.
0
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 11
22.06.2019, 17:42  [ТС]
Фактически, можно сказать что это попытка дизассемблирования, т.к я пытаюсь узнать длину asm инструкций. Почему такой метод грохнется? Я постоянно могу узнавать адрес функции через GeyProcAdress и по новой считывать длину. Судя по твоему пункту 1, размер можно узнать считывая инструкции, пока не нарвусь на jmp? Что и будет обозначать начало новой функции и конец предыдущей ей?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
22.06.2019, 21:08
Цитата Сообщение от Eobard Посмотреть сообщение
Почему такой метод грохнется?
Потому что Интел, допустим, завтра добавит поддержку новой революционной технологии SSE6. А ваш дизассемблер ничего про SSE6 инструкции не знает. Как собственно и ваш компьютер, купленный до появления SSE6. Так в документации к dll и напишут "владельцы старых компьютеров, качайте сборку под старое железо".
Цитата Сообщение от Eobard Посмотреть сообщение
Судя по твоему пункту 1, размер можно узнать считывая инструкции, пока не нарвусь на jmp?
Нет. В первом пункте речь о том что в начале hot-patch point функции стоит заведомо бессмысленный mov edi,edi который не жалко затереть своим джампом. К размеру функции это отношения не имеет, это место для втыкания перехвата вызова.

Каким-то ориентиром для конца функции мог бы служить ret. Но во-первых, ret-ов в функции может быть много. Во-вторых, в целях оптимизации хвостовой рекурсии, функция может заканчиваться не ret, а тем самым jmp. Которых опять же может быть много.
0
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 11
22.06.2019, 22:10  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
Каким-то ориентиром для конца функции мог бы служить ret. Но во-первых, ret-ов в функции может быть много. Во-вторых, в целях оптимизации хвостовой рекурсии, функция может заканчиваться не ret, а тем самым jmp. Которых опять же может быть много.
Это я уже понял. Прочитав твой первый пост, я сразу же начал экспериментировать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DWORD getOpcodeLength(void *pAddress)
{
#if defined _WIN64  
    DWORD functionAddress = (DWORD)pAddress;
    DWORD i = 0;
    BYTE curOpcode = *((PBYTE)functionAddress+i);
        SIZE_T funcSize = 0;
        for (i = 0; ; i++)
        {
            if (curOpcode != 0xFF && curOpcode != 0x25 != curOpcode != 0xC3 && curOpcode != 0xC2 && curOpcode != 0xCB && curOpcode != 0xCA)
            {
                funcSize++;
            }
            else
            {
                break;
            }
            curOpcode = *((PBYTE)functionAddress + i);
        }
        return funcSize;
#else
  return (DWORD)LDE(pAddress, 0);
#endif
}
Я проверяю на все известные мне виды ret и наткнулся на то, что некоторые функции заканчиваются на jmp. В некоторых случаях я получаю корректную длину функции, а в некоторых почему-то нет. Это может быть, потому что jmp, допустим размещены в середине кода?

Добавлено через 2 минуты
Цитата Сообщение от Renji Посмотреть сообщение
ничего про SSE6 инструкции не знает
Это не имеет значения, для начала я хочу разобраться как мне определять длину функцию, а с прочими проблемами разбираться по мере их появления
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
22.06.2019, 22:39
Цитата Сообщение от Eobard Посмотреть сообщение
Это может быть, потому что jmp, допустим размещены в середине кода?
В данном случае сам код некорректен. Он полагает что каждая ассемблерная инструкция занимает один байт, что, разумеется, не так. Чтобы определить длину отдельной инструкции, придется штудировать маны на процессор и выписывать оттуда пухленькую табличку "код операции:длина".

И да, jmp могут быть в середине кода. И они могут быть вместо ret. Та самая хвостовая рекурсия, оптимизируемая посредством особой техномагии.
0
0 / 0 / 0
Регистрация: 17.10.2015
Сообщений: 11
23.06.2019, 00:40  [ТС]
Цитата Сообщение от Renji Посмотреть сообщение
определить длину отдельной инструкции
Я подумываю вот о чем, меня интересуют конкретные функции, с помощью OllyDbg я могу найти их, посмотреть на какой инструкции окончание функции, в моем коде распарсить инструкции и искать тот самый "конец" который получил из дизасма. Иду пробовать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.06.2019, 00:40
Помогаю со студенческими работами здесь

Подробно объяснить код шаблонной функции, вычисляющей размер массива во время компиляции
template <typename T, size_t N> size_t ArraySize(const T (&)) { return N; } объясните что здесь происходит. из всего этого...

Разработать шаблон функции, в которую передается массив и размер и возвращается индекс минимального элемента
Разработать шаблон функции, в которую передается массив и размер и возвращается индекс минимального элемента массива.

Ввести размер массива с клавиатуры и передать этот размер в конструктор
Я создал массив объектов. И я хочу ввести размер этого массива с клавиатуры, и передать этот размер в конструктор, как мне это сделать? ...

Функции (в заданной матрице размерности 4 на 6 определяет номер строки с максимальной суммой элементов и размер этой суммы) Изменить.
Вот программа которая в заданной матрице размерности 4 на 6 определяет номер строки с максимальной суммой элементов и размер этой суммы....

Увеличить размер выводимого текста (увеличить буквы) функции outtextxy
Здравствуйте. Я вывожу текст с помощью функции Функция outtextxy. Можно ли как-нибудь увеличить размер выводимого текста? (увеличить буквы)


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Мысли в слух. Про "навсегда".
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. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru