вторник, мая 23, 2006

Третий путь ведет к просветлению...

Ага, я порадовался, конечно, что надыбал набор COM-объектов (и документацию достал!), котороые очень удобно использовать в .NET, достаточно только поутюжить dll-ку tlbimp-ом.

Только вот маленькая незадача: TlbImp не всегда корректно распознает типы. Т.е., если в COM-овской библиотеке типов был в качестве параметра unsigned char* (т.е., как правило, С-шный массив), то наивная утилита его представит как ref byte, а не как byte[]. Что, в общем-то, логично. Информацию о том, что сие есть, ей взять неоткуда. Или, скажем, вместо всенародно любимого винапишного HANDLE (который суть void* и которому в .NET соответстует IntPtr) везде оказался int.

Проблема №2: как известно, все COM-объекты реализуют интерфейс IUnknown. А посему стандартной является ситуация, при которой во все методы передается как раз IUnknown, а там представляемый им объект проверяется на прочие интерфейсы. Я вот лично считаю, что сие в общем случае есть антипаттерн. Ибо: 1) ликвидирует остатки типобезопасности; 2) код ни хрена не самодокументируемый (блин, я вот догадался, что IUnknown* pDibImage - это IDibImage pDibImage; а вот tlbimp - нет); 3) снижает расширяемость кода.

Но вернемся к нашим баранамобъектам. Как уж сказано, TlbImp не одарен ИИ (что вы хотите от утилиты весом 56K?) и венгерскую нотацию читать не умеет (я вот тоже не силен). Посему он тупо поставил в соответствие всем IUnknown* по Object'у и немедленно выпил сказал, что преобразование закончено. Меня эта ситуация не устроила, бо я уже воевал с подобными обертками и больше как-то не хочется.

Короче, задача звучит так: прикрутить либы к программе.

Варианты: 1) использовать "как есть". Отметен, как отстойный. Во-первых, придется постоянно делать приведение типов от Object к реальным типам объектов. А это суть кака. Во-вторых, если все методы, работающие, скажем, с хендлом окна будут требовать int, то я задолбаюсь писать MyWin.Handle.ToInt32(). И, что самое существенное, мне не хочется даже думать о том, как передать byte[] вместо ref byte. Скорее всего, это требует грязных извратов.

2) Написать обертку самому. Десяток классов (методов по 20), плюс реализуемые ими интерфейсы, которые, кажись, тоже придется описывать... Извиняйте, ломает.

3) Путь воина. ОтILDASMить сборку, поправить нужные места, сассемблировать ILASM'ом. Вот оно!!! Править нужно далеко не все, причем, в связи с регулярной структурой сборки, можно все это автоматизировать.

Попробовал. Понравилось. Особенно грело душу, когда после компиляции тестовая прога продолжала работать правильно. А ObjectBrowser в Студии показывал результаты моих трудов =)

Восторг - непередаваемый! Видно, что не совсем ишо тупой. Мелочь, а приятно...

Теперь осталось сочинить прожку, которая будет делать такую конверсию автоматически, на основании имен в венгерской записи. Должна же быть от этого израта хоть какая-то польза!! Главное - не забить ;)

З.Ы.: Все-таки я не хакер. Меня не заставишь лезть куда-то на нижний уровень, пока не припрет производственная необходимость. :)))

 

воскресенье, мая 21, 2006

В Шаолинь, животное!!!!

Я вот не знаю занятия, более воспитывающего силу воли и помогающего осознать глубинную сущность программирования, чем reverse-engineering.

Берем библиотечку объемом ~30-40 метров. Загружаем IDA. Медитируем...

До полного просветления/схождения с ума (обычно это равноценные понятия)

 

суббота, мая 20, 2006

Учите матчасть, бойцы!..

Блин, месяца два мы воевали, завертывая одну библиотечку (вернее, набор оных) до вида, более-менее удобного для использования (и просто удобного, и приемлемого в .NET-е). Ухху...

Сегодня попробовал обработать ее tlbimp-ом, о котором совсем недавно прочел (кто не знает - это утилитка из .NET SDK, которая по библиотеке типов COM создает сборку .NET). Обработал. Посмотрел ей внутре. Возматерился.

Ибо половину работы это с нас бы сняло. Там почти все (как я и предполагал) оформлено COM-объектами. Которые вполне приживаются в .NET.

Единственный минус - что эти объекты документированы еще хуже чем в скрывающей их библиотеке. Ибо в документации к той хотя бы по 4 строчки к каждой функции (из сотни) написано. А к объектам - вообще ничего.



Но все равно - инструментарий надо знать!!!