Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
#1

Как получить размер функции? - C++

06.04.2012, 15:27. Просмотров 2011. Ответов 13
Метки нет (Все метки)

её начало я получаю с помощью ассемблера(offset), не получается получить её конец и вычислить её длину
P. S. Borland c++ 6
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.04.2012, 15:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как получить размер функции? (C++):

Как узнать размер файла - C++
Вобщем программа -кодировщик методом Хаффмана, взята из интернета. Нужно добавить к ней вывод размера входного файла и сжатого.. ...

Как определить размер изображения?? - C++
Подскажите, пожалуйста, как определить размер изображения ?? (С++).

Как получить адрес функции в dll стороннего процесса? - C++ Builder
Я подцепляюсь к чужому процессу, модифицирую память. Как рабочее пространство использую ненужную функцию в подгружаемой процессом dll. На...

Как в функции реакции объекта получить ссылку на сам объект? - C++ Builder
Например есть ф-я void __fastcall TForm1::FormCreate(TObject *Sender) { очевидно, что объектом ф-и является TForm1, но как быть...

Какой приблизительно размер добавляемого компонента и влияет ли он на размер самой программы - C++ Builder
Здравствуйте, меня интересует вопрос, когда создаешь какой нить компонент, какой приблизительно его размер и влияет ли он на размер самой...

Автоматически изменять размер объектов Image под размер формы - C++ Builder
Как сделать чтобы после запуска программы в C++ Builder можно было изменить размер формы, и размер объектов Image автоматически изменялся...

13
easybudda
Модератор
Эксперт CЭксперт С++
9664 / 5614 / 952
Регистрация: 25.07.2009
Сообщений: 10,778
06.04.2012, 15:34 #2
Цитата Сообщение от Van111 Посмотреть сообщение
не получается получить её конец и вычислить её длину
Просто из любопытства: а Вам оно за чем?
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
06.04.2012, 15:57  [ТС] #3
Цитата Сообщение от easybudda Посмотреть сообщение
Просто из любопытства: а Вам оно за чем?
WriteProcessMemory

Добавлено через 20 минут
неужели некто не знает?

Добавлено через 52 секунды
неужели некто не знает?
0
CheshireCat
Эксперт С++
2893 / 1242 / 78
Регистрация: 27.05.2008
Сообщений: 3,379
06.04.2012, 15:59 #4
Легально (т.е. средствами, гарантированными Стандартом языка, а значит, работающими всегда и на всех мыслимых платформах) - никак.
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
06.04.2012, 16:52 #5
А если говорить о нелегальных способах, то можно так(тестировалось на 32 битных осях, винда и линукс, компилятор mingw/gcc соответственно):

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
25
26
#include <stdio.h>
extern const long test_size;
 
#ifdef __cplusplus
extern "C" {
    static void test_func(void);
}
#endif
asm("L_B1:");
static void test_func(void)
{
    asm volatile("nop");
}
#ifdef WIN32
asm("_test_size: .long .-L_B1");
#else
asm("test_size: .long .-L_B1");
#endif
 
int main(void)
{
    
    test_func();
    printf("Start_adress: %p, size: %ld\n",test_func,test_size);
    return 0;
}
http://liveworkspace.org/code/dd9802...7b580995b55d53

Добавлено через 8 минут
з.ы. предлагаю модераторам перенести эту тему сюда http://www.cyberforum.ru/cpp/
имхо, вопрос не попадает в категорию "для новичков"
2
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
06.04.2012, 20:34  [ТС] #6
а при помощи ассемблерных команд можно?
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
06.04.2012, 20:39 #7
Цитата Сообщение от Van111 Посмотреть сообщение
а при помощи ассемблерных команд можно?
а код выше разве без участия ассемблера?
идея в том, чтобы создать переменную и положить в неё размер функции, который вычисляется
как разница между началом и концом, это я и привёл в примере.
1
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
06.04.2012, 21:57  [ТС] #8
nxnx, если не трудно можешь пожалуйста на интеловский ассемблер перевести
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
06.04.2012, 22:43 #9
А зачем оно вообще нужно?
0
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
06.04.2012, 22:54 #10
полагаю, нужно в коде функции искать опкод инструкции ret.
1
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
07.04.2012, 06:45 #11
Цитата Сообщение от niXman Посмотреть сообщение
олагаю, нужно в коде функции искать опкод инструкции ret.
Если в функции несколько инструкций ret то размер будет неточным

Цитата Сообщение от Van111 Посмотреть сообщение
если не трудно можешь пожалуйста на интеловский ассемблер перевести
как такое сделать для борландовских компиляторов я не знаю. но синтаксис вроде и так почти/интеловский

з.ы. можно ещё попробовать так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
void test_func(void)
{
    //asm volatile("nop");
}
void foo(void)
{
   
}
 
 
int main(void)
{
    
    test_func();
    printf("Start_adress: %p, size: %u\n",test_func,(size_t)foo-(size_t)test_func);
    return 0;
}
1
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
07.04.2012, 14:23  [ТС] #12
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.

Добавлено через 8 минут
объясните странность
void MyMessage()
{
MessageBox(0,"OK","OK",MB_OK );
return;
}
MessageBox весит 5 байт, return 1 получаем 6, всё правильно
но если убрать MessageBox размер равен двум, как так??
0
nxnx
Формучанин
362 / 293 / 16
Регистрация: 02.11.2010
Сообщений: 1,234
07.04.2012, 14:41 #13
а кто знает дериктивы которые бы размещали функции в том порядке в котором они встречаются в коде, и точно в том же порядке размещали данные в сегменте данных.
помоему таких директив не существует.
компилятор вправе делать ассемблерный код по своему усмотрению.
Вот ассемблерный код он не переиначит...

объясните странность
Все старнности решаются через дизассемблирование функций. В борланде это помоему сделать проще некуда.

пример(mingw, синтаксис intel):


код 1
C
1
2
3
4
5
void MyMessage()
{
MessageBox(0,"OK","OK",MB_OK );
return;
}

дизазм 1 (размер 47)

Код
MyMessage()
MyMessage+0: push   ebp
MyMessage+1: mov    ebp,esp
MyMessage+3: sub    esp,0x18
!MessageBox(0,"OK","OK",MB_OK );
MyMessage+6: mov    DWORD PTR [esp+0xc],0x0
MyMessage+14: mov    DWORD PTR [esp+0x8],0x403064
MyMessage+22: mov    DWORD PTR [esp+0x4],0x403064
MyMessage+30: mov    DWORD PTR [esp],0x0
MyMessage+37: call   0x401b88 <MessageBoxA@16>
MyMessage+42: sub    esp,0x10
!return;
!}
MyMessage+45: leave  
MyMessage+46: ret


код 2
C
1
2
3
4
5
void MyMessage()
{
//MessageBox(0,"OK","OK",MB_OK );
return;
}

дизазм 2 (размер 5)
Код
MyMessage()
MyMessage+0: push   ebp
MyMessage+1: mov    ebp,esp
!//MessageBox(0,"OK","OK",MB_OK );
!return;
!}
MyMessage+3: pop    ebp
MyMessage+4: ret
1
niXman
Эксперт С++
3137 / 1449 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
07.04.2012, 20:30 #14
Цитата Сообщение от nxnx Посмотреть сообщение
ассемблерный код он не переиначит...
и то, только в том случае, если он помечен как volatile
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.04.2012, 20:30
Привет! Вот еще темы с ответами:

Изменять размер панели под размер причаливаемых окон - C++ Builder
Имеется панель, которая выравнена относительно главного окна как alLeft. На панель причаливаются и отчаливаются другие окна фиксированного...

Как уменьшить размер программ? - C++ Builder
Как можно уменьшить размер программ написанных в C++Builder 2007? Даже форма, содержащая одну кнопку и код Close(); весит 531 Кб.

Получить массив char и его размер из функции - Указатель не меняется вне функции - C++ WinAPI
Помогите пожалуйста разобраться в чём проблема. Добавлено через 34 минуты Помогите пожалуйста разобраться в чём проблема. Нужно...

Как получить размер папки - Java SE
Как получить размер папки? Мне это нужно для игры, типо анти-чит) После получения размера надо выполнить такое действие: if(sizemods...


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
07.04.2012, 20:30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru