2010-02-07 106 views
11

什麼是學習逆向工程的好地方,特別是適用於Mac OS X的?兩個應用程序,我在這個問題方面的佩服:入門反向工程OS X?

超空間 - http://thecocoabots.com/hyperspaces/

軌道 - http://www.steventroughtonsmith.com/orbit/

謝謝你們。

+4

OS X的哪些部分?這是一個巨大的野獸,許多部分是開源的,所以不需要逆向工程。更具體一點,你可能會得到一些答案。 – 2010-02-07 01:10:42

+3

對一個重要的軟件進行反向工程是一個大*和*難*的問題。黑盒逆向工程更糟。如果你不得不問,你可能會發現這項任務相當艱鉅...... – dmckee 2010-02-07 01:11:40

+0

@安德魯麥格雷戈 - 好吧,主要是沒有記錄的東西,像修改空間或交換主屏幕,因爲我已經鏈接到兩個應用程序。 – chrisgoyal 2010-02-07 01:17:57

回答

4

使用class-dump-x/-z獲取OS X/iPhone OS系統框架的私有Objective-C頭文件。有很多類/方法隱藏在公衆面前(某些情況是如此)

17

你應該獲得一份Mac OS X Internals的副本,這是一本關於蘋果公司沒有告訴你的一切的好書。不僅如此,如果您對逆向工程感興趣,它也將使您成爲一個更好的OS X程序員。

+0

MacOSX內核不能幫助您編程任務。在任務明顯是GUI的地方,這並沒有幫助。我對這本書感到非常失望 - 好的內核驅動程序作者可能會喜歡它。 – Lothar 2010-02-07 08:06:21

+0

這本書不是關於可可編程的。但是,在我看來,如果您也瞭解GUI所在的非GUI層,您將創建更好的軟件。 – 2010-02-07 14:35:01

+1

OS X內幕是一本像Windows內部一樣的書,講述了系統的內涵。它不會教你編碼,但如果你正在翻譯,它會幫助你理解代碼的功能。很容易理解他的推薦。 – 2010-02-10 20:44:18

4

蘋果公司作爲開源發佈了大量的OS X基礎。 See here

此外,F-Script Anywhere將幫助解剖Finder和/或任何其他封閉源應用程序。

+0

F腳本應該是我的答案。它真的讓你進入應用程序。當然,這隻適用於Mac。 – TechZen 2010-02-09 20:26:34

3

對於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/

+0

請注意,MobileSubstrate也可以在Mac上使用,也可以查看SIMBL! – 2010-02-15 05:15:59

1

其他人已經提到了class-dump,它是從編譯的可執行文件中檢索類定義的極好工具。在相關說明中,您還應該看看otx,它提供了非常好的(可讀的)反彙編輸出。

如果您需要快速測試代碼片段的方法,請使用F-Script(由其他人提到),NuMacRuby。其中,我主要使用Nu。它可以動態定義橋接函數,並且可以處理指針,如果需要調用任意C函數,這兩種指針都非常方便。

既然您提到空間和其他屏幕管理器有趣,您還應該閱讀A brief tutorial on reverse engineering OS X。這是Rich Wareham(前Spaces多桌面應用程序的作者:「桌面管理器」)的一篇舊文章,內容涉及他如何針對少數私有CoreGraphics方法計算出調用語法,以便完成漂亮的桌面過渡。 source code for Desktop Manager也可用,這可能對你有用。

1

這個網站展示瞭如何修補現有目標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複製)

+0

這並不能說明如何修補程序。就像,你必須已經修補了程序,以便在它內部構成。此外,課堂冒充已被棄用,並且在64位運行時間afaik中不起作用。 – Chuck 2010-02-15 20:48:32

+0

修補部分在鏈接中解釋爲製作SIMBL插件。 沒有意識到它被折舊,所以這裏是關於poseAsClass替代品的SO鏈接:http://stackoverflow.com/questions/1289757/alternative-to-poseasclass-in-mac-os-x-10-5-和更高 – Robert 2010-02-15 21:39:17

1

作爲對方的補充答案,你將要檢查出DYLD_INSERT_LIBRARIES注入你的代碼到Cocoa程序中。

1

您絕對應該考慮使用DTrace。有關使用DTrace在OS X上進行反向工程的優秀BlackHat演示文稿,名爲「DTRACE:反向工程師的意外瑞士軍刀」。

您可以獲得一份副本並查看視頻演示文稿here

www.uninformed.org上還有一些關於反向工程OS X的優秀論文。