Определить размер функций / заглушки / пространства имен в памяти - PullRequest
0 голосов
/ 23 декабря 2009

У меня есть пара функций в пространстве имен с именем stub. Я должен определить точный начальный адрес пространства имен и конечный адрес, по крайней мере, размера пространства имен в памяти (чтобы скопировать эти функции в другой процесс). Хотя это отлично работает в Visual C ++ 2008, добавив

void stub_end() { }

в конце пространства имен и использование

size_t size = reinterpret_cast<ULONG_PTR>(stub_end) - reinterpret_cast<ULONG_PTR>(stub_start);

для определения размера заглушки.

Это сработало, потому что Visual C ++ сохранил порядок функций в том виде, в котором он находится в файле .cpp, однако в Visual C ++ 2010 это больше не так.

Как узнать размер функций или всего пространства имен / заглушки, используя директивы прагмы, средства компилятора / компоновщика или аналогичные?

Ответы [ 3 ]

1 голос
/ 23 декабря 2009

С новым повышением безопасности в наши дни (рандомизация кучи, рандомизация макета и т. Д.), Я думаю, это будет намного сложнее. Возможно, вам придется просто скопировать каждую функцию по отдельности.

0 голосов
/ 23 декабря 2009

Язык C ++ не дает никаких гарантий для поиска адресов или размеров пространств имен. Тем не менее, рискну на ассемблере и инструкции компоновщика.

Многие языки ассемблера имеют код операции или мнемонику для размещения кода по определенным адресам. Это позволяет установить метку для указания начала области памяти. Некоторые линкеры имеют переменные для получения начальных адресов и размеров сегментов. Это будут определенные пользователем логические адреса.

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

0 голосов
/ 23 декабря 2009

Вы можете попробовать поместить каждую функцию в отдельный раздел, используя атрибут GCC, эквивалентный VCC ++ ((section ("name"))) http://www.delorie.com/gnu/docs/gcc/gcc_62.html, а затем использовать свою технику или Вы можете поместить каждую функцию в отдельный исходный файл.

...