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為用戶朋友們傳道、授業、解惑。歡迎各位朋友關注、點贊、轉發,謝謝大家。


分享到:


相關文章: