Objective-C基本分析法 反编译
来源:互联网 发布:安卓最快的数据库 编辑:程序博客网 时间:2024/06/16 06:30
以Hello World程序为例:
代码:
#import <foundation/foundation.h>@interface SaySomething :NSObject- (void) sayNSString *)phrase;@end@implementation SaySomething- (void) sayNSString *)phrase{ printf("%s\n", [phrase UTF8String]);}@endint main(){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; SaySomething *saySomething = [[SaySomething alloc] init]; [saySomething say"Hello World!"]; [saySomething release]; [pool release]; return 0;}</foundation>保存为hello.m,使用如下命令编译:
引用:
iMAC:ios$ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -o hello hello.m -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/ -framework Foundation -lobjc
查看所使用的dylib:
引用:
iMAC:ios$ otool -L hello
hello:
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 992.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) //包含这个文件则为objective-c编译的文件
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 173.8.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 793.0.0)
dump文件中的相关数据信息:
引用:
iMAC:ios$ otool -l hello |grep __objc
sectname __objc_methname
sectname __objc_methtype
sectname __objc_classname
sectname __objc_classlist
sectname __objc_imageinfo
sectname __objc_const
sectname __objc_selrefs
sectname __objc_classrefs
sectname __objc_data
Objective-C会存储一部分的类型名和类型、类名参考等等信息到文件中。这些信息可以通过strings获取到:
引用:
iMAC:ios$ strings hello
Hello World!
say:
release
init
alloc
UTF8String
autorelease
v12@0:4@8
SaySomething
但是从本质上来说,Objective-C是一种由名称引用数据或方法的方式,即,根据所使用的名称调用对应的处理方法。作为一个相同对比例子,我们来看一个基本上由C语言方式编写的程序,实现相同功能的Hello World。当然,这个也是调用了Objective-C中的方法。
代码:
#import <foundation/foundation.h>@interface SaySomething :NSObject- (void) sayNSString *)phrase;@end@implementation SaySomething- (void) sayNSString *)phrase{ printf("%s\n", [phrase UTF8String]);}@end//int main(){// NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];// SaySomething *saySomething = [[SaySomething alloc] init];// [saySomething say"Hello World!"];// [saySomething release];// [pool release];// return 0;//}int main(){ objc_msgSend(objc_msgSend(objc_getClass("NSAutoreleasePool"), NSSelectorFromString(@"alloc")), NSSelectorFromString(@"init")); objc_msgSend(objc_msgSend(objc_msgSend(objc_getClass("SaySomething"), NSSelectorFromString(@"alloc")), NSSelectorFromString(@"init")), NSSelectorFromString(@"say:"), @"Hello World!"); return 0;}
常见类型对应的内容:
__objc_methname
__objc_methtype
程序中使用的方法名和方法类型
__objc_classname
__objc_classlist
__objc_nlclslist
程序中使用的各种类名和类列表
__objc_catlist
__objc_protolist
Categories and prototypes
__objc_imageinfo
Objective-C可执行代码信息
__objc_const
已初始化的静态变量 __objc_selrefs
__objc_protorefs
__objc_classrefs
__objc_superrefs
选择器类等的参考
__objc_data
初始化变量,如数组,字符串,整数等等
从上文中知道,一些Objective-C信息都被保存在了文件中,那么能否从中提取信息呢?当然时可以的,现成工具叫做class-dump-z。可以从http://code.google.com/p/networkpx/wiki/class_dump_z下载。比如:
引用:
iMAC:ios$ wget -c http://networkpx.googlecode.com/files/class-dump-z_0.2a.tar.gz
iMAC:ios$ tar zxvf class-dump-z_0.2a.tar.gz
iMAC:ios$ sudo cp mac_x86/class-dump-z /usr/local/bin/
我使用的是0.2a版本。执行:
引用:
iMAC:ios$ class-dump-z hello
/**
* This header is generated by class-dump-z 0.2a.
* class-dump-z is Copyright (C) 2009 by KennyTM~, licensed under GPLv3.
*
* Source: (null)
*/
@interface SaySomething : NSObject {
}
-(void)sayid)say;
@end
就可以获取数据了。
使用class-dump只能获取简单的数据,如果想要获取复杂的数据则需要Symbol Table的帮助。
引用:
iMAC:ios$ nm -arch arm hello
00002e40 t -[SaySomething say:]
000030f8 S _NXArgc
000030fc S _NXArgv
U _OBJC_CLASS_$_NSAutoreleasePool
U _OBJC_CLASS_$_NSObject
000030d0 S _OBJC_CLASS_$_SaySomething
U _OBJC_METACLASS_$_NSObject
000030bc S _OBJC_METACLASS_$_SaySomething
U ___CFConstantStringClassReference
00003104 S ___progname
00002e34 t __dyld_func_lookup
00001000 A __mh_execute_header
U __objc_empty_cache
U __objc_empty_vtable
00003100 S _environ
U _exit
00002e84 T _main
U _objc_msgSend
U _puts
000030e4 d dyld__mach_header
00002e14 t dyld_stub_binding_helper
00002dc8 T start
代码:
#import <foundation/foundation.h>@interface SaySomething :NSObject- (void) sayNSString *)phrase;@end@implementation SaySomething- (void) sayNSString *)phrase{ printf("%s\n", [phrase UTF8String]);}@endint main(){ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; SaySomething *saySomething = [[SaySomething alloc] init]; [saySomething say"Hello World!"]; [saySomething release]; [pool release]; return 0;}</foundation>保存为hello.m,使用如下命令编译:
引用:
iMAC:ios$ /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/arm-apple-darwin10-llvm-gcc-4.2 -o hello hello.m -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS6.0.sdk/ -framework Foundation -lobjc
查看所使用的dylib:
引用:
iMAC:ios$ otool -L hello
hello:
/System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 992.0.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0) //包含这个文件则为objective-c编译的文件
/usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 173.8.0)
/System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 793.0.0)
dump文件中的相关数据信息:
引用:
iMAC:ios$ otool -l hello |grep __objc
sectname __objc_methname
sectname __objc_methtype
sectname __objc_classname
sectname __objc_classlist
sectname __objc_imageinfo
sectname __objc_const
sectname __objc_selrefs
sectname __objc_classrefs
sectname __objc_data
Objective-C会存储一部分的类型名和类型、类名参考等等信息到文件中。这些信息可以通过strings获取到:
引用:
iMAC:ios$ strings hello
Hello World!
say:
release
init
alloc
UTF8String
autorelease
v12@0:4@8
SaySomething
但是从本质上来说,Objective-C是一种由名称引用数据或方法的方式,即,根据所使用的名称调用对应的处理方法。作为一个相同对比例子,我们来看一个基本上由C语言方式编写的程序,实现相同功能的Hello World。当然,这个也是调用了Objective-C中的方法。
代码:
#import <foundation/foundation.h>@interface SaySomething :NSObject- (void) sayNSString *)phrase;@end@implementation SaySomething- (void) sayNSString *)phrase{ printf("%s\n", [phrase UTF8String]);}@end//int main(){// NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];// SaySomething *saySomething = [[SaySomething alloc] init];// [saySomething say"Hello World!"];// [saySomething release];// [pool release];// return 0;//}int main(){ objc_msgSend(objc_msgSend(objc_getClass("NSAutoreleasePool"), NSSelectorFromString(@"alloc")), NSSelectorFromString(@"init")); objc_msgSend(objc_msgSend(objc_msgSend(objc_getClass("SaySomething"), NSSelectorFromString(@"alloc")), NSSelectorFromString(@"init")), NSSelectorFromString(@"say:"), @"Hello World!"); return 0;}
常见类型对应的内容:
__objc_methname
__objc_methtype
程序中使用的方法名和方法类型
__objc_classname
__objc_classlist
__objc_nlclslist
程序中使用的各种类名和类列表
__objc_catlist
__objc_protolist
Categories and prototypes
__objc_imageinfo
Objective-C可执行代码信息
__objc_const
已初始化的静态变量 __objc_selrefs
__objc_protorefs
__objc_classrefs
__objc_superrefs
选择器类等的参考
__objc_data
初始化变量,如数组,字符串,整数等等
从上文中知道,一些Objective-C信息都被保存在了文件中,那么能否从中提取信息呢?当然时可以的,现成工具叫做class-dump-z。可以从http://code.google.com/p/networkpx/wiki/class_dump_z下载。比如:
引用:
iMAC:ios$ wget -c http://networkpx.googlecode.com/files/class-dump-z_0.2a.tar.gz
iMAC:ios$ tar zxvf class-dump-z_0.2a.tar.gz
iMAC:ios$ sudo cp mac_x86/class-dump-z /usr/local/bin/
我使用的是0.2a版本。执行:
引用:
iMAC:ios$ class-dump-z hello
/**
* This header is generated by class-dump-z 0.2a.
* class-dump-z is Copyright (C) 2009 by KennyTM~, licensed under GPLv3.
*
* Source: (null)
*/
@interface SaySomething : NSObject {
}
-(void)sayid)say;
@end
就可以获取数据了。
使用class-dump只能获取简单的数据,如果想要获取复杂的数据则需要Symbol Table的帮助。
引用:
iMAC:ios$ nm -arch arm hello
00002e40 t -[SaySomething say:]
000030f8 S _NXArgc
000030fc S _NXArgv
U _OBJC_CLASS_$_NSAutoreleasePool
U _OBJC_CLASS_$_NSObject
000030d0 S _OBJC_CLASS_$_SaySomething
U _OBJC_METACLASS_$_NSObject
000030bc S _OBJC_METACLASS_$_SaySomething
U ___CFConstantStringClassReference
00003104 S ___progname
00002e34 t __dyld_func_lookup
00001000 A __mh_execute_header
U __objc_empty_cache
U __objc_empty_vtable
00003100 S _environ
U _exit
00002e84 T _main
U _objc_msgSend
U _puts
000030e4 d dyld__mach_header
00002e14 t dyld_stub_binding_helper
00002dc8 T start
阅读全文
1 0
- Objective-C基本分析法 反编译
- Objective-C基本数据类型
- objective-c基本数据类型
- Objective-c基本语法
- Objective C基本语法
- Objective-C 基本算法
- Objective-C基本语法
- objective-c 项目分析
- objective-c基本数据类型总结
- objective-c 字符串基本操作
- Objective-C基本数据类型整理
- Objective-C中的基本数据类型
- Objective-C基本语法简介
- Objective-C的基本语法
- 1.Objective-C基本语法
- Objective-C基础 (基本语法)
- Objective-C基本数据类型操作
- Objective-C 【autorelease基本使用】
- 根据图片循环添加圆点
- 谷歌浏览器如何使用谷歌搜索引擎
- 剑指Offer—26—二叉搜索树与双向链表
- 线程Thread和Runnable的区别
- Android View工作原理详解及源码分析(1)
- Objective-C基本分析法 反编译
- C++后台推荐书籍
- 深度学习笔记(一)感知器
- Linux /dev目录详解和Linux系统各个目录的作用
- CTU Open Contest 2016 Suspicious Samples
- listview获取json数据
- Mybatis中ObjectFactory自定义实现
- php 微信永久素材视频上传
- Java-进制转换