逆向研究QCA9563固件,查看和修改GPIO定义

2023-05-16

自己刷了个qca9563用作ap玩,奈何GPIO定义不清楚,wan口灯什么的都不知道引脚定义。

某快的GPIO定义网上只有寥寥言语,在某鱼商家眼里,这些都是能卖钱的机密信息。

于是想既然有固件了,我为何不从固件里面寻找信息呢?

开始百度搜索了相关内容,找到两篇有帮助的:

手工使用二进制工具修改H大的breed的gpio复位键的心得-续-逆向恢复符号表

一次嵌入式固件逆向实践

于是按照流程开始研究,首先是在KALI里面用binwalk解包固件得到名为60040的内核

开始导入IDA PRO里面进行逆向,确实一个函数都没有。

然后用rbasefind爆破基地址,16线程跑了一个晚上,然后告诉我基地址是0x80060000?

我早该想到的。一半路由器内核加载地址都是这个。 (这里有个坑,rbasefind默认为小端,这里要加 “-b”) 

修改基地址后,按c试下,大部分函数都能出来了,但是字符串什么的都还是不显示,上面文章说ghirda能够识别更多的函数和字符串,于是换用ghirda,感觉确实分析功能更强大。

找了找和led有关的字符串和函数,发现了几个疑似的,但是并不像原文章那样清晰明了,直接函数里面把参数和代入的变量都显示出来,毕竟固件不一样嘛。

然后想办法按照文章所述恢复符号表,研究了半天发现固件不一样,符号表细节处也不一样,

在fjh1997所用的固件中,符号表定义如下:

 但是在爱快的固件里面,有三千多个函数名称,但是都是对应的连续的80开头的,并没有偏移量,这可怎么对应?

事情陷入了僵局,纠结了两三天,各种写脚本测试,仍是无功而返,我相信是有办法对应函数名称的,但是不得其法。

无意中翻看,发现有一部分地址不是连续的,后面跟的有数据,但是和原文中的数据不一样,也是没有偏移地址。但是好在里面有数据了,开始考虑这个地址后面的数据是什么意思。

前面0x802f91dc搜了下,是个字符串alfa:red:led_5,或许是变量,那后面的0xc和0x80是什么意思,也是偏移么?事实证明是我想多了,测试了一大圈,最后发现0xc直接就是变量赋值,结果明明就在眼前啊!!!

于是找了几个眼熟的引脚名称,拿去和老版的openwrt源代码里面的引脚定义对比下,完美契合!

虽然没有找到恢复函数名称的方法,但是能找到变量定义,尤其是引脚定义也是可以啊!!!

于是按照思路写了IDA脚本,是python2脚本,没有int.from_bytes()函数,不够优雅。

tag_start=0x80383fd8
tag_end=0x80387150

def get_str(addr, l):
    temp = ''
    for i in range(0, l):
        temp = temp + ''.join('%02x' % ord(c) for c in get_bytes(addr+i,1))
    return temp

while True:
    if get_str(tag_start, 1) == '80':
        var_addr = int(get_str(tag_start, 4),16)
        var_name = get_strlit_contents(var_addr)
        if var_name != None:
            var_val = get_str(tag_start+11, 1)
            tag_start = tag_start + 0x10
            print var_name + '    ' + str(int(var_val,16))
        else:
            tag_start = find_binary(tag_start+1,SEARCH_DOWN, '80')
    elif get_str(tag_start, 1) == '00':
        var_addr = int(get_str(tag_start+12, 4),16)
        var_name = get_strlit_contents(var_addr)
        if var_name != None:
            var_val = get_str(tag_start+7, 1)
            tag_start = tag_start + 0x24
            print var_name + '    ' + str(int(var_val,16))
        else:
            tag_start = find_binary(tag_start+1,SEARCH_DOWN, '80')
    else:
        tag_start = find_binary(tag_start,SEARCH_DOWN, '80')
        print tag_start     
    if tag_start >= tag_end:
        break

写的不是很完美,因为start到end地址里面类似结构体的变量和数据组长度不一致,有些意义未明,排除了一些干扰,只找 led 和 button 的数据结构。因为这两种长度信息比较固定和统一。

led_gpio

80 2F A7 68 00 00 00 00 00 00 00 02 80 00 00 00 
80 2F A7 80 00 00 00 00 00 00 00 01 80 00 00 00 
80 2F A7 98 00 00 00 00 00 00 00 04 80 00 00 00 
80 2F A7 AC 00 00 00 00 00 00 00 00 80 00 00 00 
80 2F A7 C0 00 00 00 00 00 00 00 06 80 00 00 00 

