自己刷了个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=0x80387150def 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 tempwhile 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 + 0x10print 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 + 0x24print 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_gpio80 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对应值之后,将内核重新打包,应该是可以达到目的的。

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

  1. linux查看文件的有效权限,linux文件权限查看及修改-chmod ------入门的一些常识

    查看Linux文件的权限:ls -l 文件名称 查看linux文件夹的权限:ls -ld 文件夹名称(所在目录) 修改文件及文件夹权限: sudo chmod -(代表类型)×××(所有者)×××(组 ...

  2. 专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook

    专注于非越狱环境下iOS应用逆向研究,从dylib注入,应用重签名到App Hook. 注意!本文所有操作均在以下环境下成功进行,不同平台或环境可能存在某些问题,欢迎大家在issue中提出问题以及相互 ...

  3. 使用objdump objcopy查看与修改符号表

    使用objdump objcopy查看与修改符号表 动态库Linuxgccfunction     我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库.这时需要查看可执行程序或者动态库中 ...

  4. linux7 显示登陆,centos7 查看,修改登录日志

    centos7 查看,修改登录日志 查看登录信息 Linux中涉及到登录的二进制日志文件有 /var/run/utmp /var/log/wtmp /var/log/btmp /var/log/las ...

  5. 6、MySQL查看和修改事务隔离级别

    本节主要介绍查看和修改事务隔离级别的几种方法. 查看事务隔离级别 在 MySQL 中,可以通过show variables like '%tx_isolation%'或select @@tx_isol ...

  6. 6、存储函数详解,创建,查看,修改,删除

    存储函数和存储过程一样,都是在数据库中定义一些 SQL 语句的集合.存储函数可以通过 return 语句返回函数值,主要用于计算并返回一个值.而存储过程没有直接返回值,主要用于执行操作. 在 MySQ ...

  7. linux系统怎么查看权限设置密码,linux系统怎么查看及修改文件读写权限设置

    在linux中查看与修改文件权限我们都必须使用命令来操作,不能像windows一样点几下就好了,那么linux系统怎么查看及修改文件读写权限设置?接下来大家跟着学习啦小编一起来了解一下linux系统查 ...

  8. 【mysql知识点】查看和修改系统参数

    如何查看和修改系统参数? 在MySQL里,参数也可以叫变量(Variables),一般配置文件为:/etc/my.cnf.当MySQL实例启动时,MySQL会先去读一个配置参数文件,用来寻找数据库的各 ...

  9. linux查看和修改当前系统时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  10. 查看、修改linux系统的最大链接数限制、文件描述符限制、端口范围限制、虚拟内存等...

    一.修改最大连接数 1.查看当前文件描述符的限制数目的命令: ulimit -n 2.修改文件描述符的限制数目 2.1 临时改变当前会话: ulimit -n 65536 2.2 永久变更需要下面两个 ...

最新文章

  1. 前端和后端开发人员比例_前端开发人员vs后端开发人员–实践中的定义和含义
  2. 内核版常见问题和精华贴总结(VER 0.1) [
  3. 正确使用计算机网络,如何正确使用计算机网络
  4. php基础_变量和比较符
  5. python 设计模式之装饰器模式 Decorator Pattern
  6. 一元(多元)线性回归分析之R语言实现
  7. html5编写商城页面,HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第2章HTML基础知识...
  8. StringUtil工具类 之 字符串长度截取函数
  9. dreamweaver php网站模板,Dreamweaver软件-教你一分钟搞定一个网页模板
  10. Java里面的Lambda表达式
  11. syzlang语法编写案例学习 —— Looking for Remote Code Execution bugs in the Linux kernel
  12. TypeScript简记
  13. js获取当前是第几周
  14. 2022年docker面试题大全(持续更新中)
  15. 腾讯云服务器备案全流程详细内容记录40天备案的血与泪
  16. 鸿蒙系统怎么打开纯净模式,#手机[超话]##2021有点东西##OPP... - @安诺颜_ 的微博精选 - 微博国际站...
  17. 杰理AC692X学习-BLE与APP端发送与接收
  18. 什么大牛不大牛,先A500题再说吧
  19. 程序员的四境界、七宗罪与七武器 [转载]
  20. 盛大陈天桥:想创业 你就大胆提出来

热门文章

  1. JSON 数据类型转换工具
  2. 面试官:说说Java反射机制
  3. centos7 分辨率修改,CentOS 7 修改屏幕分辨率
  4. c语言输出指定年份中所有的星期六,用C语言编写程序打印任意年份的日历
  5. android微信代码大全,微信满屏表情代码大全复制
  6. JsonUtils工具类
  7. 高校后勤管理系统java代码_《高校后勤管理系统的设计与实现》论文笔记二
  8. python论文画图模板
  9. 基于微流域划分的洪水淹没分析
  10. Linux多线程编程入门