找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 7158|回复: 12

[k3c] K3/K3C如何屏蔽固件升级功能?

[复制链接]
发表于 2017-11-17 13:09 | 显示全部楼层 |阅读模式
本帖最后由 php.c 于 2017-11-17 14:47 编辑

K3C新版u-boot加密了,怕升级后不容易刷机了,并且有砖的风险,所以想让固件维持在现有的老版本不让它升级。但进入后台总是弹出提示升级的页面,一不小心就很容易误点,也怕它自己偷偷升级。
请问有没有什么方法禁止它检测升级,或者说控制升级的文件是哪个,把它改改或者直接删掉,达到防止它升级的目的。
已经知道斐讯下载升级文件的服务器是file.soho.phicomm.com.cn,把 127.0.0.1 file.soho.phicomm.com.cn 加入路由器的hosts,现在已经不能自动下载新固件了,但是还是能检测到新版本,进后台还会提示,如何屏蔽掉呢?
我的恩山、我的无线 The best wifi forum is right here.
 楼主| 发表于 2017-11-17 13:14 | 显示全部楼层
看了一下,斐讯检查新版本的服务器貌似是222.73.156.126,114.141.173.20,222.73.156.137,我在iptables里加入了
  1. iptables -I INPUT -s 222.73.156.126 -j DROP
  2. iptables -I INPUT -s 114.141.173.20 -j DROP
  3. iptables -I INPUT -s 222.73.156.137 -j DROP
复制代码

但好像过一段时间会失效,重启也会失效,加入自启也不管用
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 14:18 来自手机 | 显示全部楼层
官方升级不会砖吧?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 14:21 | 显示全部楼层
php.c 发表于 2017-11-17 13:14
看了一下,斐讯检查新版本的服务器貌似是222.73.156.126,114.141.173.20,222.73.156.137,我在iptables里加 ...

不明白牙膏厂用了什么黑科技,iptables几分钟后就会恢复,现在也在发愁这个,坑了一个多星期填不上
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 14:33 来自手机 | 显示全部楼层
变砖是刷机刷的吧?
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 15:47 | 显示全部楼层
paldier 发表于 2017-11-17 14:21
不明白牙膏厂用了什么黑科技,iptables几分钟后就会恢复,现在也在发愁这个,坑了一个多星期填不上

有没有定时任务什么的,crontab。。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 15:53 来自手机 | 显示全部楼层
/usr/sbin/upgrade。。。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-11-17 19:22 | 显示全部楼层
13062678135 发表于 2017-11-17 15:53
/usr/sbin/upgrade。。。

不是这个,我把它名字改了下,x权限也去掉了,还是能检测到更新
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 19:28 | 显示全部楼层
php.c 发表于 2017-11-17 19:22
不是这个,我把它名字改了下,x权限也去掉了,还是能检测到更新

/usr/sbin/auto_upgrade.lua

#!/usr/bin/lua
--include--
local err = require("luci.phicomm.error")
local libphi_cgi = require("luci.adapter.libphi_cgi")
local cursor = require "luci.model.uci".cursor()
local json = require("luci.json")
local libphi_cgi = require("luci.adapter.libphi_cgi")
local string = require "string"

--functions--
function WIFEXITED(status)
        if status <= 0 then
                return status
        end

        local bit = require "nixio".bit

        return bit.rshift(status, 8)
end

function auto_system_upgrade()
        local fs  = require("luci.fs")
        local http = require("luci.http")
        local json = require("luci.json")

        --判断是否升级
        local error, result, data
        local libphi_cgi = require("luci.adapter.libphi_cgi")

        -- define object context
        local obj = [[{"Device.X_LANTIQ_COM_Upgrade.Upgrade.4" : { "State" : null }}]]
        error, data = libphi_cgi.get_conf(obj)

        if error == err.E_NONE then
                --判断升级状态
                result = json.decode(data)
                print(result.Objects[1].Param[1].ParamValue)
                if result.Objects[1].Param[1].ParamValue  == "UPG_REQ" then
                        print("upgrade is running")
                        write_response(err.E_EXPT)
                        return err.E_EXPT  --should be upgrade already error code
                end
        else
                print("get update state failed")
                write_response(error)
                return error
        end

        --设置升级标志
        obj = [[{"action" : "firmware_req"}]]
        error, result = libphi_cgi.do_conf(obj)
        if error ~= err.E_NONE then
                print("req update state failed")
                write_response(err.E_EXPT)
                return err.E_EXPT  --should be req upgrade state error code
        end

        -- upack image, check image, write to flash and reboot

        local check_state = WIFEXITED(os.execute("sh /usr/sbin/check_image.sh > /dev/null"))

        if 0 == check_state then
                -- OK
                result = err.E_NONE
        elseif 1 == check_state then
                -- 系统错误
                result = err.E_SYSTEM
        elseif 2 == check_state then
                -- 不合法升级固件
                result = err.E_INVUPFILE
        elseif 3 == check_state then
                -- 不匹配硬件设备
                result = err.E_INVUPHWID
        elseif 4 == check_state then
                -- 不匹配产品型号
                result = err.E_INVUPPRODUCTID
        elseif 5 == check_state then
                -- 当前设备不满足最低版本要求
                result = err.E_INVUPREQVER
        elseif 6 == check_state then
                -- 当前固件不支持版本降级
                result = err.E_INVUPDGVER
        else
                -- 其他情况
                result = err.E_INVUPFILE
        end
        if result ~= err.E_NONE then
                local obj = [[{"Device.X_LANTIQ_COM_Upgrade.Upgrade.4" : { "State" : "UPG_FAIL" }}]]
                error, data = libphi_cgi.set_conf(obj)
                return result
        end

        --升级镜像
        obj = [[{"action" : "firmware_upg"}]]
        error, result = libphi_cgi.do_conf(obj)
        if error ~= err.E_NONE then
                print("do update state failed")
                return err.E_EXPT  --should be req upgrade state error code
        end

        --读取升级结果
        obj = [[{"Device.X_LANTIQ_COM_Upgrade.Upgrade.4" : { "State" : null }}]]
        error, data = libphi_cgi.get_conf(obj)

        if error == err.E_NONE then
                --判断升级结果
                result = json.decode(data)
                if result.Objects[1].Param[1].ParamValue  == "UPG_SUCC" then
                        print("upgrade is success")
                else
                        print("do update failed")
                        return err.E_EXPT --should do upgrade failed error code
                end
        else
                print("get update state failed")
                return err.E_EXPT --should get upgrade state error code
        end

        --重启
        obj = [[{"action":"reboot"}]]
        error, result = libphi_cgi.do_conf(obj)

        return err.E_NONE
end

--main process--
--check new firmware
local check_upgrade = os.execute("ubus call report check_upgrade > /tmp/check_upgrade")
local retstate
local vernum
local url
local size
local f = io.open("/tmp/check_upgrade", "r")
local t = f:read("*all")
f:close()
os.remove("/tmp/check_upgrade")

if nil ~= t and "" ~= t then
    local jsonData = json.decode(t)
    if jsonData == nil then
        print("Json error")
        return -1
    end
    retstate = jsonData["retLogin"]["retState"]
    vernum = jsonData["retLogin"]["VerNum"]
    url = jsonData["retLogin"]["URL"]
    size = jsonData["retLogin"]["Size"]
end

if (retstate == "1" and vernum == "1") then
        --down firmware
        os.execute(string.format('/lib/upgrade/fw_dl.sh "%s" "%s"', url, size))
        --check and upgrade firmware
        auto_system_upgrade()
end
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 19:29 | 显示全部楼层
php.c 发表于 2017-11-17 19:22
不是这个,我把它名字改了下,x权限也去掉了,还是能检测到更新

/usr/sbin/check_image.sh

#
# Copyright (C) 2010 OpenWrt.org
#
#######固件检测


INFILE=/tmp/fullimage.img
COMBINE_HEAD_FILE=/tmp/combine_head.bin
KERNELFS_FILE=/tmp/firmware.img
FWINFO_FILE=/tmp/fw_info.json
OWINFO_FILE=/tmp/ow_info.json

