移至主內容
DarkRanger's Secret Area

主導覽

  • 首頁
  • 關於本站
  • Linux
  • 程式開發
  • N900
  • 譯文
  • 資訊技術辭典

文章分類

  • 影劇
  • 遊戲
  • 筆記
  • 雜文
  • 資訊技術
  • 站務訊息

最新內容

  • I use zip bombs to protect my server
  • Iconography of the PuTTY tools
  • Fedora 42 安裝 OpenSSL 1.1
  • 關於本站改版的其它替代方案
  • 半途而廢的未破台單機遊戲列表
  • The Big Picture (1997)
  • How-To:Linux 安裝 DevilutionX
  • 於 2012 年建立的一份音樂播放清單
  • How-To:Linux 安裝 Medal of Honor: Allied Assault
  • Fallout 4 (2015)

閱讀 D-Link 路由器的 *.gws 設定檔

發表日期:星期六, 05/16/2015 - 11:23,更新日期:星期一, 12/05/2016 - 15:12

話說日前 DR 在處理一部 D-Link DIR-655 不甚穩定的問題,對於這類問題,總是會很自然而然想說就更新韌體試試看。於是 DR 從路由器下載了設定檔的備份(gateway_settings.gws),然後便將韌體更新至最新版本。但緊接著不幸的事發生了,原本的設定檔再也匯不回去(會出錯),而且韌體也無法降級到較舊的版本。

 

……這種狀況不能先提醒一下嗎?

 

麻煩在於這裡頭有很多設定是沒有事先記錄下來的,尤其是 PPPoE 的連線密碼,當下手邊並沒有任何的紙本記錄可以找到。於是只能著手研究這支 *.gws 檔究竟該如何開啟,它顯然並不是純文字檔或是可以進一步解開的壓縮檔。後來上網查了一下,找到這篇文章:

http://www.shulerent.com/2009/08/21/cracking-the-d-link-settings-file/

 

該文章解釋了 *.gws 其實是一支採特殊編碼的 XML 檔,並且還提供了一支用 VB.NET 開發的解碼暨編碼工具。藉由這支工具,DR 順利將 *.gws 匯出成可以閱讀的 *.xml 檔,也就能夠將路由器的設定逐步復原。

 

不過若繼續閱讀該文章底下的回應,還會看到有不少人實作了其它程式語言的版本,例如 C、Perl、PHP 以及 Python 等等。以下則是 DR 按自己偏好所改寫的 Python 版本,該程式會將相同目錄下的 gateway_settings.gws 匯出成 gateway_settings.xml:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys
import codecs
from lxml import etree

GWS_FILE = "gateway_settings.gws"
XML_FILE = "gateway_settings.xml"
 
def gws_to_xml():
    appdir = os.path.abspath(os.path.dirname(sys.argv[0])).decode(sys.getfilesystemencoding())
    os.chdir(appdir)

    if os.path.isfile(GWS_FILE):
        gws = open(GWS_FILE)
        contents = gws.read()
        gws.close()
        decoded = ""

        for x in range(len(contents)):
            char = ord(contents[x]) - (x % 256)
            if char < 0:
                char = char + 256
            decoded = decoded + chr(char)

        root = etree.fromstring(decoded)
        xml = codecs.open(XML_FILE, "w", "utf-8")
        xml.write(etree.tostring(root, pretty_print=True))
        xml.close()
        print("Done.")

    else:
        print("No file.")
 
if __name__ == "__main__":
    gws_to_xml()
  


 

筆記