开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 186|回复: 2
收起左侧

[逆向安全] 我在使用unidbg的过程中出现如下报错,请大佬帮我看一下

[复制链接]
结帖率:13% (2/16)
发表于 昨天 21:07 | 显示全部楼层 |阅读模式   浙江省杭州市
12精币
1.RegisterNative(com/xxxxxxx/xx/xxxmsg/c$p, aa(II)[B, RX@0x120b6a90[libxxxxnormsg.so]0xb6a90)





2.WARN [com.github.unidbg.linux.ARM64SyscallHandler] (ARM64SyscallHandler:410) - handleInterrupt intno=2, NR=-130000, svcNumber=0x13a, PC=unidbg@0xfffe0434, LR=RX@0x123d2b1c[libxxxxnormsg.so]0x3d2b1c, syscall=null





3.java.lang.IndexOutOfBoundsException: Index: 1, Size: 1





private void rangeCheckForAdd(int index) {

        if (index > size || index < 0)

            throw new IndexOutOfBoundsException(outOfBoundsMsg(index));

    }



4.@Override

    public Number runMainForResult(MainTask main) {

        taskList.add(0, main);////////////////////////////////////////////////////////////////////////



        log.debug("runMainForResult main={}", main);////////////////////////////////////////////////////////////////////////



        Number ret = run(0, null);////////////////////////////////////////////////////////////////////////

        for (Iterator<Task> iterator = taskList.iterator(); iterator.hasNext(); ) {

            Task task = iterator.next();

            if (task.isFinish()) {

                log.debug("Finish task={}", task);

                task.destroy(emulator);

                iterator.remove();

                for (SignalTask signalTask : task.getSignalTaskList()) {

                    signalTask.destroy(emulator);

                    task.removeSignalTask(signalTask);

                }

            }

        }

        return ret;

    }





加载调用的是64bit的so。前面补环境之后callJNI_OnLoad都正常。就是调用callFunction的时候报错:java.lang.IndexOutOfBoundsException: Index: 1, Size: 1。但是我测试了别的函数,有的又可以正常调用。aa(II)[B函数应该是加了ollvm的。



回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:100% (21/21)

签到天数: 19 天

发表于 昨天 21:19 | 显示全部楼层   安徽省滁州市
豆包AI提供的


RegisterNative 错误
plaintext
RegisterNative(com/xxxxxxx/xx/xxxmsg/c$p, aa(II)[B, RX@0x120b6a90[libxxxxnormsg.so]0xb6a90)

这是 JNI(Java Native Interface)注册本地方法时的日志。看起来是在尝试注册一个名为aa的本地方法,但无法确定这里是否存在错误,因为这只是注册信息的记录。
ARM64 系统调用警告
plaintext
WARN [com.github.unidbg.linux.ARM64SyscallHandler] ... handleInterrupt intno=2, NR=-130000, svcNumber=0x13a...

这是一个系统调用处理警告。NR=-130000表示一个无效的系统调用号,可能是因为 Unidbg(一个 Android 模拟器框架)不支持该特定系统调用,或者库尝试调用一个自定义的系统调用。
IndexOutOfBoundsException 异常
java
java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

这是一个数组越界异常。错误发生在尝试访问索引为 1 的元素,但集合中只有 1 个元素(有效索引是 0)。
问题代码片段
java
taskList.add(0, main);
Number ret = run(0, null);

这部分代码在taskList的索引 0 位置添加了一个任务,然后调用run(0, null)。问题可能出在run方法内部尝试访问索引 1 的元素,导致越界异常。
解决方案
针对IndexOutOfBoundsException,我建议在添加和运行任务前检查索引有效性:
java
@Override
public Number runMainForResult(MainTask main) {
    // 确保taskList不为空,避免潜在的索引问题
    if (taskList == null) {
        taskList = new ArrayList<>();
    }
   
    // 添加任务前记录当前大小,用于调试
    int currentSize = taskList.size();
    log.debug("Adding task to index 0, current size: {}", currentSize);
   
    // 添加任务到索引0位置
    taskList.add(0, main);
   
    log.debug("runMainForResult main={}", main);
   
    // 确保run方法使用有效的索引
    int runIndex = Math.min(0, taskList.size() - 1);
    log.debug("Running task at index: {}", runIndex);
    Number ret = run(runIndex, null);
   
    // 清理已完成的任务
    for (Iterator<Task> iterator = taskList.iterator(); iterator.hasNext(); ) {
        Task task = iterator.next();
        if (task.isFinish()) {
            log.debug("Finish task={}", task);
            task.destroy(emulator);
            iterator.remove();
            for (SignalTask signalTask : task.getSignalTaskList()) {
                signalTask.destroy(emulator);
                task.removeSignalTask(signalTask);
            }
        }
    }
    return ret;
}

这个修改主要做了以下几点:
确保taskList不为空
添加任务前记录当前大小,便于调试
计算有效的运行索引,避免越界
添加了更多的调试日志,帮助追踪问题
对于系统调用警告,你可能需要检查 Unidbg 配置或更新相关库版本,以支持更多的系统调用。
回复

使用道具 举报

结帖率:87% (39/45)

签到天数: 21 天

发表于 昨天 21:36 | 显示全部楼层   河北省衡水市
1. 确认错误发生的具体位置
  • 错误提示Index: 1, Size: 1意味着在操作列表时,试图访问或修改索引1,但列表实际大小仅为1。需要确定是哪次对taskList的操作导致了该异常。
  • 在runMainForResult方法及其他涉及taskList的地方添加日志,记录每次add或remove操作时的索引和列表大小:

[JavaScript] 纯文本查看 复制代码
log.debug("Adding task at index: {}, current size: {}", index, taskList.size());


2. 检查所有对taskList的操作
  • 确保所有调用taskList.add(index, element)的地方,index的值不超过当前列表的size。例如:
  • [JavaScript] 纯文本查看 复制代码
    // 正确示例:当size=0时,index=0是合法的
    taskList.add(0, main);

3. 处理系统调用警告
  • 日志中的警告ARM64SyscallHandler: NR=-130000表明存在未处理的系统调用,可能导致Unidbg内部状态异常。
  • 解决方案

    • 在Unidbg中补全对应的系统调用处理。例如,在ARM64SyscallHandler中添加对该NR值的处理:

[JavaScript] 纯文本查看 复制代码
if (NR == -130000) {
    // 实现该系统调用的逻辑
    return 0; // 根据实际情况返回
}




4. 检查OLLVM混淆的影响
  • 函数aa(II)[B被OLLVM混淆可能导致控制流复杂化,影响Unidbg的模拟执行。
  • 解决方案

    • 使用动态调试(如Ghidra或IDA)分析该函数的真实逻辑,确认是否有反调试或异常控制流。
    • 在Unidbg中设置断点,跟踪函数执行流程,观察是否在特定位置触发异常行为。

[size=16.002px]


5. 确保任务清理正确
  • 在runMainForResult方法中,任务完成后会从taskList移除。但需确保迭代过程中没有并发修改。
  • 验证代码逻辑

[JavaScript] 纯文本查看 复制代码
for (Iterator<Task> iterator = taskList.iterator(); iterator.hasNext(); ) {
    Task task = iterator.next();
    if (task.isFinish()) {
        iterator.remove(); // 使用迭代器的remove方法是安全的
    }
}



6. 精简测试用例
  • 若问题复杂,可尝试简化测试环境:

    • 仅保留调用aa(II)[B的最小代码,排除其他干扰。
    • 逐步补全环境(如JNI方法、内存分配),观察何时触发异常。

[size=16.002px]


7.示例代码修复
[size=16.002px]假设问题出在taskList.add(0, main)[size=16.002px]时列表大小不匹配:
[JavaScript] 纯文本查看 复制代码
// 添加前确保索引合法
int index = 0;
if (index > taskList.size()) {
    index = taskList.size(); // 或抛出明确异常
}
taskList.add(index, main);




回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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