sync_config_paritition(){
        local FW_VER
        local HW_ID

        local DG_VER
        local RETAIL_REGION
        local PRODUCT_ID

        json_load "$(cat $FWINFO_FILE)"
        json_get_var FW_VER FW_VER

        json_load "$(cat $OWINFO_FILE)"
        json_get_var DG_VER DG_VER
        json_get_var HW_ID HW_ID
        json_get_var PRODUCT_ID PRODUCT_ID
        json_get_values retail_regions RETAIL_REGION

        json_init
        json_add_object fw_info
        json_add_string FW_VER $FW_VER
        json_close_object

        json_add_object ow_info
        json_add_string DG_VER $DG_VER
        json_add_string HW_ID $HW_ID
        json_add_string PRODUCT_ID $PRODUCT_ID
        json_add_array RETAIL_REGION
        for region in $retail_regions; do
                json_add_string RETAIL_REGION $region
        done
        json_close_array
        json_close_object

#        json_dump
        config_util -w "$(json_dump)"
}


platform_check_image() {
        ###unpack image
        /usr/sbin/img_dec $INFILE $FWINFO_FILE $OWINFO_FILE $COMBINE_HEAD_FILE $KERNELFS_FILE
        rm -f $INFILE


        ###check image
        rm -f /tmp/.upgrade_req_ver
        rm -f /tmp/.upgrade_dg_ver


        # 版本检查
        if ! jshn -r "$(cat $FWINFO_FILE)"; then
                echo "Invalid fw_info"
                rm -rf $FWINFO_FILE $OWINFO_FILE $COMBINE_HEAD_FILE $KERNELFS_FILE
                return 2
        fi

        # 对比版本
        . /usr/share/libubox/jshn.sh
        json_load "$(cat $FWINFO_FILE)"
        json_get_var _fw_ver FW_VER
        json_get_var _req_ver REQ_VER
        json_get_var _hw_id HW_ID
        json_get_keys _pids PRODUCT_ID

        _our_hw_id=`uci get dev_info.dev_info.hw_id`
        _our_pid=`uci get dev_info.dev_info.product_id`

        # 比较硬件是否一致
        if [ $_hw_id != $_our_hw_id ]; then
                rm -rf $FWINFO_FILE $OWINFO_FILE $COMBINE_HEAD_FILE $KERNELFS_FILE
                return 3
        fi

        # 比较产品ID是否一致
        local flag=0
        json_select PRODUCT_ID
        for _idx in $_pids; do
                json_get_var _pid $_idx
                if [ $_pid == $_our_pid ]; then
                        flag=1
                        break
                fi
        done
        if [ $flag -ne 1 ]; then
                rm -rf $FWINFO_FILE $OWINFO_FILE $COMBINE_HEAD_FILE $KERNELFS_FILE
                return 4
        fi

        _our_fw_ver=`uci get system.sys.fw_ver`

        # 特殊版本,用于测试,跳过版本校验
        if [[ $(/usr/sbin/verrevcmp $_fw_ver 0.0.0.1) -ne 0 ]]; then

                if [[ $(/usr/sbin/verrevcmp $_our_fw_ver $_req_ver) -lt 0 ]]; then
                        echo "Unsatisfied fw version: $_our_fw_ver < $_req_ver (req ver)"
                        echo "$_req_ver" > /tmp/.upgrade_req_ver
                        rm -rf $FWINFO_FILE $OWINFO_FILE $COMBINE_HEAD_FILE $KERNELFS_FILE
                        return 5
                fi

                _dg_ver=`uci get dev_info.dev_info.dg_ver`
                if [[ $(/usr/sbin/verrevcmp $_fw_ver $_dg_ver) -le 0 ]]; then
                        echo "Unsatisfied fw version: $_fw_ver <= $_dg_ver (dg ver)"
                        echo "$_dg_ver" > /tmp/.upgrade_dg_ver
                        rm -rf $FWINFO_FILE $OWINFO_FILE $COMBINE_HEAD_FILE $KERNELFS_FILE
                        return 6
                fi
                sync_config_paritition
        fi
       
        rm $FWINFO_FILE $OWINFO_FILE
        return 0
}

platform_check_image
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 20:37 | 显示全部楼层
星盟三号领航员 发表于 2017-11-17 15:47
有没有定时任务什么的,crontab。。

如果这么简单早就修复好了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

发表于 2017-11-17 21:51 | 显示全部楼层
不知道能否直接修改版本号
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| 发表于 2017-11-18 00:08 | 显示全部楼层
paldier 发表于 2017-11-17 20:37
如果这么简单早就修复好了

这个进程
  1. crond -c /etc/crontabs -l 5
复制代码

不是计划任务吗
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-25 07:46

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表