导读
0x00.交个朋友
0x01.textobot.json插件配置文件
0x02.TB_main插件事件
0x03.Pyobjus简介
0x04.界面类API
0x05.按键类API
0x06.工具类API
0x07.下篇再见
0x00.交个朋友
手游从业者模拟器玩家请关注云游模拟器PantaWin;
Android开发者请关注云游模拟器PantaWin/PantaMac/PantaLinux;
iOS越狱开发者请关注晓文框架Textobot;
Android插件开发者请关注飞度框架Fridobot;
移动调试器重度用户请关注利达调试器LidaDbg;
我们的产品推荐使用git下载和更新,在码云搜索geekneo即可。
0x01.textobot.json插件配置文件
每一个符合要求的TB插件都必须包含一个textobot.json配置文件,格式如下:
{
"target" : [
"application's bundle identifier" ],
"package" : "your .tb plugin's package identifier",
"version" : "your .tb plugins's version",
"author" : "who writes this plugin",
"email" : "author's email",
"description" : "the description of this plugin"
}
其中,只有target、package是必须的,其他的字段可选,也可以添加新的字段供本插件自己使用。
target字段的目的是指明要接收哪些App的文本型GUI事件;
package字段的目的是供调度器管理所有的TB插件使用。
0x02.TB_main插件事件
插件脚本必须提供的入口回调函数,没有则视为无效TB插件所以不会加载它,dictarg是框架提供的Key-Value字符串参数。有一个字段event指明当前的TB插件事件类型,当前支持的事件类型如下:
- install: 当插件被安装完毕时会收到该事件,一般用于全局性的初始化;
- uninstall: 当插件被卸载之前会收到该事件,一般用于全局性的资源回收清除;
- start: 当插件被用户启动时会收到该事件,一般用于启动插件的主逻辑,比如TBMachoDumper会打开选择App的界面;
- stop: 当插件被用户停止时会收到该事件;
- enable: 当插件被用户重新启用时会收到该事件;
- disable: 当插件被用户禁用时会收到该事件;
- apprun: 当系统有新的进程启动时会收到该事件,同时会在dictarg中包含两个字段’pid‘、‘name’代表当前进程的信息;
- appdie: 当系统运行的进程退出时会收到该事件,其他字段同apprun;
- idle: 当系统没有任何事件产生时,会每隔30s发送一次该事件给处于running状态的TB插件;
模板处理代码如下:
0x03.Pyobjus简介
Textobot系统级模块已经集成了Pyobjus这个库,它的主要目的是使用Python调用iOS SDK的ObjC类方法。这就极大的扩展了我们Python代码的能力,可以写出和Objective-C一样能力的处理逻辑。
关于Pyobjus更详细的使用文档,请自行百度或者谷歌‘pyobjus’,官方已经写了很多详细的说明和例子。在这里我们主要提一下最最核心的一点:
- ObjC-Class = autoclass('ObjC-Class')
通过该函数我们就把本地的Objective-C类导入Python运行时了,然后就可以像使用其他Python对象一样使用Objective-C类的方法,非常方便强大,比如:
- text = NSString.stringWithUTF8String_('Hello,Textobot')
- print('%s' % text.UTF8String())
原始的Objective-C代码如下:
- NSString *text = [NSString stringWithUTF8String:@"some string"];
- printf("%s", [text UTF8String]);
但是Pyobjus只能处理Objective-C类方法,如果要调用有些库导出的C函数,那么可以使用Textobot导出的一个辅助类,需要注意的是调用的函数输入输出必须是id对象:
- @interface TBObjcInvoker {
- -(id)initWithDylib:(const char *)path;
- -(NSString *)dlerror; -(id)call:(const char *)sym;
- -(id)call:(const char *)sym arg:(id)arg;
- -(id)call:(const char *)sym arg0:(id)arg0 arg1:(id)arg1;
- -(id)call:(const char *)sym arg0:(id)arg0 arg1:(id)arg1 arg2:(id)arg2;
- -(id)call:(const char *)sym arg0:(id)arg0 arg1:(id)arg1 arg2:(id)arg2 arg3:(id)arg3;
- }
样例如下:
- TBObjcInvoker = autoclass('TBObjcInvoker')
- invoker = TBObjcInvoker.alloc().initWithDylib_('/usr/lib/libMobileGestalt.dylib')
- serialno = invoker.call_arg_('MGCopyAnswer', objc_str('SerialNumber'))
0x04.界面类API
- def TB_dialog(title, content)
- 借助SpringBoard弹出一个提示框;
- title:提示框标题;
- content:提示框内容;
- def TB_gui(controls)controls:
- GUI控件描述文本;
- 通用格式为:控件类型---提示标题[---初始参数]当前支持的控件如下:
- * label :文本字符串,控件类型---提示标题---对齐方式包括空、center、right;
- * edit :多行编辑框,控件类型---提示标题---初始文本;
- * combo :单选列表框,控件类型---提示标题---初始列表,以逗号分隔;
- * spin :数据调节器,控件类型---提示标题---初始参数,格式为“起始值,步长,终止值”;
- * padding :多加一些空白
- 完整使用方法请参考《史上最另类的文本型GUI事件模型》这篇文章。
0x05.按键类API
- def TB_touch(x, y)
- x:整数,点击x坐标;
- y:整数,点击y坐标;
- def TB_touch_pair(pt)
- pt:字符串,点击坐标,格式为"x,y",比如"89,10",这些值一般由框架提供,参见回调函数TB_on_event;
- def TB_swipe(x1, y1, x2, y2)
- x1,y1:整数,滑动起始坐标;
- x2,y2:整数,滑动终止坐标;
- Note:iOS版本小于10.0的系统需要安装TBROOT/iOS/Util/SimulateTouch-iOS8_9.deb插件;
0x06.工具类API
- def TB_input_text(text)text:
- 通过键盘输入的文本内容;
- 使用实例:先点击编辑框,然后输入文本。
- def input_text(pt, text):
- TB_touch_pair(pt)
- time.sleep(3)
- TB_input_text(text)
- time.sleep(3)
- def TB_send_text(pt, text)
- 如果TB_input_text不好用就试试这个API;
- text:直接向编辑框输入的文本内容;
- 使用实例:先点击编辑框,然后发送文本。
- def send_text(pt, text):
- TB_touch_pair(pt)
- time.sleep(3)
- TB_send_text(pt, text)
- def TB_launch(bid)
- bid: 要运行的App BundleID
- def TB_targets()
- 获取当前挂接在textobot server的目标进程,包含App和守护进程;
- 如果列表中没有运行的进程,则重启对应进程即可;
- def TB_clear_log()
- 清空print输出的日志内容;
- 插件模式不能全局使用,只能在函数内部使用;
- def TB_front_app()
- 获取前台运行的App信息,包含bid和pid;
- 插件模式不能使用;
- TB_event_callback
- 开发模式通过该全局变量设置事件回调,回调类型参见TB_on_event;
- 插件模式不能使用,使用方法参考TBMachoDumper源码;
- 关于开发模式、插件模式请参考《Wow, 用迄今为止最简单快捷的方式写iOS代码!》这篇文章。
0x07.下篇再见
到此,我们完整介绍了Textobot系统级API当前版本的所有内容,不管多复杂的插件都是可以满足要求的,如果没有现成的API并且觉得非常有必要,朋友们可以私信告诉我,我酌情加上。下一篇我们详细介绍TB插件进程级API的内容。
[课程]Linux pwn 探索篇!
最后于 2020-1-6 12:21
被GeekNeo编辑
,原因: