Начинаем реверс-инжиниринг OS X? - PullRequest
11 голосов
/ 07 февраля 2010

Что такое хорошее место для изучения реверс-инжиниринга, особенно в том, что касается Mac OS X? Два приложения, которыми я восхищаюсь с точки зрения этой темы:

Гиперпространства - http://thecocoabots.com/hyperspaces/

и

Орбита - http://www.steventroughtonsmith.com/orbit/

Спасибо, ребята.

Ответы [ 8 ]

17 голосов
/ 07 февраля 2010

Вы должны взять копию Mac OS X Internals , которая является удивительной книгой обо всем, что Apple не сообщает вам. Это не только замечательно, если вы интересуетесь реверс-инжинирингом, но и сделает вас лучшим программистом OS X в целом.

4 голосов
/ 09 февраля 2010

Используйте class-dump-x / -z , чтобы получить частные заголовки Objective C для системных платформ OS X / iPhone OS. Есть много классов / методов, скрытых от общественности (некоторые справедливо)

4 голосов
/ 07 февраля 2010

Apple выпускает тонну основы OS X как открытый исходный код. См. Здесь .

Кроме того, F-Script Anywhere поможет в разборе Finder и / или любого другого приложения с закрытым исходным кодом.

3 голосов
/ 10 февраля 2010

В частности, для iPhoneOS class-dump-z - отличный способ вывести заголовки. Единственная проблема, конечно, в том, что вы не можете видеть, что происходит внутри каждого метода. IDA Pro и несколько скриптов позволяют увидеть инструкции по сборке для этих системных платформ. (пример изображения: http://grab.by/1Vn6).

Наиболее удобными сценариями IDC являются fixobjc2 и dyldinfo. Вы можете найти каждую из этих ссылок в этом блоге: http://networkpx.blogspot.com/2010/01/two-ida-pro-5x-scripts-for-iphoneos.html

Но что хорошего в этой информации, если вы не можете ее использовать? Разработчик iPhone saurik написал нечто под названием MobileSubstrate, которое позволяет подключаться к любому методу. http://svn.saurik.com/repos/menes/trunk/mobilesubstrate/

1 голос
/ 21 февраля 2010

Вам определенно следует рассмотреть возможность использования DTrace. Существует отличная презентация BlackHat об использовании DTrace для реверс-инжиниринга на OS X под названием «DTRACE: неожиданный швейцарский армейский нож реверс-инженера».

Вы можете получить копию и просмотреть видео презентацию здесь .

На сайте www.uninformed.org также есть несколько отличных работ по реинжинирингу OS X.

1 голос
/ 16 февраля 2010

В дополнение к другим ответам вы захотите проверить DYLD_INSERT_LIBRARIES, чтобы добавить свой код в программу Какао.

1 голос
/ 15 февраля 2010

Этот сайт показывает, как исправить существующую программу Objective C: http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering

А именно позирует:

[[B class] poseAsClass:[A class]];

и метод метания:

 /**
 * Renames the selector for a given method.
 * Searches for a method with _oldSelector and reassigned _newSelector to that
 * implementation.
 * @return NO on an error and the methods were not swizzled
 */
BOOL DTRenameSelector(Class _class, SEL _oldSelector, SEL _newSelector)
{
        Method method = nil;

        // First, look for the methods
        method = class_getInstanceMethod(_class, _oldSelector);
        if (method == nil)
                return NO;

        method->method_name = _newSelector;
        return YES;
}

// *** Example ***


// never implemented, just here to silence a compiler warning
@interface WebInternalImage (PHWebInternalImageSwizzle)
- (void) _webkit_scheduleFrame;
@end

@implementation WebInternalImage (PHWebInternalImage)

+ (void) initialize
{
        DTRenameSelector([self class], @selector(scheduleFrame), @selector (_webkit_scheduleFrame));
        DTRenameSelector([self class], @selector(_ph_scheduleFrame), @selector(scheduleFrame));
}

- (void) _ph_scheduleFrame
{
        // do something crazy...
        ...
        // call the "super" method - this method doesn't exist until runtime
        [self _webkit_scheduleFrame];
}

@end

(код скопирован с http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering)

1 голос
/ 15 февраля 2010

Другие уже упоминали о дампе класса, который является отличным инструментом для извлечения определений классов из скомпилированного исполняемого файла. В соответствующей заметке вы также должны взглянуть на otx , который обеспечивает очень хороший (читаемый), разобранный вывод.

Если вам нужен способ быстрого тестирования фрагментов кода, используйте F-Script (упомянутый другими), Nu или MacRuby . Из них я в основном использовал Nu. Он имеет возможность определять мостовые функции на лету и может обрабатывать указатели, которые очень удобны, если вам нужно вызывать произвольные функции языка Си.

Поскольку вы упомянули, что интересны в Spaces и других менеджерах экрана, вам также следует прочитать Краткое руководство по реинжинирингу OS X . Это старая статья Rich Wareham (автора приложения для нескольких рабочих столов pre-Spaces: «Desktop Manager») о том, как он выяснил синтаксис вызова для нескольких частных методов CoreGraphics, чтобы сделать приятные переходы на рабочем столе. Также доступен исходный код для Desktop Manager , который может быть вам полезен.

...