djalex777 писал(а):Нужно, чтобы в самом исполняемом файле код метода DoIt отсутствовал, а подгружался в определенный момент. И затем уже при вызове метода, исполнялся. Причем, сам код метода надо чтобы в исходном файле существовал, а уже после компиляции брался из определенного места (файла и т.п.) и в скомпилированном файле отсутствовал.
Под подгружаемый код нужно выделить память.
Для этого нужно знать, сколько именно памяти выделять. Можно либо смотреть на размер самого файлика (если кроме кода там ничего нет), либо хранить в файле не только код, но и служебную информацию, и в рамках этой информации хранить размер непосредственно кода..... Контрольная сумма и т.д.
Ты хочешь подгружать из файла в АП процесса некий код, причём так, чтобы он был способен выполняться после этого, но ты не хочешь использовать DLL, которая как раз и создавалась для решения этой задачи.
djalex777 писал(а):Xakep, ты будешь удивлен, но мне "вдомёк" большая часть того, что ты написал.
djalex777 писал(а):Не совсем так. Не какой-то там некий код, а именно код, который уже был скомпилирован вместе с исполняемым файлом. Думается мне, что в таком случае все зависимости и прочее, должны быть в нём учтены уже автоматически. Или это не так?
Есть проблема с самим кодом - если его брать из exe напрямую, а затем попробовать его выполнить через подмену указателя в VMT на область памяти с кодом (HeapAlloc), то возникают различные ошибки.
Совершенно не так. То что находится в PE(exe) файле, и то что окажется в адресном пространстве процесса, после того, как загрузчик эти данные отобразит в память - вещи совершенно разные. Загрузчик не просто берет и как есть отображает эти данные в память, а делает еще массу операций, в т.ч. пересчитывает адреса смещения и т.д. Обо всем этом как раз и пишет Хакер описывая концептуальные проблемы. Тот же рантайм может быть загружен по разным адресам и такая проблема разрешается загрузчиком в процессе отображения файла в АП процесса.djalex777 писал(а):Не совсем так. Не какой-то там некий код, а именно код, который уже был скомпилирован вместе с исполняемым файлом. Думается мне, что в таком случае все зависимости и прочее, должны быть в нём учтены уже автоматически. Или это не так?
ger_kar писал(а):Тот же рантайм может быть загружен по разным адресам и такая проблема разрешается загрузчиком в процессе отображения файла в АП процесса.
Ну это если на тоже самое место, а не абы куда. А судя по первому посту, автор его пытается загрузить как раз "как получится".Хакер писал(а):Ну положение рантайма тут особой роли не играет. Вырезанный из тела оригинального исполняемого файла фрагментик будет ссылаться либо на ячейки IAT (абсолютная адресация, требущая коррекции, если образ, подвергаемый патчингу, является перемещаемым и был перемещён), либо на jmp-thunk'и (относительная адресация, требующая коррекции всегда, кроме случая, когда код записывается туда же, откуда был изначально вырезан).
ger_kar писал(а):Ну это если на тоже самое место, а не абы куда. А судя по первому посту, автор его пытается загрузить как раз "как получится".
The trick писал(а):Сначала компилируешь файл как обычно с отладочными символами и с секцией релокаций.
Находишь с помощью отладчика код метода и сохраняешь эти данные в файл, а также сохраняешь информацию о настройках адресов для данного куска кода.
Хакер писал(а):Если компиляция (как совокупный процесс, в результате которого получается конечный исполняемый файл) требует ручного вмешательства, это не компиляция, а онанизм.
Если уж вырезать куски, то надо работать с obj-файлами, а не придумывать двухпроходную компиляцию с применением отладочных символов.
Тогда надо писать не на VB. Я бы на PowerBasic слабал так как перенести работающий код из класса VB6 в PowerBasic достаточно просто, так как придется его адаптировать, а не писать заново.The trick писал(а):Хотя если метод написан так чтобы не иметь никаких внешних обращений, т.е. базонезависимый то можно и без настройки адресов.
The trick писал(а):Хотя если метод написан так чтобы не иметь никаких внешних обращений, т.е. базонезависимый то можно и без настройки адресов.
Хакер писал(а):Это невозможно, потому что даже пустой метод будет иметь пролог/эпилог, устанавливающий/снимающий SEH-хендлер и для этой цели обращающийся к jmp-thunk-у импорта __vbaExceptHandler.
ger_kar писал(а):Тогда надо писать не на VB. Я бы на PowerBasic слабал так как перенести работающий код из класса VB6 в PowerBasic достаточно просто, так как придется его адаптировать, а не писать заново.
The trick писал(а):Сначала компилируешь файл как обычно с отладочными символами и с секцией релокаций.
Находишь с помощью отладчика код метода и сохраняешь эти данные в файл, а также сохраняешь информацию о настройках адресов для данного куска кода.
Потом компилируешь файл с кодом, который вместо метода содержит код загрузки данных с сервера и который настраивает релокации и запускаешь новый код используя вызов по указателю.
ger_kar писал(а):Кстати про защиту. Если канал позволяет, то гораздо проще не городить огород, а вынести часть функций на сам сервер и с сервера не код подгружать, а создавать объект на сервере, ему передавать нужные данные и получать результат. Тогда точно не взломают.
Хакер писал(а):Но, к слову, я не знаю, подействует ли это на тебя, но подобная защита это полная шляпа. Ломается за 10 секунд: к «купленной» подключается отладчик, делается дамп пропатченного образа и выгружается в новый EXE-файл — получаем вылеченную копию.
djalex777 писал(а):Кроме настройки адресов, видимо из-за этого и проблема. Можно подробней про это.
djalex777 писал(а):По-поводу дампа, естественно это первое что приходит на ум, но не всё так просто, есть ряд проверок. В целом - да, сломать естественно можно, но нужно время, желание и уровень выше среднего.
djalex777 писал(а):Вот! Именно так я и делаю. Кроме настройки адресов, видимо из-за этого и проблема. Можно подробней про это.
Хакер писал(а):Почему бы не писать код просто туда, откуда он был вырезан?
Хакер писал(а):Как может не хватить, если фрагмент изначально ивырезанвзят из бинарника?
The trick писал(а):Ну я как-бы предложил туда записать код загрузки с сервера и скомпилировать еще раз. Тот фрагмент уже не существует в коде на момент компиляции кода с загрузкой.
Хакер писал(а):Это абсолютно не рабочий подход, потому что вырезаемый фрагмент должен соответствовать бинарнику, из которого он вырезается, как ключ к замку. Иначе имеющиеся в вырезаемом фрагменте отсылки к процедурам, импортируемым сущностям и переменным в секции данных перестанут быть валидными.
The trick писал(а):Главное условие - чтобы никакие члены класса и другие функции которые могут быть вызваны из метода не изменялись.
Хакер писал(а):При второй компиляции все адреса внутри образа сдвинутся. Так что, как я написал в первом своём посте — под каждый билд исполняемого файла, под каждую жалкую единожды скомпилированную версию на сервере придётся хранить свой фрагментик.
The trick писал(а):Главное условие - чтобы никакие члены класса и другие функции которые могут быть вызваны из метода не изменялись.
The trick писал(а):Это да, ну я так понял автору это не важно.
Слушай... Как при этом ты можешь давать компетентную оценку тому, что всё не так просто и что нужен уровень выше среднего?
ты не можешь сделать элементарную вещь — подгрузить из стороннего источника кода метода и сделать так, чтобы метод выполнился.
The trick писал(а):Хватит ли места? Мы здесь гадаем конечно, я так понял как-будто оп хочет загружать каждый метод только по требованию.
Сейчас этот форум просматривают: Yandex-бот и гости: 52