一、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. Java读书笔记1

    Java逍遥游记读书笔记 前言 必须先来一句,这是入门级别,高手勿喷~ 写Android的时候总有一些语句不是很理解,其实大部分是Java的内容,所以想系统的学下Java. 这本书——<Java ...

  2. ××校招:前端线上笔试题--页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动

    题目: 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动:   原理: 1.页面上画一个圆,画一个圆心.在这个圆的圆周上面画一个点,我们就让这个点绕着圆周跑: 2.怎 ...

  3. TPL相关

    C#中的Timer System.Windows.Forms.TimerSystem.Threading.Timer System.Timers.Timer 1.System.Windows.Form ...

  4. easyui tree 判断是否是叶子节点

    <input class="add" id="add" style="display: none" type="submit ...

  5. webservice 第一节 .net SoapHeader验证

    在工作中经常用到webservice,在.net 开发中经常用到webservice,在java开发经常用到cxf. 今天闲置没事就介绍下 .net webservice中常用到 soapheader ...

  6. HttpMessageHandler管道[上篇]

    HttpMessageHandler管道[上篇] 整个ASP.NET Web API服务端框架采用管道式设计,这个用于“处理请求.响应回复”的管道本质上就是一组HttpMessageHandler的有 ...

  7. Centos 64位 Install certificate on apache 即走https协议

    Centos 64位 Install certificate on apache 即走https协议 一: 先要apache 请求ssl证书的csr 一下是步骤: 重要注意事项 An Importan ...

  8. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  9. C#中WindowsForm常见控件的运用

    C#中WindowsForm常见控件的运用 -- 1.button(曹操,贡天子以令不臣): 属性;text:我们经常可以看见将按钮命名为“登入”,在其属性面板里面编辑text即可:如下图:      ...

  10. 成都传智播客JDBC视频及讲师介绍

    成都传智播客java讲师,也许,你跟他很熟,你或者听过他的课,或者跟他争论过什么,又或者你们在一起共事,再者你们只是偶尔擦肩而过.在小编的印象中郭老师完全没有架子,和他相处会让你觉得不是面对一个老师, ...