Textobot-TB插件系统级API详解

导读

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插件事件类型,当前支持的事件类型如下:

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

模板处理代码如下:

<code>def TB_main(dictarg):
    event = dictarg[

'event'

]

if

event ==

'install'

:

print

(

'install xxx TBPlugin'

)

elif

event ==

'uninstall'

:

print

(

'uninstall xxx TBPlugin'

)

elif

event ==

'start'

:

print

(

'start xxx TBPlugin'

)

elif

event ==

'stop'

:

print

(

'stop xxx TBPlugin'

)

elif

event ==

'enable'

:

print

(

'enable xxx TBPlugin'

)

elif

event ==

'disable'

:

print

(

'disable xxx TBPlugin'

)

elif

event ==

'apprun'

:

print

(

'process %d %s is running.'

% (dictarg[

'pid'

], dictarg[

'name'

]))

elif

event ==

'appdie'

:

print

(

'process %d %s died.'

% (dictarg[

'pid'

], dictarg[

'name'

]))

elif

event ==

'idle'

:

print

(

'idle event received) else: print('

what to

do

with : %s

' % (event)) return {}

/<code>


Textobot-TB插件系统级API详解


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'

)

print

(

'%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 BundleID

def

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为用户朋友们传道、授业、解惑。欢迎各位朋友关注、点赞、转发,谢谢大家。


分享到:


相關文章: