Начинающий, перепроектируя OS X?

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

Гиперпробелы – http://thecocoabots.com/hyperspaces/

и

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

Спасибо парни.

11
задан chrisgoyal 7 February 2010 в 01:05
поделиться

8 ответов

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

4
ответ дан 3 December 2019 в 02:30
поделиться

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

17
ответ дан 3 December 2019 в 02:30
поделиться

Для 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/

3
ответ дан 3 December 2019 в 02:30
поделиться

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

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

4
ответ дан 3 December 2019 в 02:30
поделиться

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

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

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

1
ответ дан 3 December 2019 в 02:30
поделиться

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

1
ответ дан 3 December 2019 в 02:30
поделиться

Делегат работает в будущем. Я думаю, что переменная temp, вероятно, лучший способ обработки «запустить код сейчас, а не в будущем». Однако, я думаю, вы можете написать функцию Bind (), которая связывает текущее значение с делегатом..

Action Bind<T>(Func<T> f, T value) { 
    return (Action)(() => f(value));
}
undoStack.Push(Bind(this.setCashOnHand, this.cashOnHand));
-121--3383522-

Я еще не уверен, как перевести его в C # (я работаю над ним)

Это версия Haskell

minAndMax :: Ord a => [a] -> (a,a)
minAndMax [x]    = (x,x)
minAndMax (x:xs) = (min a x, max b x)
                   where (a,b) = minAndMax xs

Версия C # должна включать Агрегат , как (я думаю).

-121--1422460-

На этом сайте показано, как исправить существующую программу цели C: http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering

А именно, позиционирование:

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

и swizzling метода:

 /**
 * 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
ответ дан 3 December 2019 в 02:30
поделиться

Вам определенно следует рассмотреть возможность использования DTrace. Есть отличная презентация BlackHat об использовании DTrace для реверс-инжиниринга в OS X под названием «DTRACE: The Reverse Engineer's Unexpected Swiss Army Knife».

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

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

1
ответ дан 3 December 2019 в 02:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: