在越狱的iPhone上执行二进制文件

时间:2012-08-09 18:31:01

标签: iphone binary jailbreak nstask

由于iPhone沙盒化其应用程序,我无法访问/bin/文件夹。所以我使用SSH连接从iPhone获取/bin/date二进制文件,并将其包含在我的项目中。当我使用NSLog打印时,我的文件路径是正确的:/var/mobile/Applications/95078888-DDA8-4C1E-93DC-1F9E0A26E70A/Documents/date。我遇到的问题如下所示。有谁知道如何解决这个错误?

*注意:如果我在模拟器中运行它并使用此代码执行与mac OSX兼容的任何二进制文件,它可以工作,但是当我尝试在带有iPhone二进制文件的设备上运行它时,它会给我带来问题。 / p>

错误:

  

2012-08-09 14:23:13.757 TestBinary [7891:707]终止app到期   未捕获的异常'NSInternalInconsistencyException',原因:   '无法分叉:错误1'

     

第一次抛出调用堆栈:(0x359b388f 0x335d7259 0x359b3789 0x359b37ab 0x34deb915 0xda5af 0x3590d3fd 0x330cee07 0x330cedc3   0x330ceda1 0x330ceb11 0x330cf449 0x330cd92b 0x330cd319 0x330b3695   0x330b2f3b 0x336a522b 0x35987523 0x359874c5 0x35986313 0x359094a5   0x3590936d 0x336a4439 0x330e1cd5 0xd9ecd 0xd9e98)

     

终止调用抛出异常

     

编程收到信号:“SIGABRT”。   数据格式化程序暂时不可用,将在“继续”后重试。   (找不到dlopen函数,因此无法加载共享   图书馆。)

     

mi_cmd_stack_list_frames:堆栈中没有足够的帧。

     

mi_cmd_stack_list_frames:堆栈中没有足够的帧。

调用日期文件的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path = [NSString stringWithFormat:@"%@/date", documentsDirectory];

NSLog(@"%@", path);

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: path];

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

NSData *data;
data = [file readDataToEndOfFile];

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

label.numberOfLines=0;
label.text = string;

[string release];
[task release]; 

我的NSTask文件:

#import <Foundation/NSObject.h>

@class NSString, NSArray, NSDictionary;

@interface NSTask : NSObject

- (id)init;

- (void)setLaunchPath:(NSString *)path;
- (void)setArguments:(NSArray *)arguments;
- (void)setEnvironment:(NSDictionary *)dict;
- (void)setCurrentDirectoryPath:(NSString *)path;
- (void)setStandardInput:(id)input;
- (void)setStandardOutput:(id)output;
- (void)setStandardError:(id)error;

- (NSString *)launchPath;
- (NSArray *)arguments;
- (NSDictionary *)environment;
- (NSString *)currentDirectoryPath;

- (id)standardInput;
- (id)standardOutput;
- (id)standardError;

- (void)launch;

- (void)interrupt; 
- (void)terminate; 

- (BOOL)suspend;
- (BOOL)resume;

- (int)processIdentifier; 
- (BOOL)isRunning;

- (int)terminationStatus;

@end

@interface NSTask (NSTaskConveniences)

+ (NSTask *)launchedTaskWithLaunchPath:(NSString *)path arguments:(NSArray *)arguments;

- (void)waitUntilExit;

@end

FOUNDATION_EXPORT NSString * const NSTaskDidTerminateNotification;
#endif

编辑1:

我使用以下目录解压缩:https://github.com/samsoffes/ssziparchive

这是我解压缩和执行的代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *path2 = [[NSBundle mainBundle] pathForResource:@"date" ofType:@"zip"];
[SSZipArchive unzipFileAtPath: path2 toDestination:documentsDirectory];

NSString *path = [NSString stringWithFormat:@"%@/date", documentsDirectory];

NSFileManager* fileManager = [NSFileManager defaultManager];
NSMutableDictionary *attributes = [NSMutableDictionary dictionaryWithDictionary:[fileManager attributesOfItemAtPath:path error:nil]];

[attributes setValue:[NSNumber numberWithShort: 0777] 
              forKey:NSFilePosixPermissions];
NSError* err;
[fileManager setAttributes: attributes ofItemAtPath: path error: &err];

NSTask *task = [[NSTask alloc] init];
[task setLaunchPath: path];

NSPipe *pipe;
pipe = [NSPipe pipe];
[task setStandardOutput: pipe];

NSFileHandle *file;
file = [pipe fileHandleForReading];

[task launch];

NSData *data;
data = [file readDataToEndOfFile];

NSString *string;
string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

label.numberOfLines=0;
label.text = string;

[string release];
[task release]; 

1 个答案:

答案 0 :(得分:1)

我不确定为什么这种情况正在发生,但是当Xcode构建时,它会以某种方式破坏date二进制文件。如果查看原始date文件(在项目文件夹下),然后在Xcode build 目录下找到相同的文件(例如):

/Users/myusername/Library/Developer/Xcode/DerivedData/HelloJB-gsokzlpnejddadbccgrfkxnumkyl/Build/Products/Release-iphoneos/HelloJB.app

您可以对这两个文件运行diff命令,它会告诉您这些二进制文件有所不同。这足以导致这个问题。

出于某种原因,Xcode正在研究这种类型的资源,并为此做些什么。我知道,例如,它试图在你的应用程序的png资源上使用某种pngcrush实用程序。也许这是相似的。

无论如何,我发现解决此问题的一种方法是压缩Mac上的date文件。然后,在项目中包含date.zip作为捆绑资源。清洁和建造。 Xcode不会破坏zip文件。

现在,当您的应用启动时,它需要从其捆绑资源中解压缩date.zip文件,并将解压缩的版本存储在文档缓存中,或任何你想要的地方。您可能还需要记住设置执行权限。

See this for programmatically unzipping files

<强>更新

之后,您可能必须将文件设置为具有可执行权限。像这样:

NSFileManager* fileManager = [NSFileManager defaultManager];
NSMutableDictionary* attributes = [[NSMutableDictionary alloc] init];
NSNumber* permission = [NSNumber numberWithLong: 0755];
[attributes setObject:permission forKey: NSFilePosixPermissions];
NSError* err;
[fileManager setAttributes: attributes ofItemAtPath: filePath error: &err];