(no subject)

Jan 09, 2007 12:47

Думал над одной задачей для диссера - хотел в числе прочего приделать поддержку АОП к дельфи. Для этого сначала начал переписывать TObject - у него есть внутри virtual method table и COM-интерфейс предусмотрен... Но оказалось, что подменить или исправить vmt TObject'а динамически нельзя. Вернее можно, но только тому, кто делал Дельфи...
Чрезвычайно обидно...
Потом я решил подменить реализацию MethodAddress() - он у меня возвращал не адрес метода, а адрес находившийся в теле большой и страшной процедуры TheGreatePeaceOfCode, написанной на ассемблере. Каждому методу vmt в этой процедуре соответствует свой кусок кода, который, собственно может реализовать аспект BeforeCall для этого метода и завершается это все jmp'ом на точку входа реального MethoAddress()... К сожалению, jmp - безусловный, т.к. в стеке могут лежать какие-то важные параметры...
Однако выяснилось, что скомпилированному проекту в большинстве случаев плевать на то, что возвращает MethodAddress()...
От всего этого дела захотелось внедрить АОП в design time'e, но там довольно сложно в бинарнике разобраться... Эти bpl - очень сделаны так, чтобы никто туда не лез, а исходников, разумеется не предоставлено. И вся эта дрянь ни разу не документирована :(

UPD: Все-таки кажется нашел одну лазейку для написания нормального самомодифицирующегося кода... Скоро опробую...

ds, computer science

Previous post Next post
Up