Что хорошее место состоит в том, чтобы изучить инженерный анализ, конкретно поскольку это относится к Mac OS X? Два приложения, которыми я восхищаюсь с точки зрения этого предмета:
Гиперпробелы – http://thecocoabots.com/hyperspaces/
и
Орбита – http://www.steventroughtonsmith.com/orbit/
Спасибо парни.
Используйте class-dump-x / -z , чтобы получить частные заголовки Objective-C для OS X / Системные рамки iPhone OS. Существует множество классов / методов, скрытых от общественности (некоторые справедливо)
Вам следует взять копию Mac OS X Internals , замечательной книги обо всем, о чем Apple не сообщает вам. Это не только здорово, если вы интересуетесь реверс-инжинирингом, но и в целом сделает вас лучшим программистом для OS X.
Для 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/
Apple выпускает тонну основы OS X с открытым исходным кодом. Смотрите здесь .
Кроме того, F-Script Anywhere поможет тонне препарировать Finder и/или любое другое приложение с закрытым исходным кодом.
Другие уже упоминали дамп класса, который является отличным инструментом для получения определений классов из скомпилированного исполняемого файла. В связи с этим вам также следует взглянуть на otx , который обеспечивает очень хороший (читаемый), разобранный вывод.
Если вам нужен способ быстрого тестирования фрагментов кода, используйте F-Script (упомянутый другими), Nu или MacRuby . Из них я в основном использовал Nu. Он имеет возможность определять мостовые функции на лету и может обрабатывать указатели, которые очень удобны, если вам нужно вызвать произвольные функции C.
Поскольку вы упомянули, что вас интересуют Spaces и другие менеджеры экрана, вам также следует прочитать Краткое руководство по обратному проектированию OS X . Это старая статья Рича Уэрхэма (автора многопользовательского приложения до Spaces: «Desktop Manager») о том, как он вычислил синтаксис вызова для нескольких частных методов CoreGraphics, чтобы выполнять приятные переходы между рабочими столами. Также доступен исходный код для Desktop Manager , который может быть вам полезен.
В качестве дополнения к другим ответам вы захотите проверить DYLD_INSERT_LIBRARIES
, чтобы внедрить свой код в программу Какао.
Делегат работает в будущем. Я думаю, что переменная 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 # должна включать Агрегат
, как (я думаю).
На этом сайте показано, как исправить существующую программу цели 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 )
Вам определенно следует рассмотреть возможность использования DTrace. Есть отличная презентация BlackHat об использовании DTrace для реверс-инжиниринга в OS X под названием «DTRACE: The Reverse Engineer's Unexpected Swiss Army Knife».
Вы можете получить копию и просмотреть видеопрезентацию здесь .
На сайте www.uninformed.org есть также отличные статьи по обратному проектированию OS X.