开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 300|回复: 3
收起左侧

[IOS安全] frida主动调用函数的问题

[复制链接]
结帖率:10% (2/20)
发表于 3 天前 | 显示全部楼层 |阅读模式   湖北省荆州市
请大神帮忙看看~万分感谢!

对象(实例)函数原型:

id __cdecl -[APPProcessor reqDataWithBizDict:actDict:zipType:info:newApiVer:](
        APPProcessor *self,
        SEL a2,
        id a3,
        id a4,
        signed __int64 *a5,
        APTaskInfoData *a6,
        bool a7)



frida hook后的参数情况:

对应上面的reqDataWithBizDict: id a3
a3={
    "external_info" = "_input_charset=\"utf-8\"&body=\"\\"extInfo\":{\"ap_link_token\":\"EP11bad44220dd0b2d10fc93d0666e38c48_1761914117465\"}}\"";
},type: __NSSingleEntryDictionaryI




对应上面的actDict: id a4
a4={
    action =     {
        method = main;
        type = test;
    };
},type: __NSSingleEntryDictionaryI





对应上面的zipType:  signed __int64 *a5,应该是数据压缩类型:0或者1
a5 0x16fdf26d8
16fdf26d8  00 00 00 00 00 00 00 00 20 35 b3 85 02 00 00 00  ........ 5......
16fdf26e8  40 28 df 6f 01 00 00 00 d0 27 df 6f 01 00 00 00  @(.o.....'.o....
16fdf26f8  e0 70 a4 99 01 00 00 00 30 77 6c 73 62 74 77 73  .p......0wlsbtws
16fdf2708  6c 36 75 61 39 61 6f 34 77 30 62 30 76 76 6f 32  l6ua9ao4w0b0vvo2






对应上面的info:APTaskInfoData *a6,应该是任务的相关信息:”0wlsbtwsl6ua9ao4w0b0vvo2”
a6 0x16fdf2700
16fdf2700  30 77 6c 73 62 74 77 73 6c 36 75 61 39 61 6f 34  0wlsbtwsl6ua9ao4
16fdf2710  77 30 62 30 76 76 6f 32 00 00 00 00 00 00 00 00  w0b0vvo2........
16fdf2720  00 00 00 00 8c f6 27 41 f8 48 80 03 01 00 00 00  ......'A.H......
16fdf2730  00 f2 0a 31 01 00 00 00 30 77 6c 73 62 74 77 73  ...1....0wlsbtws

APTaskInfoData 是结构体
00000000 struct APTaskInfoData // sizeof=0x2
00000000 {
00000000     __int16 field_0;/////////////////////////”0wlsbtwsl6ua9ao4w0b0vvo2”
00000002 };




对应上面的newApiVer:bool 类型:true或者false
arg7 0x0






以下是frida 主动调用函数代码:

function hook_nativelib()
{

const NSDictionary = ObjC.classes.NSDictionary;
const NSString = ObjC.classes.NSString;

//参数a2对应上面的a3
// 1. 定义 external_info 的值(注意转义特殊字符,保持原字符串格式)
const externalInfoValue = "_input_charset=\"utf-8\"&body=\"\\"extInfo\":{\"ap_link_token\":\"EP11bad44220dd0b2d10fc93d0666e38c48_1761914117465\"}}\"";

// 2. 将键和值转换为 Objective-C 的 NSString 对象(NSDictionary 要求键值为对象类型)
const key = NSString.stringWithString_("external_info");
const value = NSString.stringWithString_(externalInfoValue);

// 3. 用 dictionaryWithObject:forKey: 构造单键值对字典(自动为 __NSSingleEntryDictionaryI 类型)
const singleEntryDict = NSDictionary.dictionaryWithObject_forKey_(value, key);

const a2 = singleEntryDict;



//参数a3对应上面的a4
// 1. 构建内层 action 字典(包含 method 和 type 两个键值对)
const methodKey = NSString.stringWithString_("method");
const methodValue = NSString.stringWithString_("main");
const typeKey = NSString.stringWithString_("type");
const typeValue = NSString.stringWithString_(“test”);

// 内层字典有两个键值对,使用多键构造方法
const innerValues = [methodValue, typeValue];
const innerKeys = [methodKey, typeKey];
const actionDict = NSDictionary.dictionaryWithObjects_forKeys_count_(innerValues, innerKeys, innerValues.length);

// 2. 构建外层字典(仅包含 action 一个键值对,类型为 __NSSingleEntryDictionaryI)
const outerKey = NSString.stringWithString_("action");
// 单键值对通过 dictionaryWithObject:forKey: 构造,系统会自动返回 __NSSingleEntryDictionaryI 类型
const outerDict = NSDictionary.dictionaryWithObject_forKey_(actionDict, outerKey);
           
const a3 = outerDict;



//参数a4对应上面的a5
// 1. 分配 8 字节内存(存储 int64_t)
const a4 = Memory.alloc(8); // 64位整数占8字节,直接指定大小更清晰
// 2. 向内存写入 64 位有符号整数(小端序,符合大多数系统架构)
a4.writeS64(0); // 设置 zipType 的值(根据实际需求调整)



参数a5对应上面的a6
// 构造结构体并赋值字符串
const a5 = Memory.alloc(30); // 分配 30 字节内存(对应 var0[30])

// 要赋值的字符串(注意长度不能超过 30 字节,超出部分会被截断)
const str = "0wlsbtwsl6ua9ao4w0b0vvo2";

// 将字符串写入结构体的 var0 数组(自动处理 null 终止)
Memory.writeUtf8String(a5, str);

//const immediateRead = Memory.readUtf8String(a5);
//console.log("a5", immediateRead);



//参数a6对应上面的a7
//const a6 = 0x0;
const a6 = false;



//开始调用
if (ObjC.available) {
    // 1. 获取目标类
    const APPProcessor = ObjC.classes.APPProcessor;
    if (!APPProcessor) {
        console.log("未找到 APPProcessor 类");
        return;
    }

    // 2. 创建/获取 APPProcessor 实例(根据实际情况调整,若为单例则用单例方法)
    let processorInstance;
    try {
        // 若支持 alloc + init 初始化
        processorInstance = APPProcessor.alloc().init();
        // 若为单例(例如 sharedProcessor),则替换为:
        // processorInstance = APPProcessor.sharedProcessor();
    } catch (err) {
        console.log("实例化 APPProcessor 失败:", err.message);
        return;
    }
    if (!processorInstance) {
        console.log("未获取到 APPProcessor 实例");
        return;
    }


    if (processorInstance.isKindOfClass_(ObjC.classes.APPProcessor)) {
        console.log("实例有效");
   } else {
        console.log("实例无效,类型:", processorInstance.$className); // 若为 nil,$className 可能为 null
   }

      try {
        const result = processorInstance.reqDataWithBizDict_actDict_zipType_info_newApiVer_(a2,a3,a4,a5,a6);///////////////////////////////////////////////////////////////////////////////////////////////////////调用函数
        console.log("调用结果:", result);
        } catch (err) {
    if (err === null) {);///////////////////////////////////////////////////////////////////////////////////////////////////////返回异常
        // 极少数情况:异常未被正确转换,直接返回 null(旧版 Frida 可能出现));///////////////////////////////////////////////////////////////////////////////////////////////////////返回异常
        console.log("调用失败:底层异常err 为 null");
    } else if (typeof err === "object") {
        // 处理 JS 原生 Error 或 Objective-C 桥接异常
        console.log("错误名称:", err.name || "未知错误");
        console.log("错误信息:", err.message || "无详细信息");
        if (err.stack) {
            console.log("调用栈:", err.stack);
        }
    } else {
        // 其他类型异常(如字符串、数字,极少出现)
        console.log("异常:", err);
    }
}
}   

}



function main()
{
hook_nativelib();
}

setImmediate(main);


调用结果:
frida ios主动调用 结果:实例有效
调用失败:底层异常err 为 null



结帖率:10% (2/20)

签到天数: 3 天

 楼主| 发表于 前天 16:45 | 显示全部楼层   湖北省荆州市
我另外找了一个只有一个参数的对象(实例)函数做测试。因为只传一个参数true,结果上面的代码可以正常运行,能返回结果!
回复 支持 反对

使用道具 举报

结帖率:10% (2/20)

签到天数: 3 天

 楼主| 发表于 前天 16:43 | 显示全部楼层   湖北省荆州市
大神!能不能说一下如何解决?
回复 支持 反对

使用道具 举报

结帖率:100% (42/42)

签到天数: 2 天

发表于 3 天前 | 显示全部楼层   河南省新乡市
实际上实例是无效的,ios的主动调用要么通过反射拿示例,要么通过ui拿,很多时间自己alloc出来的实例无法主动调用
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

关闭

精易论坛 - 有你更精彩上一条 /2 下一条

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表