首页
社区
课程
招聘
[原创]Textobot-TB插件系统级API详解
发表于: 2020-1-6 10:39 10005

[原创]Textobot-TB插件系统级API详解

2020-1-6 10:39
10005

导读

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插件事件

  • def TB_main(dictarg)

插件脚本必须提供的入口回调函数,没有则视为无效TB插件所以不会加载它,dictarg是框架提供的Key-Value字符串参数。有一个字段event指明当前的TB插件事件类型,当前支持的事件类型如下:

  1. install: 当插件被安装完毕时会收到该事件,一般用于全局性的初始化;
  2. uninstall: 当插件被卸载之前会收到该事件,一般用于全局性的资源回收清除;
  3. start: 当插件被用户启动时会收到该事件,一般用于启动插件的主逻辑,比如TBMachoDumper会打开选择App的界面;
  4. stop: 当插件被用户停止时会收到该事件;
  5. enable: 当插件被用户重新启用时会收到该事件;
  6. disable: 当插件被用户禁用时会收到该事件;
  7. apprun: 当系统有新的进程启动时会收到该事件,同时会在dictarg中包含两个字段’pid‘、‘name’代表当前进程的信息;
  8. appdie: 当系统运行的进程退出时会收到该事件,其他字段同apprun;
  9. 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编辑 ,原因:
收藏
免费 1
支持
分享
最新回复 (4)
雪    币: 48
活跃值: (167)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
很多代码都没有贴上来呀
2020-1-6 10:51
0
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
crazy、shit 很多代码都没有贴上来呀
惊了,编辑的时候有代码,发出来就没有了,我正在联系版主。
2020-1-6 11:01
0
雪    币: 2664
活跃值: (2942)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
跟别人的触动有啥区别
2020-1-6 18:27
0
雪    币: 1662
活跃值: (3569)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
5
Python+Pyobjus+JavaScript+Frida和Lua比较的区别。
2020-1-6 19:08
0
游客
登录 | 注册 方可回帖
返回
//