导读
0x00.交个朋友
0x01.textobot.json插件配置文件
0x02.TB_main插件事件
0x03.Pyobjus简介
0x04.界面类API
0x05.按键类API
0x06.工具类API
0x07.下篇再见
0x08.定制服务
0x09.关于刘柏江
0x00.交个朋友
手游从业者模拟器玩家请关注云游模拟器PantaWin;
Android开发者请关注云游模拟器
PantaWin/PantaMac/PantaLinux;
iOS越狱开发者请关注晓文框架Textobot;
Android插件开发者请关注飞度框架Fridobot;
移动调试器重度用户请关注利达调试器LidaDbg;
我们的产品推荐使用git下载和更新,在码云搜索geekneo即可。
0x01.textobot.json插件配置文件
每一个符合要求的TB插件都必须包含一个textobot.json配置文件,格式如下:
<code>{"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"
}/<code>
其中,只有target、package是必须的,其他的字段可选,也可以添加新的字段供本插件自己使用。
target字段的目的是指明要接收哪些App的文本型GUI事件;
package字段的目的是供调度器管理所有的TB插件使用。
0x02.TB_main插件事件
<code>def
TB_main
(dictarg)
/<code>
插件脚本必须提供的入口回调函数,没有则视为无效TB插件所以不会加载它,dictarg是框架提供的Key-Value字符串参数。有一个字段event指明当前的TB插件事件类型,当前支持的事件类型如下:
- install: 当插件被安装完毕时会收到该事件,一般用于全局性的初始化;
- uninstall: 当插件被卸载之前会收到该事件,一般用于全局性的资源回收清除;
- start: 当插件被用户启动时会收到该事件,一般用于启动插件的主逻辑,比如TBMachoDumper会打开选择App的界面;
- stop: 当插件被用户停止时会收到该事件;
- enable: 当插件被用户重新启用时会收到该事件;
- disable: 当插件被用户禁用时会收到该事件;
- apprun: 当系统有新的进程启动时会收到该事件,同时会在dictarg中包含两个字段’pid‘、‘name’代表当前进程的信息;
- appdie: 当系统运行的进程退出时会收到该事件,其他字段同apprun;
- idle: 当系统没有任何事件产生时,会每隔30s发送一次该事件给处于running状态的TB插件;
模板处理代码如下:
<code>def TB_main(dictarg): event = dictarg['event'
]if
event =='install'
:'install xxx TBPlugin'
)elif
event =='uninstall'
:'uninstall xxx TBPlugin'
)elif
event =='start'
:'start xxx TBPlugin'
)elif
event =='stop'
:'stop xxx TBPlugin'
)elif
event =='enable'
:'enable xxx TBPlugin'
)elif
event =='disable'
:'disable xxx TBPlugin'
)elif
event =='apprun'
:'process %d %s is running.'
% (dictarg['pid'
], dictarg['name'
]))elif
event =='appdie'
:'process %d %s died.'
% (dictarg['pid'
], dictarg['name'
]))elif
event =='idle'
:'idle event received) else: print('
what todo
with : %s' % (event)) return {}
/<code>
0x03.Pyobjus简介
Textobot系统级模块已经集成了Pyobjus这个库,它的主要目的是使用Python调用iOS SDK的ObjC类方法。这就极大的扩展了我们Python代码的能力,可以写出和Objective-C一样能力的处理逻辑。
关于Pyobjus更详细的使用文档,请自行百度或者谷歌‘pyobjus’,官方已经写了很多详细的说明和例子。在这里我们主要提一下最最核心的一点:
<code>ObjC-Class
= autoclass('ObjC-Class'
)/<code>
通过该函数我们就把本地的Objective-C类导入Python运行时了,然后就可以像使用其他Python对象一样使用Objective-C类的方法,非常方便强大,比如:
<code>text = NSString.stringWithUTF8String_('Hello,Textobot'
)'%s'
% text.UTF8String())/<code>
原始的Objective-C代码如下:
<code>NSString
*text = [NSString
stringWithUTF8String:@"some string"
]; printf("%s"
, [text UTF8String]);/<code>
但是Pyobjus只能处理Objective-C类方法,如果要调用有些库导出的C函数,那么可以使用Textobot导出的一个辅助类,需要注意的是调用的函数输入输出必须是id对象:
<code>@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; }/<code>
样例如下:
<code>TBObjcInvoker
= autoclass('TBObjcInvoker'
)invoker
= TBObjcInvoker.alloc().initWithDylib_('/usr/lib/libMobileGestalt.dylib'
)serialno
= invoker.call_arg_('MGCopyAnswer'
, objc_str('SerialNumber'
))/<code>
0x04.界面类API
<code>def
TB_dialog
(title, content)
借助SpringBoard弹出一个提示框; title:提示框标题; content:提示框内容;/<code>
<code>def TB_gui(controls) controls:GUI控件描述文本; 通用格式为:控件类型 当前支持的控件如下: * label :文本字符串,控件类型 * edit :多行编辑框,控件类型 * combo :单选列表框,控件类型 * spin :数据调节器,控件类型 * padding :多加一些空白 完整使用方法请参考《史上最另类的文本型GUI事件模型》这篇文章。/<code>
0x05.按键类API
<code>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插件;/<code>
0x06.工具类API
<code>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
)/<code>
<code>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)/<code>
<code>def
TB_launch
(bid)
bid:
要运行的App BundleIDdef
TB_targets
()
获取当前挂接在textobot server的目标进程,包含App和守护进程; 如果列表中没有运行的进程,则重启对应进程即可;/<code>
<code>def
TB_clear_log
()
清空print输出的日志内容; 插件模式不能全局使用,只能在函数内部使用;def
TB_front_app
()
获取前台运行的App信息,包含bid和pid; 插件模式不能使用; TB_event_callback 开发模式通过该全局变量设置事件回调,回调类型参见TB_on_event; 插件模式不能使用,使用方法参考TBMachoDumper源码; 关于开发模式、插件模式请参考《Wow, 用迄今为止最简单快捷的方式写iOS代码!》这篇文章。/<code>
0x07.下篇再见
到此,我们完整介绍了Textobot系统级API当前版本的所有内容,不管多复杂的插件都是可以满足要求的,如果没有现成的API并且觉得非常有必要,朋友们可以私信告诉我,我酌情加上。下一篇我们详细介绍TB插件进程级API的内容。
0x08.定制服务
我们团队虽小,但个个都是一顶三的技术精英,因此技术能力是严重过剩的。所以如果您有任何关于iOS/Android底层的疑难杂症、云游模拟器挂机/二次开发、晓文/飞度插件定制等方面的个性化需求,欢迎通过私信联系我们。
0x09.关于刘柏江
8年移动互联网从业经验、精通iOS/Android底层开发/攻防对抗、GikDbg/KiwiVM原作者、几维安全联合创始人/股东。
我的自媒体账号将围绕PantaEmu、Textobot、Fridobot、LidaDbg为用户朋友们传道、授业、解惑。欢迎各位朋友关注、点赞、转发,谢谢大家。