button_gpio
00 00 01 98 00 00 00 08 00 00 00 01 80 2F 92 74 00 00 00 01 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 
00 00 02 11 00 00 00 03 00 00 00 01 80 2F A7 BC 00 00 00 01 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 
00 00 01 02 00 00 00 0B 00 00 00 01 80 2F 9E 40 00 00 00 01 00 00 00 00 00 00 00 3C 00 00 00 00 00 00 00 00 

运行,bingo,拿到的结果找几个熟知的型号路由器源代码引脚定义 对比下,完全一致,目的达到了。

我相信里面可以挖掘的东西还有很多,函数名称怎么对应,后续有带研究。希望研究有结果的可以告知。

后续修改我没有测试,按理说修改GPIO对应值之后,将内核重新打包,应该是可以达到目的的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

逆向研究QCA9563固件,查看和修改GPIO定义 的相关文章

  • APM32F103CBT6调试接口复用为GPIO配置问题

    APM32F103CBT6调试接口复用为GPIO配置问题 xff1a 可以通过调整复用配置 xff0c 改为GPIO口 xff0c xff08 注意 xff1a 改为上电默认为GPIO口后 xff0c 将无法再用调试功能 xff0c 慎重选
  • STM32Cube STM32L053配置GPIO达到最低功耗详解含测量实际电流值

    外部有上拉电阻 xff0c 设置输入模式 xff0c 此模式最省电 设置输入模式 GPIO InitStruct Mode 61 GPIO MODE INPUT GPIO InitStruct Pull 61 GPIO NOPULL 外部有
  • LINUX 操作GPIO口

    两种方法 1 写驱动的方式 缺 2 通过linux提供的用户空间 终端控制 通过在用户空间上来操作GPIO xff0c 控制入口在 xff1a sys class gpio 首先确认内核里是否已选择上gpiolib的sysfs接口功能 默认
  • 一文弄懂GPIO不同模式之间的区别与实现原理

    GPIO全称General Purpose Input Output xff0c 即通用输入 输出 其实GPIO的本质就是芯片的一个引脚 xff0c 通常在ARM中所有的I O都是通用的 不过 xff0c 由于每个开发板上都会设计不同的外围
  • GPIO简介

    1 什么是GPIO xff1f GPIO是General Purpose Input Output xff0c 即通用输入输出端口 xff0c 简称GPIO 作用 xff1a 负责采集外部器件的信息或者控制外部器件工作 xff0c 即输入输
  • GD32VF103之GPIO最小配置

    longan nano是Sipeed xff08 矽速科技 xff09 推出的开发板 xff0c 使用兆易创新的gd32vf103cbt6芯片 xff0c 该芯片是基于芯来科技的Nuclei Bumblebee处理器的32位通用微控制器 x
  • 28335之GPIO输入

    include 34 DSP2833x Device h 34 include 34 DSP2833x Examples h 34 define LED GpioDataRegs GPADAT bit GPIO0 GPIO配置函数 void
  • stm32简介+gpio的C语言封装

  • 0.8 - GPIO的输入输出模式

    GPIO xff1a General purpose input output 从参考手册可知 xff0c GPIO可以配置成上图中的多种模式 xff0c 但是要理解这些名字的含义还是要具体分析GPIO功能框图 xff1a 结合GPIO的输
  • 【STM32F4】二、I/O引脚的复用和映射

    目录 一 基本概念 1 什么是I O引脚 2 什么是I O引脚的复用 二 如何配置I O引脚复用 1 复用器 GPIOx AFRL GPIOx AFRH 和复用功能 AF 2 程序编写 2 1 打开I O时钟和复用功能对应外设时钟 2 2
  • 关于stm32的GPIO的操作

    首先先了解一下输出的模式 比较常用的是 推挽输出 1 GPIO Mode AIN 模拟输入 2 GPIO Mode IN FLOATING 浮空输入 3 GPIO Mode IPD 下拉输入 4 GPIO Mode IPU 上拉输入 5 G
  • MC9S12XEP100引脚的复用方式

    嵌入式码农小明最近在研发一个嵌入式产品 用的MC9S12XEP100芯片 其中三个需求需要通过几个使用SPI通讯的芯片实现 硬件开发人员小红照着芯片原理图布好了线 不知是否是没考虑到SPI通讯可以通过CS line来控制要通讯的从机从而实现
  • 品味树莓派:GPIO Zero库使用入门

    文章目录 目的 基础说明 入门使用 LED PWMLED Button 更多入门例程 类基础说明 注意事项 总结 目的 树莓派有很多GPIO口可供用户使用 官方同时也提供了一些方式来操作这些IO口 其中目前主要推荐的是基于Python的GP
  • 使用HAL库开发STM32:GPIO口基础使用与外部中断

    文章目录 目的 GPIO口基础使用 基础说明 初始化设置 输出与控制 读取端口值 GPIO口与外部中断 总结 目的 对于MCU来说GPIO口的使用是最基础的内容 仅使用GPIO口和延时等 就可以完成很多功能了 GPIO口基础使用 基础说明
  • stm32F1的JTAG、SWJ作为普通引脚使用。禁用JTAG、SWJ。

    stm32F1的JTAG SWJ引脚 为 PA13 PA14 PA15 PB3 PB4 单片机复位后 默认功能为 JTAG SWJ 而实际使用中 一般只使用 SWCLK SWDIO这两个引脚做 Debug 其余的引脚可以空出来 重新定义为普
  • 如何在Python中运行后一段时间内禁用Raspberry Pi GPIO事件?

    每当我的 Raspberry Pi 的 GPIO 引脚出现下降沿时 我就会创建一个事件 但是 我想在每次运行后禁用此事件一段时间 例如 5 秒 我希望在该时间段之后再次启用该事件 我的第一个想法就是使用sleep 5 在实际的事件函数中 但
  • 橙色 PI 上的双 RC522

    我的目标是使用带有 Orange PI 的双 RFID RC522 读取器 到目前为止 我只成功完成了一项工作 阅读 google armbian 和 Orange pi 论坛 这是我到目前为止所做的 硬件连接 单RC 522 MOSI g
  • 什么是 /sys/class/gpio/export 和 `/sys/class/gpio/unexport 机制以及底层 sysfs 功能是什么?

    在 Android 和 Linux 下使用旧版 sysfs GPIO 的第一步是export您要使用的特定 GPIO 引脚 当您完成 GPIO 引脚的操作后unexport it 我一直在寻找一个解释export命令实际上是这样做的 但是我
  • mmap 比 ioremap 慢

    我正在为运行 Linux 2 6 37 的 ARM 设备进行开发 我正在尝试尽快切换 IO 引脚 我制作了一个小内核模块和一个用户空间应用程序 我尝试了两件事 使用以下命令直接从内核空间操作 GPIO 控制寄存器ioremap mmap G
  • 对 FINTEK F81866A 芯片组上的 GPIO 引脚进行编程

    我有一个德承DE 1000 http www cincoze com goods info php id 10工业 PC 具有芬泰克 F81866A http www fintek com tw index php i o controll

随机推荐

  • 错误总结(配置安装Prometheus,启动./prometheus)

    前提 xff1a 下载的操作系统版本要对应 xff0c 不然就会出现二进制文件无法执行 xff01 xff01 xff01 xff01 xff01 xff01 xff01 1 Prometheus配置文档prometheus yml 配置内
  • kali-linux基础命令

    文件与目录操作命令 touch 命令用于创建空白文件与修改文件时间 xff0c 格式为 xff1a touch 选项 文件 cp 命令用于复制文件或目录 xff0c 格式为 xff1a cp 选项 源文件 目标文件 mv 命令用于移动文件或
  • 我,程序员,想做人工智能,可现实劝我回头是岸!

    最近不少准备入行人工智能的粉丝向我吐槽 xff1a 1 人工智能怎么入行 xff1f 应用方向那么多 xff0c 哪个才是最适合自己的 xff1f 2 看了不少人工智能课程 xff0c 但门槛都太高了 xff0c 真正零基础的课程少之又少
  • 如何将Pyecharts绘制的 "地图" 展示在百度地图中?

    人生苦短 xff0c 快学Python xff01 Pyecharts绘图的确很棒 xff0c 尤其是地图 xff0c 那么将你的数据指标 xff0c 展示在百度地图中 xff0c 有时怎么样的一种感觉 xff1f 其实Pyecharts绘
  • 爬虫到底违法吗?这位爬虫工程师给出了答案

    作者 猪哥 来源 裸睡的猪 xff08 ID xff1a IT Pig xff09 一 自述 1 关于大学 我读的大学是个野鸡学校 xff0c 虽说是一个计算机专业 xff0c 但实际的课程内容很杂 CAD 3DMAX Office全家桶之
  • 开发者,你真正关心的问题是什么?| AI ProCon 2019

    2018 年 xff0c 上千名开发者与上百名技术专家齐聚一堂 xff0c 在 CSDN 2018 AI开发者大会上以 AI技术与应用 为核心 xff0c 深度聚焦人工智能的技术创新与行业应用 xff0c 真正做到了 只讲技术 xff0c
  • JETSON XAVIER NX入门教程(一)基础设置和安装

    1 Intro jetson xxx系列 作为nvidia公司的AIOT产品 作用非常强大 生态也是很活跃 确实是可以入门的极好产品 此处省去几万字 2 Basic install 2 1镜像烧录 就是下载不对型号设备的镜像 官网链接 然后
  • Nvidia Jetson nano 插卡插hdmi和电源无法开机显示器黑屏jetsonnano重置系统恢复

    Ensure smooth network 确保网络畅通 下载包 进下载页面下载对应NVIDIA SDK Manager NVIDIA Developer Upload deb to ubuntu vm 上传包 Install deb 安装
  • 激光雷达目标检测 (上)

    激光雷达目标检测 xff08 上 xff09 转载自美团无人专送团队 简介 安全性是自动驾驶中人们最关注的问题之一 在算法层面 xff0c 无人车对周围环境的准确感知是保证安全的基础 xff0c 因此感知算法的精度十分重要 现有感知算法的思
  • apt更换镜像源

    文章转载至 荒野雄兵的博客 https blog csdn net daerzei article details 84873964 系统说明 xff1a VMware14 Pro下Ubuntu18 04 LTS版 xff0c 64位 网上
  • 绝不拖延(转)

    我要立即行动 绝不拖延 从今天起 无论做什么事情 我要立即行动 绝不拖延 拖延是造成人世一切悲剧根源 xff0c 我要竭力避免拖延 如同逃避罪恶的引诱 曾经 我有多少美好的憧憬 我多少远大的理想 我多少切实的计划 因为拖延 而被冲刷得一干二
  • mt7601u linux驱动编译,移植MT7601U AP Linux 驱动至Orangepi-PC2开发板

    简单一下记录移植MT7601U AP Linux 驱动至Orangepi PC2开发板的过程 二 环境描述 1 Orangpi PC2开发板 Linux Orangepi 3 10 65 12 SMP PREEMPT Sat Mar 4 1
  • 黑群晖docker清理缓存_Docker容器日志查看与清理(亲测有效)

    1 问题 docker容器日志导致主机磁盘空间满了 docker logs f container name噼里啪啦一大堆 xff0c 很占用空间 xff0c 不用的日志可以清理掉了 2 解决方法 2 1 找出Docker容器日志 在lin
  • 配置华为s系列交换机mode lacp

    以S5700为例 xff1a 1 创建eth trunk 1 xff0c 并配置成LACP模式 lt Quiway gt system view Quiway sysname SwitchA SwitchA interface Eth Tr
  • 使用 KubeSphere 快速部署 Chaos Mesh

    Chaos Mesh 简介 Chaos Mesh 是一个开源的云原生混沌工程平台 xff0c 提供丰富的故障模拟类型 xff0c 具有强大的故障场景编排能力 xff0c 方便用户在开发测试中以及生产环境中模拟现实世界中可能出现的各类异常 x
  • phpstorm 2018破解版 2018.2下载安装和JetbrainsCrack.jar激活教程

    一 下载phpstrom破解版http www sdbeta com wg 2018 0330 221278 html 二 双击PhpStorm 2018 1 exe运行 xff0c 开始安装 xff0c 进入安装向导 xff0c 点击ne
  • 操作mysql_MySQL:MySQL的基本操作

    那么如果我只想要数据 xff0c 而不想要什么sql命令时 xff0c 应该如何操作呢 xff1f 可将查询存储在一个文件中并告诉mysql从文件中读取查询而不是等待键盘输入 可利用外壳程序键入重定向实用程序来完成这项工作 例如 xff0c
  • winscp 配置(详细)

    winscp 配置 xff08 详细 xff09 问题起因 想在A电脑上直接访问到B电脑的文件 xff0c 不用中间拷来拷去的 xff0c 太麻烦 所以就下载了winscp这个软件 但是在使用时出现了一些问题 xff0c 好在最终都解决了
  • 【电脑配置】二、Windows10+Ubuntu16.04双系统安装

    电脑配置之双系统安装 目录 电脑配置之双系统安装前言一 Windows10安装二 Ubuntu16 04安装1 进入BIOS模式2 分区 三 出现的问题和解决办法1 Ubuntu下引导Windows启动卡死2 Windows时间提前八小时3
  • 逆向研究QCA9563固件,查看和修改GPIO定义

    自己刷了个qca9563用作ap玩 xff0c 奈何GPIO定义不清楚 xff0c wan口灯什么的都不知道引脚定义 某快的GPIO定义网上只有寥寥言语 xff0c 在某鱼商家眼里 xff0c 这些都是能卖钱的机密信息 于是想既然有固件了