![]() |
|
![]() ![]() ![]() |
|
nadge |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
Доброе время суток!
Кусок программы (тестовый пока):
Далее в одной из функций пишу:
И в dwCodeSize получаю очень большое (явно неверное) значение. Идея взята (практически дословно) из BO2k, там прекрасно работает. Уже час бьюсь, так и не разобрался. Где ошибка? З.Ы. Подозреваю, что где-то в опциях компиляции, но никак не могу понять, где именно. Оптимизации вроде все по отключал. Среда: VS 2005. Это сообщение отредактировал(а) nadge - 3.1.2008, 01:14 |
||||
|
|||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
nadge,
с чего ты взял, что код функций располагается последовательно? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
nadge |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
MAKCim, я видел работающий пример, идентичный моему - http://www.bo2k.com/, файл исходника называется process_hop.cpp. (Здесь код не привожу т.к. все полностью как у меня.)
ОК, переформулирую вопрос иначе. Что нужно сделать, чтобы код располагался последовательно? Это сообщение отредактировал(а) nadge - 3.1.2008, 04:29 |
|||
|
||||
pompei |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.9.2007 Репутация: нет Всего: 6 |
Ни чё нельзя!!!
--------------------
А всё оказывается гораздо проще: пассивные наноструктуры - активные наноструктуры - системы наносистем - молекулярные наносистемы - сингулярность! По пять лет на каждый этап. |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Единственное верное решение: использовать дизассемблер длин машинных инструкций:
Проект в аттаче. Присоединённый файл ( Кол-во скачиваний: 10 ) ![]() -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Это невозможно сделать в рамках стандартных компиляторов. Это сообщение отредактировал(а) W4FhLF - 3.1.2008, 08:37 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Damarus |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: 6 Всего: 29 |
||||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Damarus, верно, поэтому перед использованием всё-таки надо пихнуть программу в дизассемблер
![]() -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
не знаю как в PE
но элемент таблицы символов ELF файла может содержать размер символа (функции) при обычных настройках компилятора/компоновщика эта информация генерируется в процессе работы программы ее можно получить кроме того, почему нельзя сделать так -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Кстати, ты наверное компилировал в debug? Попробуй в release. Ещё можно так:
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
W4FhLF,
забыл учесть размер leave (или ручного аналога) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
MAKCim, в моём случае его небыло.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
nadge |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
Ну, в вышеприведенном BO2k как-то же сделали?
И так и так, хотя release не особо тщательно проверял. Перепроверю.
Кстати, хороший вариант. Только в моем случае довольно неудобный, т.к. функций таких будет штук 30, если не больше. |
||||||
|
|||||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Знаю только, что VS _обычно_ не меняет порядок, но даже если порядок не меняется между процедурами может идти мусор, так что этот способ не рулит.
Но разве удобней пихать туеву кучу пустышек вместо этого? Note: Зачем нужна "angy_StartOfHappyCode"? Можно сразу брать &HappyCode. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
nadge |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
Предполагалось написать примерно так:
Т.е. весь код должен быть вместе, а не каждая ф-ция по-отдельности. В таком случае пустышки весьма удобны хотя бы для наглядности. |
||||
|
|||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
Какова задача в общем?
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: нет Всего: 207 |
хочешь сказать, что ret был сгенерирован до твоего кода? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
nadge |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
Создать (относительно большой) базонезависимый код для запуска его в адресном пр-ве другого процесса, куда его сперва нужно будет скопировать. С деталями написания самого кода более-менее разобрался, а вот такая, как мне казалось, простая функция, как его копирование не получается. |
|||
|
||||
W4FhLF |
|
||||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: нет Всего: 121 |
может я что-то не так понял?
Пользуйся лучше способом с поиском сигнатуры, это самый оптимальный вариант, имхо. Вообще, всё зависит от твоей реализации базонезависимого кода, ибо там тонкостей достаточно много. Если ты решил ещё и вызовы процедур делать в нём(своих же), то всё усложняется, тут конечно было бы идеально, если бы ты в том процессе расположил процедуры именно так(относительно друг друга), как они расположены в твоём процессе, ибо иначе придётся тебе править операнды вручную. -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
||||
|
|||||
nadge |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
Мой вариант (с расположением функций в той последовательности, что в исходнике) хорош в первую очередь своей простотой. Базонезависимый код будет большой, по этому не хочется ни на что отвлекаться (например, на предложенные сигнатуры), чтобы не собирать потом ошибки. К тому же последовательное расположение ф-ций сильно упростит из взаимный вызов (который там очень важен, хотя и решается созданием массива с адресами ф-ций и глобальных переменных).
Самое интересное другое - ведь получается же такая штука в приведенном мною примере с back orifice 2k. Там тот же VC++ используется. Опции компилятора изучал, переносил в свою программу - не помогло. Это сообщение отредактировал(а) nadge - 3.1.2008, 22:05 |
|||
|
||||
dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: нет Всего: 158 |
||||
|
||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
Не только. А если это не cdecl функция? ![]() Added: точнее, если stdcall, по крайней мере. Просто у функции нет параметров ![]() Добавлено @ 00:40 Угу. Да и большинство компилеров. Но (!) в дебаге будет сгенерена табличка стабов вида jmp <функция> - они и будут вызываться кругом. Нафига это не помню - но где-то когда-то читал разъяснение. И плох сомнительностью своей работы ![]() ![]() Это сообщение отредактировал(а) Любитель - 4.1.2008, 01:15 |
|||
|
||||
nadge |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 12.11.2004 Репутация: нет Всего: 1 |
Про нестабильность - это точно. После экспериментального выставления всевозможных опций компилятора и линкера по методу научного тыка, кажись все заработало ![]() Пока не могу сказать, что проблема решена - надо еще потестировать. Но вроде все ОК.
Всмысле, собрать как релиз? Само по себе это не помогло. Хотя щас все так собираю, для отладки пользуюсь софтайсом. |
||||
|
|||||
Любитель |
|
|||
Программист-романтик ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005 Где: Воронеж Репутация: 7 Всего: 92 |
И не должно... Просто с дебагом по идее вообще не прокатит, из-за этих стабов для функций. |
|||
|
||||
_n0 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 12.2.2008 Репутация: нет Всего: нет |
Актуально сейчас или нет, но изложу ещё один вариант. Он будет несколько корректнее в плане того, чтобы перенести весь необходимый код.
Целевые функции стоит выделить в отдельную секцию (используя #pragma code_seg либо #pragma section). Чтобы это счатье выдрать - чуть больше работы нужно будет, чем в уже приводившихся способах, зато надёжней. Просто напросто нужно пробежаться по PE-заголовку образа в памяти и получить адрес и размер секции. Её и копируем в нужный процесс. Относительное расположение в ней элементов можно найти разностью адреса функции в нашем процессе и уже вычисленного адреса секции. |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |