You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求极简无依赖AArch64指令长度反汇编函数(内核驱动用)

极简AArch64指令长度判断函数(内核驱动适用)

一、A64指令集(纯64位ARM)

AArch64的A64指令集所有指令均为固定4字节长度,且要求4字节对齐。以下是无依赖的极简实现,可直接用于遍历函数指令:

#include <stdint.h>

// 判断A64指令长度(固定返回4字节,可选添加合法性校验)
uint32_t aarch64_insn_length(const uint32_t *insn_ptr) {
    // 可选:校验地址是否4字节对齐(A64指令强制要求,内核场景可根据需求保留)
    // if ((uintptr_t)insn_ptr & 0x3) {
    //     return 0; // 非对齐地址,视为无效指令
    // }
    
    // 可选:简单过滤明显无效的指令编码(示例)
    uint32_t insn = *insn_ptr;
    if ((insn & 0xFFFF0000) == 0xFFFF0000) {
        return 0; // 保留编码,视为无效
    }
    
    return 4;
}

使用说明

  • 输入参数insn_ptr需指向4字节对齐的内存地址,内核中需确保目标内存区域有可读权限。
  • 若无需合法性校验,可简化为直接返回4,进一步降低代码体积。

二、Thumb-2指令集(AArch64兼容32位模式)

若需处理AArch64平台下的32位Thumb-2可变长度指令(16/32字节),以下是无依赖实现:

#include <stdint.h>

// 判断Thumb-2指令长度(返回2或4字节)
uint32_t thumb2_insn_length(const uint16_t *insn_ptr) {
    uint16_t first_half = *insn_ptr;
    
    // 32位Thumb指令的第一半编码特征:0xE800~0xEFFF 或 0xF000~0xF7FF
    if ((first_half & 0xF800) == 0xE800 || (first_half & 0xF800) == 0xF000) {
        return 4;
    }
    
    return 2;
}

使用说明

  • Thumb指令要求2字节对齐,输入insn_ptr需满足对齐要求。
  • 仅在处理32位模式代码时使用,内核中需注意内存访问的权限控制。

三、遍历函数指令示例(A64场景)

void traverse_a64_function(const uint32_t *func_start, uintptr_t func_size) {
    const uint32_t *current_insn = func_start;
    uintptr_t bytes_processed = 0;
    
    while (bytes_processed < func_size) {
        uint32_t insn_len = aarch64_insn_length(current_insn);
        if (insn_len == 0) break; // 遇到无效指令,终止遍历
        
        // 此处添加指令处理逻辑(如记录地址、分析操作码等)
        // process_insn(current_insn);
        
        current_insn = (const uint32_t *)((uintptr_t)current_insn + insn_len);
        bytes_processed += insn_len;
    }
}

内容的提问来源于stack exchange,提问作者5andr0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 14:12:39