Textobot-TB插件进程级API详解&基础篇完结
off999 2024-11-22 19:01 33 浏览 0 评论
导读
0x00.交个朋友
0x01.Frida简介
0x02.界面类API
0x03.按键类API
0x04.工具类API
0x05.基础篇完结
0x06.定制服务
0x07.关于刘柏江
0x00.交个朋友
手游从业者模拟器玩家请关注云游模拟器PantaWin;
Android开发者请关注云游模拟器PantaWin/PantaMac/PantaLinux;
iOS越狱开发者请关注晓文框架Textobot;
Android插件开发者请关注飞度框架Fridobot;
移动调试器重度用户请关注利达调试器LidaDbg;
我们的产品推荐使用git下载和更新,在码云搜索geekneo即可。
0x01.Frida简介
我注意到Frida是2015年,那时Frida刚面世一年多,但是功能已经把我震撼到了。多平台支持、脚本化、Native桥接、高级插桩等功能对于逆向工程和动态分析的效率提升那是相当的巨大。
Frida最大的特色就是用JavaScript脚本化了动态插桩这一过程。我们通过编写JavaScript代码就可以达到利用Native+Substrate/Substitution/Detours/FishHook等组合编写的动态分析模块效果。同时,Frida对于Native的桥接工作也是做得非常出色,我们可以用JavaScript非常轻松的调用Native的函数和Objective-C类接口,所以也就可以写出很强大的脚本代码了。
但是有一个很大的局限性就是,Frida需要借助桌面平台的客户端发送JavaScript代码到目标App。如果是通过frida-gatget模块注入又需要修改目标App,所以不管用哪种方式要持久化的执行JavaScript,在官方提供的接口里面都没有现成的。针对这个缺陷,Textobot用TB插件的模式弥补了Frida没有持久化的问题。同时,为了方便编写实用的TB插件,Textobot还导出了一些辅助性的C API。这个在TBROOT/Template/textobot.js中可以看到它的用法,如下:
// ensure our module is loaded
const libtextobot = Module.load('/Library/MobileSubstrate/DynamicLibraries/textobot.dylib');
function TB_api(name, rettype, argstype) {
return new NativeFunction(libtextobot.getExportByName(name), rettype, argstype);
}
?
// pickup textobot APIs
const textobot = {
TB_logpath : TB_api('TB_logpath', 'pointer', []),
TB_logbuff : TB_api('TB_logbuff', 'pointer', []),
TB_logflush : TB_api('TB_logflush', 'int', []),
TB_dialog : TB_api('TB_dialog','int', ['pointer']),
TB_system : TB_api('TB_system','int', ['pointer']),
TB_root_system : TB_api('TB_root_system', 'int', ['pointer']),
TB_window : TB_api('TB_window', 'pointer', []),
TB_touch : TB_api('TB_touch', 'int', ['int', 'int']),
TB_swipe : TB_api('TB_swipe', 'int', ['int', 'int', 'int', 'int']),
// API likes TB_*_new should call TB_sptr_free to free the heap memory
// see free function bellow
TB_appdir_new : TB_api('TB_appdir_new', 'pointer', []),
TB_docdir_new : TB_api('TB_docdir_new', 'pointer', []),
TB_tmpdir_new : TB_api('TB_tmpdir_new', 'pointer', []),
TB_urlget_new : TB_api('TB_urlget_new', 'pointer', ['pointer']),
TB_urlpost_new : TB_api('TB_urlpost_new', 'pointer', ['pointer', 'pointer']),
TB_sptr_free : TB_api('TB_sptr_free', 'void', ['pointer']),
// ...
// see https://gitee.com/geekneo/Textobot/blob/master/Doc/api.md for more APIs
};
?
// put the string to textobot's native buffer
function puts(s) {
// logbuff's size is 4096
if (s.length >= 4096) {
console.log('Ignoring long string ' + s.length);
return;
}
textobot.TB_logbuff().writeUtf8String(s);
return textobot.TB_logbuff();
}
?
// wrap logger util
function logs(s) {
puts(s);
textobot.TB_logflush();
}
?
// wrap free util
function free(ptr) {
var sptr = puts(ptr.toString(16));
textobot.TB_sptr_free(sptr);
}
?
// slow logger, usually for global log
console.log("The textobot template plugin's log file is at " +
textobot.TB_logpath().readUtf8String());
?
// fast log, usually for hooker with better performance
logs('The textobot template plugin is running ...');
?
function demo_impl() {
const appdir = textobot.TB_appdir_new();
// show a dialog
// the first line is TITLE
// the left lines is CONTENT
textobot.TB_dialog(puts(
'Textobot Tips' +
'\n' +
'The textobot template plugin is running inside ' +
appdir.readUtf8String()
));
?
// API ends with _new should call free deallocate the heap memory
free(appdir);
}当前的Textobot是以独立模块的方式集成Frida,所以只能提供C API,然后通过Frida的NativeFunction桥接一下才可以使用。这样的模式使用起来稍微麻烦一些,直接扩展Frida的JavaScript运行时当然是最佳方案了,这个留着后面更新时再说了吧,我们现阶段的目标是稳定、够用。
Frida的使用需要iOS SDK开发经验,门槛略高。关于它的详细使用方法请参考官方文档,在这里我们着重指出对于Textobot而言最核心的一点,Objective-C桥接。
const NSURL = ObjC.classes.NSURL;
Interceptor.attach(NSURL['- initWithString:'].implementation, {
onEnter: function (args) {
var inst = new ObjC.Object(args[2]);
logs(inst.UTF8String() + '\ninitWithString\n' + backtrace(this.context) + '\n');
}
});我们通过ObjC.classes就可以导入Objective-C类到JavaScript,这个和Pyobjus的autoclass是一样的效果。然后就可以调用类的方法了,非常方便。
0x02.界面类API
int TB_dialog(const char *lines);
在运行的App内弹出一个提示框;
lines[0] = title:提示框标题;
lines[1...] = content:提示框内容;0x03.按键类API
int TB_touch(int x, int y);
x:点击x坐标;
y:点击y坐标;
?
int TB_swipe(int x1, int y1, int x2, int y2);
x1,y1:滑动起始坐标;
x2,y2:滑动终止坐标;
Note:iOS版本小于10.0的系统需要安装TBROOT/iOS/Util/SimulateTouch-iOS8_9.deb插件;
0x04.工具类API
const char *TB_logpath();
获取日志文件路径;
?
char *TB_logbuff();
获取日志文件可写入的内存地址;
?
int TB_logflush();
如果对TB_logbuff返回的地址写入了日志字符串,使用此函数刷新至文件;
如果创建日志文件失败,则返回errno指向的值;
?
样例代码:
// put the string to textobot's native buffer
function puts(s) {
// logbuff's size is 4096
if (s.length >= 4096) {
console.log('Ignoring long string ' + s.length);
return;
}
textobot.TB_logbuff().writeUtf8String(s);
return textobot.TB_logbuff();
}
?
// wrap logger util
function logs(s) {
// 写入缓存
puts(s);
// 写入文件
textobot.TB_logflush();
}
?
?
UIWindow *TB_window();
获取当前显示的UIWindow对象;
?
void TB_system(const char *cmds);
以当前App所在的用户组同步执行cmds命令;
?
void TB_root_system(const char *cmds);
以root用户异步执行cmds命令;
?
char *TB_appdir_new();
获取当前运行的App根目录,需要调用TB_sptr_free释放返回内存;
?
样例代码:
// wrap free util
function free(ptr) {
// 将NativePointer对象转为字符串并写入内部缓存
var sptr = puts(ptr.toString(16));
// 释放字符串内容指向的内存
textobot.TB_sptr_free(sptr);
}
?
const appdir = textobot.TB_appdir_new();
...
free(appdir);
?
?
char *TB_docdir_new();
获取当前运行的App文档目录,需要调用TB_sptr_free释放返回内存;
?
char *TB_tmpdir_new();
获取当前运行的App临时目录,需要调用TB_sptr_free释放返回内存;
?
char *TB_urlget_new(const char *url);
执行HTTP Get请求,需要调用TB_sptr_free释放返回内存;
?
char *TB_urlpost_new(const char *url, const char *body);
执行HTTP Post请求,需要调用TB_sptr_free释放返回内存;
?
void TB_sptr_free(const char *sptr);
释放字符串内容指向的内存地址,比如"0x188880000";在这里我们单独封装了一组高性能的log函数,这个用于频繁写日志时使用,比如需要打印很多App运行时信息时。函数TB_logpath返回值也是对应到TB编辑器Log配置参数的,用于通过VSCode Textobot Editor - AppLog命令返回这一组log函数的输出。之所以单独提供这样的函数,是因为Frida自带的console.log需要通过IPC传递到调度器交给Python的print函数输出,对于频繁的输出,这个性能是不具有任何实用性的,巨慢无比。
0x05.基础篇完结
好了,到此为止,我们通过8篇文章把Textobot所有的基础内容完整的介绍了一遍。如果每一篇你都有看完,我想你应该就具备了通过Textobot编写一些实用TB插件的能力了。以下,我们总结一下Textobot到底为何物。
Textobot是一款基于文本的越狱插件框架,可扩展脚本基于Python实现。目标App动态修改框架,基于Frida JavaScript API实现。Textobot的设计目标是替换现有的Cydia deb插件系统。你可以仅仅使用Python+JavaScript就可以拥有deb/dylib插件的全部能力,并且维护、更新、分发十分容易,开发效率比Native也提高很多。
在Textobot插件的生命周期中,Python运行在系统级别,JavaScript运行在进程级别。代码编辑器使用VSCode,textobot-editor插件提供脚本代码编写、运行、打包等功能。在装有textobot-editor插件的VSCode中,可以直接编辑Python或者JS代码发送到手机端执行。
TBROOT/Sample/AppleIDLogin,这个用于演示如何使用Textobot编写自动化的插件。
TBROOT/Sample/SimpleGUI,这个用于演示如何使用Textobot编写GUI交互式的插件。
TBROOT/Sample/URLCapture,这个用于演示如何使用Textobot编写综合性的插件,同时使用Python系统模式和JavaScript进程模式。
TBROOT/Sample/Httpeek、TBROOT/Sample/Httpeek.src,这个用于演示如何使用Textobot编写更具现实意义的插件,同时使用Python系统模式、JavaScript进程模式、复用Native插件代码。
0x06.定制服务
我们团队虽小,但个个都是一顶三的技术精英,因此技术能力是严重过剩的。所以如果您有任何关于iOS/Android底层的疑难杂症、云游模拟器挂机/二次开发、晓文/飞度插件定制等方面的个性化需求,欢迎通过私信联系我们。
0x07.关于刘柏江
8年移动互联网从业经验、精通iOS/Android底层开发/攻防对抗、GikDbg/KiwiVM原作者、几维安全联合创始人/股东。
我的自媒体账号将围绕PantaEmu、Textobot、Fridobot、LidaDbg为用户朋友们传道、授业、解惑。欢迎各位朋友关注、点赞、转发,谢谢大家。
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
