Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #66, МАЙ 2006 г.

недетское вскрытие .NET

N|M{INT3 TEAM}{NIM@INT3.RU}

Спецвыпуск: Хакер, номер #066, стр. 066-044-6


Во-первых, нужно удалить интерфейс С1.win.U из списка наследуемых интерфейсов. Находим класс [.]class*C1TrueDBGrid и видим строку implements C1.Win.U. Она должна выглядеть так: implements /*C1.Win.U,*/ .

Немного ниже есть и атрибут: .custom instance void [System]System.ComponentModel.LicenseProviderAttribute. Его тоже комментируем. Теперь находим метод GetCallingAssembly(), который находится в строках 74511*74521.

Наконец-то мы избавились от всего кода, использующего классы пространства имен C1.Win, и теперь их можно подвергнуть благополучному удалению. Находим начало C1.Win [.]Namespace*C1.Win и, начиная со строки 144314 до строки 156166, комментируем этот код. Целых 11 тысяч строк IL-кода :), причем это еще не все. В листинге все классы и пространства имен существуют в коротком формате — тут представлен своего рода каталог, который описывает структуру сборки, и классы в нем пустые. Указывается только название класса и его атрибуты, такие как базовый класс, список интерфейсов, которые он обязуется реализовывать. Так что здесь мы должны также продублировать изменения. Закомментируем интерфейс C1.Win.U у класса C1TrueDBGrid в строке 606. Закомментируем и 19 классов в строках 1408*1499.

Теперь уделим внимание ненужным ресурсам. Их использовали trial’ные формы, которых теперь нет. Соответственно, из IL-листинга нужно удалить и сами ресурсы. Описание ресурсов начинается со строки 102. Необходимо закомментировать ресурсы: C1.Win.LicensingForm.resources, C1.Win.BetaAboutForm.resources, C1.Win.AboutForm.resources.

Теперь возвращаем наши исправления в конструкторе класса C1TrueDBGrid (они были проделаны в начале статьи, но потом мы отменили их). Компилируем, запускаем и видим, что все работает прекрасно. Теперь скомпилируем еще раз, но без флага /debug. В итоге размер файла составил 784 Кб, а размер оригинала — 888 Кб. Своими манипуляциями мы сэкономили 104 килобайта. Думаю, 15 минут работы стоили того. Однако нужно отметить еще один момент.

[если .NET-компоненты используют] другие сборки, то может быть задействована круговая ссылка зависимости, то есть в Reference сборки 1 будет ссылка на сборку 2, а в Reference сборки 2 — ссылка на сборку 1. При таком раскладе модификация любой из сборок приведет к ошибке загрузки сборки. Получается, что нужно убирать информацию о версиях и публичных ключах этих сборок. Вот пример ссылки на другую сборку:

.assembly extern System.Windows.Forms

{

.publickeytoken = (B7 7A 5C 56 19 34 E0 89 )

.ver 1:0:3300:0

}

Она должна выглядеть так:

.assembly extern System.Windows.Forms

{

}

Нас настигнет та же самая проблема, если мы изменяем сборку, от которой зависит несколько других сборок. Придется сделать исправление во всех сборках.

[в заключение] Некоторые личности, чтобы использовать взломанные компоненты, упаковывают/шифруют сборки и хранят их либо во внешнем файле, либо в ресурсах, а при запуске программы расшифровывают и запускают динамически. Простой пример тому вынесен на врезку. В общем, побольше тебе красивых алгоритмов и удачи. Пей Фанту, будь Бамбучо

Назад на стр. 066-044-5  Содержание