DaHuaFirmware_emulation
大华固件模拟
用grep搜httpd的方式找到web服务启动脚本,为sonia,arm架构,小端可执行文件
qemu用户模式去启动,发现报错,卡在了PDI_productGetHwidInfoByChip函数
qemu-arm -L . ./bin/sonia
grep搜一下这个函数,发现此函数是在lib目录下名为libpdi.so的动态链接库文件中
把这个动态链接库反汇编然后查看这个PDI_productGetHwidInfoByChip函数,发现是存在一个死循环,推测我们是进入了这个循环所导致的
一开始我单独的去把while的死循环给patch掉了,可以管一时之用,但后面紧接着又报错很多其他类似上述死循环的函数,而且不太好改,推测它处于一个大范围的硬件函数中,因此我们这里可以查看谁调用了PDI_productGetHwidInfoByChip函数(但目前来说很多不太好确定是谁)或者把这个函数直接返回0(采用这种方式)
把PDI_productGetHwidInfoByChip函数patch为:
1 | MOV.W R0, #0 |
上面的两段汇编相当于return 0,改完后PDI_productGetHwidInfoByChip函数是这样的,直接返回0了
改完后输出了很多的信息,但是在PDI_getChipInfo处卡住了
同样先grep,发现这个函数同样是在这个libpdi.so动态链接库中的,反汇编发现也是卡在了一个while(1)的死循环地方
查看它的调用,还是太多了,因此继续改,不过跟上面有点区别
修改内容:
1 | CBZ R0, loc_78C1C 修改为了B loc_78C1C |
改完后反汇编ok
输出的信息又多了一倍,卡在了函数PDI_productGetInfo处
又是这种死循环,出错函数是PDI_productGetInfo
因为函数开头又很多寄存器,其实也可以直接覆盖用我们自己的return 0汇编指令,但最好还是间接,对arm不熟悉还是拿个中间跳板吧
修改如下
CBZ R0, loc_78F74 ——>B loc_78F74
MOV.W R0, #0xFFFFFFFF —> MOV.W R0, #0
又卡住了,并且输出了上一次改动的地方旁边的信息
卡住的函数为PDI_productGetName,调用成功应该返回0
同理修改
提示段错误
查看有哪些调用了PDI_productGetName函数,发现挺多的,随便点进去几个看看
在PDI_getFaceboardCfg函数里发现原因就是调用PDI_productGetName函数时传进来的参数(作为PDI设备名字的)为空或者非法值导致的崩溃,返回值并没有错应该是0
这个函数可以发现,下面如”SD6C80FA-GNX”、”SD6C82FA-GNX”等为合法的设备名字,如果我们在调用设备的时候给参数赋值为前面合法的值就好啦
同理其他调用者也可能会出现上述错误
在上述libpdi.so几个函数中依然没有找到是谁调用PDI_productGetName函数时产生的错误,因为我搜索最近的输出的信息的字符串并没有,因此推测可能是其他二进制文件调用了此函数产生的报错!去看看,grep找一下是谁,
因此我们换一种角度,可能是别的二进制文件调用了此动态链接库的PDI_productGetName函数,因此去grep一下字符串”Video Server - (C) 2011-2013 ZheJiang Dahua Technology“果然有个sonia
找到这段字符串的地址,进去看看调用它的函数
函数sub_9BBA09就是输出蓝绿色字符串信息的函数了,但是它下面并没有调用出错的函数,查看调用它的函数只有sub_9BBAA2调用过它两次
总启动函数:sub_3B2F8
将出错的函数NOP掉直接乱了,似乎这样并不可取
但是这样能运行,只不过好像又卡了一个死循环,但这个死循环还没找到是在动态链接库libpdi.so的哪个地方
后续仍在研究中