2010-02-07 24 views
11

¿Cuál es un buen lugar para aprender ingeniería inversa, específicamente como se aplica a Mac OS X? Dos aplicaciones que admiro en cuanto a este tema:Introducción ingeniería inversa OS X?

Hyperspaces - http://thecocoabots.com/hyperspaces/

y

Orbit - http://www.steventroughtonsmith.com/orbit/

Gracias chicos.

+4

qué partes de OS X? Es una gran bestia, muchas partes son de código abierto, por lo que no necesitan ingeniería inversa. Sea más específico y podría obtener algunas respuestas. –

+3

Ingeniería inversa Una pieza importante de software es un problema * * * y * difícil *. La ingeniería inversa de caja negra es peor. Si tiene que preguntar, puede encontrar la tarea bastante desalentadora ... – dmckee

+0

@Andrew McGregor - Bueno, la mayoría de las cosas no documentadas, como modificar los espacios o cambiar las pantallas de inicio como he vinculado en las dos aplicaciones. – chrisgoyal

Respuesta

4

Utilice class-dump-x/-z para obtener los encabezados Objective-C privados para los marcos del sistema OS X/iPhone OS. Hay muchas clases/métodos ocultos al público (algunos con razón)

17

Debe obtener una copia de Mac OS X Internals que es un libro impresionante sobre todo lo que Apple no le dice. Esto no solo es genial si le interesa la ingeniería inversa, sino que también lo hará un mejor programador OS X en general.

+0

MacOSX Internals no lo ayuda con las tareas de programación. No ayudará aquí donde la tarea es obviamente la GUI. Estoy bastante decepcionado con este libro: a los escritores de kernel les puede gustar. – Lothar

+0

El libro no trata sobre la programación de Cocoa de hecho. Sin embargo, en mi opinión, creará un mejor software si también comprende las capas no gui en las que vive su GUI. –

+1

OS X internals es un libro, como el interno de Windows, que habla sobre las entrañas del sistema. No le enseñará la codificación, pero si está invirtiendo, lo ayudará a comprender cómo funciona el código. Muy simple de entender su recomendación. –

4

Apple libera una tonelada de la base de OS X como código abierto. See here.

Además, F-Script Anywhere ayudará mucho con la disección del Buscador y/o cualquier otra aplicación de código cerrado.

+0

F-Script habría sido mi respuesta. Realmente te permite ingresar aplicaciones. Por supuesto, eso solo funcionará en la Mac. – TechZen

3

Para iPhoneOS específicamente, class-dump-z es una gran manera de volcar los encabezados. El único problema, por supuesto, es que no se puede ver realmente lo que sucede dentro de cada método. IDA Pro y algunas secuencias de comandos permiten ver las instrucciones de ensamblaje para estos marcos de sistemas. (imagen de ejemplo: http://grab.by/1Vn6).

Las secuencias de comandos de IDC más útiles son fixobjc2 y dyldinfo. Puede encontrar cada uno de estos enlaces desde esta publicación de blog: http://networkpx.blogspot.com/2010/01/two-ida-pro-5x-scripts-for-iphoneos.html

Pero, ¿de qué sirve esta información si no puede usarla? El desarrollador de iPhone saurik ha escrito algo llamado MobileSubstrate que permite engancharse a cualquier método. http://svn.saurik.com/repos/menes/trunk/mobilesubstrate/

+0

Tenga en cuenta que MobileSubstrate también es posible de usar en una Mac, y también ¡consulte SIMBL! –

1

Otros ya han mencionado class-dump, que es una herramienta excelente para recuperar las definiciones de clase de un ejecutable compilado. En una nota relacionada, también debería echar un vistazo a otx, que proporciona una salida muy agradable (legible) y desmontada.

Si necesita una forma de probar rápidamente los fragmentos de código, use F-Script (mencionado por otros), Nu o MacRuby. De estos, principalmente he usado Nu. Tiene la capacidad de definir funciones en puente sobre la marcha, y puede manejar punteros, los cuales son bastante útiles si necesita llamar a funciones C arbitrarias.

Como mencionó que es interesante en Espacios y otros administradores de pantalla, también debería leer A brief tutorial on reverse engineering OS X. Es un artículo antiguo de Rich Wareham (autor de la aplicación multi-escritorio pre-Spaces: 'Desktop Manager') sobre cómo descubrió la sintaxis de llamadas de algunos métodos CoreGraphics privados para hacer buenas transiciones de escritorio. El source code for Desktop Manager también está disponible, lo que podría ser útil para usted.

1

Este sitio muestra cómo parchar un programa de C Objetivo existente: http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering

A saber posando:

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

y el método 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 

(código copiado de http://www.culater.net/wiki/moin.cgi/CocoaReverseEngineering)

+0

Eso realmente no dice cómo parchear un programa. Al igual, debe haber parchado el programa para poder posar dentro de él. Además, la clase pospuesta está en desuso y no funciona en el tiempo de ejecución de 64 bits afaik. – Chuck

+0

La parte de parche se explica en el enlace como hacer un plugin SIMBL. No me di cuenta de que estaba depreciado, así que aquí hay un enlace SO sobre alternativas a poseAsClass: http://stackoverflow.com/questions/1289757/alternative-to-poseasclass-in-mac-os-x-10-5- y más alto – Robert

1

Como una adición a la otra respuestas, va a querer comprobar DYLD_INSERT_LIBRARIES para inyectar su código en un programa Cocoa.

1

Definitivamente, debería considerar usar DTrace. Existe una excelente presentación de BlackHat sobre el uso de DTrace para ingeniería inversa en OS X titulada "DTRACE: el inesperado cuchillo de ejército suizo del ingeniero reverso".

Puede obtener una copia y ver la presentación de video here.

Hay también algunos excelentes trabajos en www.uninformed.org en la ingeniería inversa OS X.

Cuestiones relacionadas