?

Log in

No account? Create an account

December 21st, 2009 - Excelsior — LiveJournal

Dec. 21st, 2009

11:39 pm - Не угадал

Дано: массив байт, представляющий собой IL.

Требуется: поднять из этого массива информацию об операциях, после чего слегка перетусовать их с целью упрощения анализа IL-а на предмет декомпиляции, а именно - все сложно-условные бранчи (например, beq) заменить на компаре (ceq) + простой условный бранч (brtrue).

Имеется: http://xenogears.googlecode.com/svn/trunk/XenoGears/Reflection/Parse/, который умеет парсить массив байт как иммутабельную коллекцию иммутабельных IILOp.

Вместо того, чтобы почесать репу и сделать мутабельную коллекцию операций, я решил типо не трогать то, что работало раньше, и поступить умнее. Идея была в том, чтобы написать некий реврайтер, который позволит сгенерить новый метод по старому + в процессе генерации дописать нужные операции, после чего пропарсить новосгенеренный метод и получить требуемую коллекцию IILOp.

В итоге: два дня убито на написание реврайтера и на хаки с оффсетами бранчей, чтобы все работало когда: 1) бранчи были, но пропали, 2) бранчи были и в исходном виде вошли в новый метод, 3) в процессе реврайтинга мы эмиттим свеженькие бранчи. А по факту получилась омерзительная нямочка, которой пользоваться можно, но не нужно (откопалась пачка граблей с идеей реврайтинга как такового - детали рассказывать не буду ибо тошно).

Выводы: 1) при выборе из нескольких равноценных вариантов надо хорошо подумать, 2) если хорошо не подумать, то может не повезти.

Previous day (Calendar) Next day