逆向研究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定义 的相关文章

  • xilinx ZYNQ 7000 AXI GPIO

    0AXI GPIO 第一部分 PS 和 PL之间的通讯有一个接口称为AXI AXI总线具体的内容这边不去深究 xff0c 可以理解为一种特殊协议的通讯方式 AXI GPIO是什么意思 xff1f PL是FPGA它可以做成任何你想要的东西 x
  • GPIO实验

    一 GPIO简介 GPIO xff08 General purpose input output xff09 即通用型输入输出 xff0c GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连 xff0c 从而实
  • 欧启标O老师STM32课程笔记(三)——GPIO模块寄存器的封装

    3 1 结构体基础知识 3 1 1 结构体类型的定义 span class token keyword struct span 结构体类型名 span class token punctuation span 成员列表 span class
  • 【STM32】GPIO_InitTypeDef GPIO_InitStructure;语句的理解

    这句话声明一个结构体 xff0c 名字是GPIO InitStructure xff0c 结构体原型由GPIO InitTypeDef 确定 xff0c 在stm32中用来初始化GPIO 设置完GPIO InitStructure里面的内容
  • Jetson Xavier gpio编程 (8)

    GPIO lines are attached to gpiochips Look in sys class gpio and you should see gpiochip240 248 and 288 I haven t yet det
  • 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语言封装

  • AIR103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方社区库接口GPIO库使用及示例进行复现及分析 了解该的基本原理及操作方法 软件及工具版本 LuatOS AIR103 b
  • RT-Thread记录(十三、I/O 设备模型之PIN设备)

    讲完UART设备之后 我们已经熟悉RT Thread I O 设备模型了 回头看看基本的 PIN 设备 目录 前言 一 PIN 设备模型解析 1 1 初识 GPIO 操作函数 1 2 PIN 设备框架 1 3 PIN 设备驱动框架层 实现的
  • 品味树莓派:GPIO口定义、电气特性、启动状态等基础说明

    文章目录 目录 GPIO口定义 电气特性 启动状态 总结 目录 树莓派相比成品化的电脑来说有很多独立的GPIO口可供开发使用 可以方便的实现很多实物相关的功能 本文将对树莓派开放给用户的GPIO口的针脚定义 电气特性 启动状态等基础内容做个
  • [STM32系列]二、实现STM32 GPIO端口状态实现最大速度翻转

    STM32系列 二 实现STM32 GPIO最快速度翻转 文章目录 STM32系列 二 实现STM32 GPIO最快速度翻转 前言 一 实验准备 二 测试 1 C语言翻转测试 2 汇编翻转测试 总结 前言 在STM32F103系列应用过程中
  • ESP32引脚参考

    原文链接 ESP32引脚参考 您应该使用哪个GPIO引脚 360doc个人图书馆 总结的相当全面 ESP32简单易懂的GPIO使用注意事项 首先上图 GPIO建议列表 特别的在硬件上要注意使用外接模块时不能将GPIO12拉高 否则将导致ES
  • 树莓派gpio接ttl转usb串口调试

    树莓派设置修改 以下教程只在树莓派3B 验证测试通过 其它版本未经测试仅供参考 1 gt 修改config txt enable uart 1 找到这行 将值改为1 dtoverlay pi3 miniuart bt 在config txt
  • 如何在Python中运行后一段时间内禁用Raspberry Pi GPIO事件?

    每当我的 Raspberry Pi 的 GPIO 引脚出现下降沿时 我就会创建一个事件 但是 我想在每次运行后禁用此事件一段时间 例如 5 秒 我希望在该时间段之后再次启用该事件 我的第一个想法就是使用sleep 5 在实际的事件函数中 但
  • android.os.ServiceSpecificException:GPIO2_IO02 已在使用中(代码 16)

    我正在研究 android 的东西 Pico i MX7D I O 我得到了android os ServiceSpecificException GPIO2 IO02 已在使用中 代码 16 异常 这是什么意思 请帮我 我的示例程序是从克
  • 使用多个线程多次调用一个方法

    我想要一个 LED 闪烁 同时我的 Raspberry 上正在做一些工作 我在 Python 脚本中使用 LED 线程 初始代码 import RPi GPIO import time import threading pinLED 10
  • 如何设置虚拟 GPIO 环回

    我目前正在开发一个应该在 Net 中使用 gpio 引脚的程序 我想在虚拟 GPIO 引脚上测试我的程序 但我不知道该怎么做 我想做一个环回 将虚拟 GPIO 1 连接到另一个虚拟 GPIO 2 我已经对串口和 tty0tty 做了类似的事
  • Beaglebone GPIO 输入不起作用

    我正在使用 beaglebone 通过 sysfs 接口访问特定引脚的数字输入 我可以更改输出状态 但不能更改输入 我所做的是 我有两个引脚 pinA 和 pinB pinA 我将其输出 pinB 我将其输入 将 pinA 连接到 pinB
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • Linux、ARM:为什么仅当启动时存在 I2C GPIO 扩展器时才创建 gpiochip

    在 imx6sx 硬件平台 NXP 嵌入式 ARM 上使用 Linux 3 14 52 问题是设备树中指定的 PCF8575 I2C GPIO 扩展器不会实例化为 sys class gpio 结构中的设备 除非它们在内核启动期间存在 这些

随机推荐

  • 错误总结(配置安装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 这些都是能卖钱的机密信息 于是想既然有固件了