![]() |
|
Модераторы: bsa |
![]()
|
|
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
mes
Родительский класс-шаблон содержит базовые методы для всех генерируемых классов. В первую очередь это replacement new. А уже дочерние - остальное - в том числе статические контанты, указывающие, как именно дочерний обьект должен размещатся в памяти, относительно параметра, преданного в replacement new. Это сообщение отредактировал(а) Logo - 15.3.2012, 21:17 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Logo, это Вы озвучили решение, а вот задача, которую будет решать этот шаблон все также не ясна.. А без четко поставленной задачи очень трудно будет Вам найти наиболее подходящее решение..
|
|||
|
||||
| baldina |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3433 Регистрация: 5.12.2007 Где: Москва Репутация: 15 Всего: 101 |
кажется, он ответил)) требуемое поведение можно обеспечить и без шаблонов, но тогда мы чего-нибудь лишаемся, например константности
насколько это серьезно - решать разработчику |
|||
|
||||
| Logo |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Ну, задача довольно специфическая. Пишу бинарный патч к програме. Исходников нет, это abandonware по сути.
Кода довольно много, что бы писать его на чистом ассемблере. Поэтому решил также написать небольшую библиотеку, для написания бинарных патчей. Одна из распрастраненных задач - вставить в какое-либо место свой блок кода. Идея в том что бы привязать структуру-класс к лексической области видимости функции. Таким образом получаем доступ к типизированным переменным программы (в том числе к разным структурам, которых там дохрена). Соответственно в терминах ООП это можно было бы описать например так. Базовый класс, содержащий в себе статический метод размещения объекта в памяти, оператор placement new, например. Его наследники, классы Scope - структуры, описывающие типы переменных конкретной функции, также содержит статическое integer поле, определяющее, что в структуре является локальными переменными (остальное у нас - сохраненные регистры, адрес возврата, и аргуметы функции). Наследники этих классов, описывающие конкретный блок кода, который мы хотим добавить в функцию. Содержит в себе внутренний тип - структуру, описывающую и типизирующую регистровые переменные, статические поля - регистр, относительно которого начинается блок локальных переменных в стеке, и смещение. Также может быть будут статические поля - адрес начала и конца блока, что бы записать код вставки блока в код основной программы, либо код все таки будет вставлятся вручную патчем. И метод, содержащий в себе собственно код. Вставка код на этой библиотеке выглядит примерно так.
Описание классов блоков кода с локальными и регистровыми переменными выносится в отдельный файл, что упрощает портирование патча под разные сборки программы. Описание этих классов должно содержать в себе как можно меньше служебного кода, в пользу декларативного описания переменных, регистров и прочего. Сейчас я склоняюсь к тому, чтобы создавать эти классы целиком на основе шаблона, вот так например
А как бы эту зачу решили бы вы? А вот тестовая черновая наброска одного из вариантов, не ручаюсь за точность и тем более красоту кода, но он работает). Компилятор MSVC
Это сообщение отредактировал(а) Logo - 17.3.2012, 03:00 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
весь код не смотрел..
статически ? вот посмотрите пример : http://liveworkspace.org/code/6703fd7250eb...e4f42b024d09278 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Спасибо, конечно, за код, но нужно совсем не это, о чем я уже написал выше в своем сообщении.
Надо - написать dll, подгрузить в экзешник эту dll и вставить в нужных местах код обращения к этой dll, например
А из C++ уже работать с переменными функции исходной програмы, как с обычными C++ переменными Это сообщение отредактировал(а) Logo - 17.3.2012, 16:06 |
|||
|
||||
| Logo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
А вот более понятный exemple, должен компилится MSVC и GCC 3
Это сообщение отредактировал(а) Logo - 19.3.2012, 00:13 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| mes |
|
||||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Logo, немножкo поразмышляю..
у нас есть некая функция, в которой мы рыботаем с локальными переменными.. мы хотим передать эти переменные и приплюсованные к ним регистры в другую функцию.. определяем два типа fn_vars, regs.. они лежат в некотором контехте, указатель на который мы передаем библиотечной функции.. тогда, функция в приложении, будет иметь условный вид :
тогда библиотечная функция
на данный момент на программиста возлагается ответсвеность по правильному отражению контекста. пользовательская функция, может иметь два вида, быть как свободной функцией, так и членом класса.. для первого случая
для второго
Добавлено @ 12:41 список аргументов мы можем расширить набором внешних переменных : fn_evars.. например две разные dll_fn, вызывают одну и ту же конечную функцию
Это сообщение отредактировал(а) mes - 17.3.2012, 13:52 |
||||||||||
|
|||||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вот набросок на основе вышеприведенных рассуждений :
http://liveworkspace.org/code/c657640f3e3e...71a4a90a97b004f Это сообщение отредактировал(а) mes - 17.3.2012, 13:40 |
|||
|
||||
| Logo |
|
||||||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 694 Регистрация: 22.7.2008 Репутация: 1 Всего: 10 |
Инжекта динамического скорее всего не будет пока, а так да, верно пожалуй. Инжект же может делаться не только обьекта "блок кода", можно разрешить инжект отдельных функций с asm кодом. Что до доступа к переменным (описание переменных) и самого кода, то обьект представляет собой локальную область видимости функции, а его метод run - сам код. Они разнесены в разные файлы с целью упростить портирование патча на другие версии программы. Но сам этот обьект может наследовать более базовый обьект "локальная область видмости функции", т.к. в одной функции может быть более одной вставки.
Контекст суть и есть регистры, передаются они по значению, можно представить ввиде структуры вида
pushad просто толкает все основные регистры в стек. Зная регистр, относительно которого вычисляется адрес блока локальных переменных (EBP или ESP) и смещение, мы цепляем их в программу. а popad забирает обратно регистры из стека (возможно специально измененные нами). Своего рода трюк, но корректный, т.к. соответствует соглашению cdecl. С глобальными переменными проще, можно так
И глобальные переменные одни для всех функций, зачем их еще как-то передавать в каждую функцию? P.S. адаптировал предыдущий пример под GCC 4 и liveworkspace (считает ® символом копирайта:), поэтому rreg) http://liveworkspace.org/code/ba083049f7c1...40feef0ac067af8 Добавлено @ 01:54 Вобще вполне логично, цепляем обьект к памяти, относительно параметра, и выполняем метод run, что здесь не так? Это сообщение отредактировал(а) Logo - 19.3.2012, 02:19 |
||||||||||||
|
|||||||||||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
контекст в данном случае не только регистры, а и все остальные пуши, которые отражают стек переменных функции.. контекст условное обозначение, и можно вместо него принять соглашение о вызове с асма не dll_fn (context&) , a dll_fn (vars&, regs&) ; в любом случае это отражение ложиться на плечи asm -вызова и нужно выбрать что удобнее...
там не глобальные переменные целевого-exe, а примыкание, для передачи дополнительных аргументов.. вполне возможно этого и не нужно.. значит половину можно выкинуть..
не в каждую, а только в ту что нужно.. а притягивать, чтоб можно было передавать разные.. т.е. для рабочей функции они не будут глобальными... в общем не забивайте этим голову..
логично было бы, если б вместо "цепляем" было "кастим" (cast).. |
||||||||
|
|||||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ловите под напильник : http://liveworkspace.org/code/4cf655d26a6b...b2fa1a75708e607 Добавлено @ 10:44 P.S. расчет адреса (в invoke) требует поправки.. Это сообщение отредактировал(а) mes - 19.3.2012, 11:49 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
там вообще то еще проще получается, убрал лишнее :
http://liveworkspace.org/code/ce5656743414...b1f582a9454735b пример работы с локальными переменными, как с объектом : http://liveworkspace.org/code/d0b846f4046a...7f5ed1c7f308b8b Это сообщение отредактировал(а) mes - 19.3.2012, 12:26 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |