導讀
0x00.交個朋友
0x01.textobot.json外掛配置檔案
0x02.TB_main外掛事件
0x03.Pyobjus簡介
0x04.介面類API
0x05.按鍵類API
0x06.工具類API
0x07.下篇再見
0x08.定製服務
0x00.交個朋友手遊從業者模擬器玩家請關注雲遊模擬器PantaWin;
Android開發者請關注雲遊模擬器PantaWin/PantaMac/PantaLinux;
iOS越獄開發者請關注曉文框架Textobot;
Android外掛開發者請關注FIT框架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外掛事件型別,當前支援的事件型別如下:
install: 當外掛被安裝完畢時會收到該事件,一般用於全域性性的初始化;uninstall: 當外掛被解除安裝之前會收到該事件,一般用於全域性性的資源回收清除;start: 當外掛被使用者啟動時會收到該事件,一般用於啟動外掛的主邏輯,比如TBMachoDumper會開啟選擇App的介面;stop: 當外掛被使用者停止時會收到該事件;enable: 當外掛被使用者重新啟用時會收到該事件;disable: 當外掛被使用者禁用時會收到該事件;apprun: 當系統有新的程序啟動時會收到該事件,同時會在dictarg中包含兩個欄位’pid‘、‘name’代表當前程序的資訊;appdie: 當系統執行的程序退出時會收到該事件,其他欄位同apprun;idle: 當系統沒有任何事件產生時,會每隔30s傳送一次該事件給處於running狀態的TB外掛;模板處理程式碼如下:
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 {}
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.介面類APIdef 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.工具類APIdef 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 BundleIDdef 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的內容。
0x08.定製服務我們團隊雖小,但個個都是一頂三的技術精英,因此技術能力是嚴重過剩的。所以如果您有任何關於iOS/Android底層的疑難雜症、雲遊模擬器掛機/二次開發、曉文/FIT外掛定製等方面的個性化需求,歡迎通過私信聯絡我們。
我的自媒體賬號將圍繞PantaEmu、Textobot、Fridobot、LidaDbg為使用者朋友們傳道、授業、解惑。歡迎各位朋友關注、點贊、轉發,謝謝大家。