一、sbutils介绍

  sbutils是一个开源的越狱手机基础功能的插件包,其中包含sblaunch这个启动插件,该插件可以实现命令行下面打开app并传递一个url。

  sbutils下载地址:http://cydia.ppios.com/2013/06/sbutils-v1-0-2-1.html

  sbutils的开源代码:https://github.com/innoying/iOS-sbutils

二、sblaunch的开源代码

  

 #include <CoreFoundation/CoreFoundation.h>
#include <stdbool.h>
#define SBSApplicationLaunchUnlockDevice 4
#define SBSApplicationDebugOnNextLaunch_plus_SBSApplicationLaunchWaitForDebugger 0x402 bool SBSProcessIDForDisplayIdentifier(CFStringRef id, pid_t *pid);
int SBSLaunchApplicationWithIdentifier(CFStringRef id, char flags);
int SBSLaunchApplicationForDebugging(CFStringRef bundleID, CFURLRef openURL, CFArrayRef arguments, CFDictionaryRef environment, CFStringRef stdout, CFStringRef stderr, char flags); int main(int argc, char **argv) {
bool p = false;
const char *url = NULL;
const char *bundle;
int flags = SBSApplicationLaunchUnlockDevice; int c;
while((c = getopt(argc, argv, "pdbu:")) != -)
switch(c) {
case 'p': p = true; break;
case 'd': flags |= SBSApplicationDebugOnNextLaunch_plus_SBSApplicationLaunchWaitForDebugger; break;
case 'b': flags |= ; break;
case 'u': url = optarg; break;
default: goto usage;
}
if(optind == argc) goto usage;
bundle = argv[optind]; CFMutableArrayRef arguments = CFArrayCreateMutable(NULL, , &kCFTypeArrayCallBacks);
while(++optind != argc) CFArrayAppendValue(arguments, CFStringCreateWithCString(NULL, argv[optind], kCFStringEncodingUTF8)); CFStringRef cs = CFStringCreateWithCString(NULL, bundle, kCFStringEncodingUTF8);
CFURLRef cu = url ? CFURLCreateWithBytes(NULL, (UInt8*)url, strlen(url), kCFStringEncodingUTF8, NULL) : NULL;
if(url && !cu) {
fprintf(stderr, "invalid URL\n");
return ;
}
int err;
if((err = SBSLaunchApplicationForDebugging(cs, cu, arguments, NULL, NULL, NULL, flags))) {
fprintf(stderr, "SBSLaunchApplicationWithIdentifier failed: %d\n", err);
return ;
}
if(p) {
pid_t pid;
while(!SBSProcessIDForDisplayIdentifier(cs, &pid)) {
usleep();
}
printf("%d\n", (int) pid);
}
return ; usage:
fprintf(stderr, "Usage: sblaunch [-p] [-d] [-b] [-u url] <bundle> [arguments...]\n"
" -p: print pid\n"
" -d: launch for debugging\n"
" -b: launch in background\n"
);
return ;
}

其中着色的函数是关键函数,找了好多资料没有发现这个函数的出处,没有资料显示这里的标准参数是什么。

仿照这个函数的用法,自己写了一段代码,发现同样调用中是可以打开一个app的,但是传递的url无论怎么传递都没有效果。

添加签名:

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.springboard.launchapplications</key> <true/> </dict> </plist> 

遂怀疑是参数的问题,用IDA反编译sblaunch,得到以下的C代码

 int __cdecl main(int argc, const char **argv, const char **envp)
{
const char **v3; // r5@1
signed int v4; // r4@1
int v5; // r6@1
int v6; // r0@11
int v7; // r8@14
int i; // r2@14
int v9; // r0@15
int v10; // r5@16
size_t v11; // r2@18
FILE **v12; // r4@18
const void *v13; // r0@18
int v14; // r4@19
int v15; // r0@19
FILE *v16; // r3@26
const char *v18; // [sp+Ch] [bp-2Ch]@14
int v19; // [sp+10h] [bp-28h]@14
char v20; // [sp+14h] [bp-24h]@1
const char *v21; // [sp+18h] [bp-20h]@1
int v22; // [sp+1Ch] [bp-1Ch]@22 v3 = argv;
v4 = ;
v20 = ;
v21 = ;
v5 = argc;
while ( )
{
v6 = getopt(v5, (char *const *)v3, "pdbu:");
if ( v6 <= )
break;
if ( v6 > )
{
if ( v6 == )
{
v20 = ;
}
else
{
if ( v6 != )
goto LABEL_25;
v21 = optarg;
}
}
else if ( v6 == )
{
v4 |= 1u;
}
else
{
if ( v6 != )
goto LABEL_25;
v4 |= 0x402u;
}
}
if ( v6 != - || optind == v5 )
{
LABEL_25:
v11 = ;
v12 = (FILE **)&__stderrp;
v13 = "Usage: sblaunch [-p] [-d] [-b] [-u url] <bundle> [arguments...]\n -p: print pid\n -d: launch for debugging\n -b: launch in background\n";
goto LABEL_26;
}
v18 = v3[optind];
v19 = ;
v7 = CFArrayCreateMutable();
++optind;
for ( i = optind; i != v5; optind = i )
{
v9 = CFStringCreateWithCString(, v3[i], );
CFArrayAppendValue(v7, v9);
i = optind + ;
}
v10 = CFStringCreateWithCString(, v18, );
if ( v21 )
{
strlen(v21);
v19 = CFURLCreateWithBytes();
if ( !v19 )
{
v11 = ;
v12 = (FILE **)&__stderrp;
v13 = "invalid URL\n";
LABEL_26:
v16 = *v12;
v14 = ;
fwrite(v13, 1u, v11, v16);
return v14;
}
}
v14 = ;
v15 = SBSLaunchApplicationForDebugging(v10, v19, v7, );
if ( v15 )
{
fprintf(__stderrp, "SBSLaunchApplicationWithIdentifier failed: %d\n", v15);
v14 = ;
}
else if ( v20 )
{
while ( !SBSProcessIDForDisplayIdentifier(v10, &v22) )
usleep(0xC350u);
v14 = ;
printf("%d\n", v22);
}
return v14;
}

显示是4个参数,这个函数是位于以下目录中文件中

可是在越狱的手机中找了很久也找不到这个文件,不知道这个库的文件在哪里?

关于sbutils中的sblaunch插件的疑惑的更多相关文章

  1. web网页中使用vlc插件播放相机rtsp流视频

    可参考: 使用vlc播放器做rtsp服务器 使用vlc播放器播放rtsp视频 使用vlc进行二次开发做自己的播放器 vlc功能还是很强大的,有很多的现成的二次开发接口,不需配置太多即可轻松做客户端播放 ...

  2. Eclipse中的checkstyle插件

    一.Checkstyle工具 Checkstyle是一款检查Java程序源代码样式的工具,它可以有效的帮助我们检视代码以便更好的遵循代码编写标准. 官方地址:http://checkstyle.sou ...

  3. eclipse中安装adt插件

    对于程序开发的学者来说,eclipse并不陌生,它为我们提供了一个非常广阔的平台来开发程序.同样我们也可以用它来开发android程序.但是在eclipse中并不能直接开发android程序,需要我们 ...

  4. 总结eclipse中安装maven插件

    当自己越来越多的接触到开源项目时,发现大多数的开源项目都是用maven来够建的.并且在开发应用时,也越来越意识到maven的确会解决很多问题,如果你要了解maven,可以参考:Maven入门指南(一) ...

  5. (转)jQuery Mobile 移动开发中的日期插件Mobiscroll 2.3 使用说明

    (原)http://www.cnblogs.com/hxling/archive/2012/12/12/2814207.html jQuery Mobile 移动开发中的日期插件Mobiscroll ...

  6. 在 Sublime Text 2 中使用 SFTP 插件快速编辑远程服务器文件

    在 Sublime Text 2 中使用 SFTP 插件快速编辑远程服务器文件 开源程序 浏览:29555 2013年05月02日 文章目录[隐藏] 常见的工作流程 SFTP 安装和使用方法 第一步: ...

  7. Notepad++中常用的插件

    Notepad++中常用的插件 Notepad++实用插件分享 otepad++前端开发常用插件介绍

  8. Sublime Text 中使用Git插件连接GitHub

    sublime Text的另一个强大之处在于它提供了非常丰富的插件,可以帮助程序员来适合大多数语言的开发.这些插件通过它自己的Package Controll(包管理)组件来安装,非常方便.一般常用的 ...

  9. 在Eclipse中使用Maven插件 博客分类: Java相关技术

    简介 本文介绍如何在Eclipse中通过maven插件编写java项目和web项目. 安装Maven 下载Maven最新版本,见:maven.apache.org/download.html 当前版本 ...

随机推荐

  1. DOS头分析

    DOS头分析 PE文件结构综览: 首先上图片: 看到上面的图片可以清晰的看到PE结构复杂结构式什么样子的.有DOS首部,PE头部,PE节表,很多的表块,最后就是一些调试信息. DOS头由DOS 'MZ ...

  2. WPF中StackPanel的使用方法

    StackPanel 1.StackPanel:释义为是最简单的控制面板,它把其中的UI元素按横向或纵向堆积排列. 2.常用属性:width:获取或设置元素的宽度.Orientation:用于控制面板 ...

  3. AOP的成员介绍

    AOP(Aspect Oriented Programming)面向切面编程,AOP的作用不过多介绍,本文是主要是介绍AOP的成员,是我在复习的时候记录的一些笔记,方便以后查阅方便一些. JointP ...

  4. 人工智能搜索算法(深度优先、迭代加深、一致代价、A*搜索)

    搜索算法问题求解 一.需求分析 分别用深度优先.迭代加深.一致代价.A*搜索算法得到从起始点Arad到目标点Bucharest的一条路径,即为罗马尼亚问题的一个解,在求解的过程中记录每种算法得到的解, ...

  5. bootstrap插件学习-bootstrap.modal.js

    bootstrap插件学习-bootstrap.modal.js 先从bootstrap.modal.js的结构看起. function($){ var Modal = function(){} // ...

  6. Alfred工具

    神兵利器——Alfred 有人的地方就有江湖,有江湖就有纷争. 很多人说我的文字风格相对轻松和温和,那是因为我很早就认识到,我们没有教育脑残和喷子的义务.在网际多年,看过太多虚拟的刀锋和鲜血,很多人被 ...

  7. 基于BrokerPattern服务器框架

    基于BrokerPattern服务器框架 RedRabbit 经典网游服务器架构 该图省略了专门用途的dbserver.guildserver等用于专门功能的server,该架构的优点有: l Log ...

  8. linux 下 openssl 编译和交叉编译

    此随便记录一下编译openssl时遇到的各种问题以及解决办法. 点击此处下载 OpenSSL(version-1.0.1e) linux 64位系统编译32位版本: setarch i386 ./Co ...

  9. HQL练习

    Hive学习笔记总结 05. Hql练习 1. hql基础练习 题目和数据来源:http://www.w2b-c.com/article/150326(去掉-) create和load create ...

  10. 【CSS学习笔记】a标签的四种伪类

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xht ...