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

話說日前 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()
  


 

分類: