「開發的公司已經不存在了」「當初製作的負責人已離職,聯絡不上」「伺服器裡雖然有執行檔和資料庫,卻找不到原始碼,也找不到規格書」── 這是中小企業業務系統諮詢中,絕不罕見的狀況。即便如此,系統今天依然在運作,業務也仍然依賴著它。
在這種狀態下,最糟糕的選擇就是因為「不太清楚」而開始摸索式的改版,或憑想法擅自變更環境。沒有原始碼的系統,一旦壞掉,並不保證能夠修好。另一方面,一開始就斷言「什麼都做不了,只能全面重建」,也是操之過急。即使沒有規格書,也有復原規格的方法;即使沒有原始碼,也有可能讀懂內容。本文將依實務上的先後順序,整理從一無所有的狀態到成立維運・維護的整套步驟。
1. 先講結論
- 最先該做的不是改版,而是「現狀的保全」。正在運作的正式環境本身就是最重要的資產。取得磁碟映像備份(例如以 Disk2vhd 進行虛擬機器化)與資料庫備份,並確認到能夠復原為止,才進入下一步。1
- 即使沒有規格書,規格也能夠復原。主要的材料是對業務使用者的訪談、畫面・報表、資料庫結構描述、日誌,以及透過 Process Monitor 觀察的實際行為。2
- 原始碼的可復原程度,會因技術堆疊而大不相同。若是 .NET 製作,用 ILSpy 等反編譯器可以讀懂相當多的內容;另一方面,VB6 或 C++ 等原生程式碼,現實中並不能期待能夠復原。34
- 反編譯存在法律上的爭議點。根據著作權法第30條之4,以調查解析為目的的利用原則上被視為允許,但仍必須確認合約(使用授權條款)。5
- 不要等到「完全理解之後」才行動。優先掌握「一旦停止就會使業務停擺」的部分,以及「近期就需要變更」的部分,變更則以小步且可回復的方式,一項一項地進行。
- 維護合約以準委任為基本原則。對於內容不明的系統進行調查,無法承諾完成責任(承攬)。應將調查階段與改版階段分開簽約。
本文依照實務上的執行順序構成。整體樣貌如下所示。
flowchart TD
A["第3章 保全<br/>凍結變更・磁碟映像<br/>資料庫備份與復原確認"] --> B["第3章 盤點<br/>執行檔・自動啟動・工作<br/>設定・對接對象・帳號"]
B --> C["第4章 規格復原<br/>訪談・畫面與報表<br/>資料庫結構描述・實際行為觀測"]
C --> D["第5章 技術可行性<br/>技術堆疊評估<br/>反編譯與法律確認"]
D --> E["第6章 方針決定<br/>延命・包裝・部分重建・全面重建"]
E --> F["第7章 維運轉移<br/>驗證環境・變更台帳・監控・合約"]
C -.->|"復原後的規格台帳<br/>無論選擇哪種方針都會成為資產"| E
圖1:交接的整體流程與對應章節
各工程所需的時間,會因系統規模(畫面・報表・批次處理的數量)、技術堆疊、業務端能撥出多少時間接受訪談,以及「了解到什麼程度才算足夠」的目標設定而有很大差異,因此在著手前無法設定統一的估算標準。提高估算精確度的唯一捷徑,就是先完成第3章的盤點、數出對象的數量。在數量出爐之前,無法估算規格復原所需的期間。反過來說,盤點是應該在短期間內結束的工程,若在此拖延,之後的所有計畫都將無從擬定。
2. 為何會產生「一無所有」的狀態
在思考對策之前,先確認自家公司屬於哪一種模式,有助於推測還留有哪些線索。
| 模式 | 典型的經過 | 通常還留有的東西 |
|---|---|---|
| 開發公司歇業・撤出 | 維護合約已到期數年,且已聯絡不上 | 交付時的CD-R・驗收單・合約書(有時沉睡在檔案庫中) |
| 內部開發負責人離職 | 由單一負責人製作,維持在人依附狀態下離職 | 該本人的電腦・共用資料夾中的開發環境或原始碼片段 |
| 事業轉讓・併購 | 連同系統一起接手,但文件並未一併移交 | 轉讓合約的清單、與舊公司負責人的聯絡管道 |
| 有原始碼但無法信任 | 找到了原始碼,卻無法保證與正在運作的執行檔一致 | 建置日期時間・版本資訊的比對材料 |
最後這種模式容易被忽略,但實質上必須以與「沒有原始碼」相同的方式來處理。以舊原始碼為準進行改版,結果發現正式環境的執行檔其實已被加入了數年份的修改,這是典型的失敗案例。即便找到了原始碼,在建置並與正式環境的執行檔比對確認之前,也請不要輕易信任它。
無論是哪一種模式,先尋找合約書・交付單・驗收單都是有價值的。若上面寫明了著作權的歸屬或原始碼的交付義務,就能成為之後交涉與法律整理的基礎。
3. 最初一週該做的事 ── 現狀的保全與盤點
3.1 凍結變更
在調查結束之前,原則上不對目標伺服器・終端進行任何動作。「先更新一下作業系統吧」「整理一下看起來沒在用的檔案吧」這類舉動可能會是致命傷。因為既然沒有原始碼,一旦壞掉就沒有「修好」這個選項。也應考慮將更新的套用時機納入管理,以避免自動更新(Windows Update、防毒軟體的行為變更)擅自改變環境。
3.2 備份 ── 將環境本身複製為資產
光靠檔案層級的備份並不足夠。這類系統的作業系統設定・登錄檔・執行環境・部署位置,全部都有可能是「能夠運作的理由」的一部分,因此要保全整個磁碟映像。
實務上常用的是 Sysinternals 的Disk2vhd。它可以讓運作中的系統保持連線狀態,透過 Windows 的磁碟區快照功能(VSS:Volume Shadow Copy Service,磁碟區陰影複製服務)轉換成某一時間點具有一致性的 VHD/VHDX,成為在 Hyper-V 上以虛擬機器啟動之驗證環境的基礎。1 好處是能夠同時推進實體伺服器的老舊化對策與驗證環境的確保(另外,OEM 授權的 Windows 有時在授權上不允許遷移至虛擬環境,因此需要確認授權形式1)。
Disk2vhd 是只有一個畫面的簡單工具,但一旦選錯,就會做出「無法啟動的映像」。請依下列順序進行。1
- 準備輸出目的地。VHD/VHDX 雖然也能建立在轉換對象的磁碟區上,但官方文件也明確指出,輸出到與對象不同的磁碟(外接硬碟或 NAS 等)性能較好。可用容量請預留至少等同於所選磁碟區已使用空間總和的大小。
- 確認 BitLocker。Disk2vhd 不支援轉換已啟用 BitLocker 的磁碟區。若為此情況,需事先解除 BitLocker,等待解密完成後再執行。
- 選擇要納入的磁碟區。在系統保持啟動的狀態下執行工具,會顯示該系統的磁碟區清單。此處所選磁碟區所在的每一個磁碟都會產生一個 VHD,分割區結構會被保留,但只有所選磁碟區的內容會被複製。因此,若想要能夠驗證啟動,就必須同時選擇 Windows 所在的磁碟區(通常是 C:),以及啟動所需的系統分割區(系統保留區/EFI 系統分割區)。若排除純資料用的磁碟區,就能節省相應的容量與時間。
- 視需要以命令列執行。若想在夜間執行,可以用
disk2vhd <磁碟機:> [磁碟機:] ... <輸出檔案>的形式寫成腳本。若要以全部磁碟區為對象,則像disk2vhd * e:\backup\snapshot.vhdx這樣指定*。 - 驗證啟動請在 Hyper-V 上進行。在 Hyper-V 管理員中建立虛擬機器,將產生的 VHD 以 IDE 磁碟的形式加入組態。首次啟動時,Windows 會偵測虛擬機器的硬體,若映像內含有驅動程式便會自動安裝;若沒有,則安裝 Hyper-V 的整合元件。
- 不要掛載在建立來源的機器上啟動。若在同一系統上掛載 VHD,Windows 為避免與原始磁碟的簽章衝突,會為該 VHD 指派新的磁碟簽章。由於啟動組態資料(BCD)是以磁碟簽章來參照磁碟,在這種狀態下啟動虛擬機器,會因找不到啟動磁碟而失敗。驗證啟動請務必在另一台機器(Hyper-V 主機)上進行。
同時,資料庫請以 DBMS 標準的方式取得備份。而最重要的一點是,要實際從備份復原並確認能夠啟動。沒有做過復原測試的備份,只不過是一份自以為存在的保險。不過,復原後的映像中仍原封不動地保留著正式環境的連線設定與排程工作,因此啟動確認務必在與網路隔離的狀態下進行(詳見第7章)。若不小心在保持連線的狀態下啟動,原本打算用來驗證的環境就會更新到正式環境的資料庫或對接對象。
3.3 盤點 ── 將正在運作的內容製成清單
接著,機械式地列出系統的構成要素。這項工作靠的不是敏銳度,而是全面性。
| 盤點對象 | 確認方式 | 觀察重點 |
|---|---|---|
| 執行檔全套 | 安裝資料夾、Program Files 底下 | EXE/DLL 的檔案版本・更新日期時間・數位簽章 |
| 會自動啟動的項目 | Sysinternals Autoruns6 | 啟動項目、服務、常駐處理序 |
| 排程工作 | 工作排程器 | 夜間批次、月度・年度處理(也要查看執行歷史) |
| 資料庫 | 連線字串、ODBC 設定 | 連線目標伺服器、結構描述、是否與其他系統共用 |
| 設定 | INI 檔、登錄檔、app.config 等 | 路徑、連線目標、動作模式的切換 |
| 與外部的對接 | 共用資料夾、FTP、寄送郵件、外部 API | 對方與方向(是匯入還是傳出) |
| 帳號・憑證 | 服務執行帳號、憑證存放區 | 密碼・憑證的有效期限(無聲的定時炸彈) |
若「不知道設定檔或輸出目的地在哪裡」,用 Process Monitor 觀測處理序的檔案・登錄檔存取是最快的方法。應用程式實際讀寫的路徑會直接呈現為清單。2
4. 即使沒有規格書,規格也能夠復原
透過盤點了解「有什麼」之後,接下來就是復原「在做什麼」。材料已經齊全。
- 對業務使用者的訪談 ── 最大的規格書,就在每天使用該系統的人的腦中。沿著日常・月度・年度的業務流程,訪談在哪個畫面輸入什麼,會產生什麼結果。特別是年度處理(結算、盤點、年度更新)連負責人自己都可能忘記,是交接後首次執行時最容易出事故的環節。
- 畫面與報表 ── 用截圖與實物樣本,將所有畫面・所有報表製成台帳。光是輸入項目與輸出項目的對應關係,就能相當程度看清處理的骨架。
- 資料庫結構描述與資料 ── 資料表定義、限制、代碼值的實際資料,是業務規則的化石。「這個旗標的值只用到3種」之類的觀察,會告訴你畫面上看不出來的規格。
- 日誌與事件日誌 ── 若有應用程式自有的日誌,可讀出處理流程;從 Windows 事件日誌則能看出過去的錯誤傾向。
- 實際行為的觀測 ── 用 Process Monitor 記錄檔案・登錄檔・網路的存取,就能在沒有原始碼的情況下,佐證「月底這項處理,讀取的是這個共用資料夾裡的 CSV,並與這台資料庫伺服器通訊」這樣的輸入輸出對應關係。2 不過 Process Monitor 只能得知到通訊對象為止,看不出哪個資料表被如何更新。再往下就要靠 DBMS 端的追蹤・稽核功能(如 SQL Server 的擴充事件等),或是在處理前後比對資料庫內容的方式來鎖定。
這裡重要的是,不要企圖均等地將全部功能文件化。目的不是百科全書,而是維運的延續,因此應優先處理「一旦停止業務就會停擺的處理」「發生錯誤的處理」「近期需要變更的部分」,將調查過的範圍逐步累積到台帳中。
訪談的型式 ── 對誰、問什麼、怎麼記錄
「詢問使用者」說起來簡單,但若不先決定好詢問的對象與問題,最後只會變成閒聊。實務上,分成以下3個層級,各自撥出不同的時間,才是確實的做法。
| 對象 | 能了解到的事 | 詢問方式 |
|---|---|---|
| 日常操作負責人 | 實際的畫面操作、例外處理的手動作業、「一貫的迴避方式」 | 在實機前,請對方實際示範平常的作業並詢問 |
| 業務負責人・管理職 | 報表的使用方式、業務規則的依據、系統外的運用 | 在會議室,並排實際輸出物並詢問 |
| 資訊系統負責人・前任者 | 對接對象、伺服器架構、過去的故障與改版經過 | 一邊出示第3章的盤點表,一邊詢問填不出來的欄位 |
問題每次都沿用相同的項目。以下這10個問題可作為基礎,跨系統也能通用。
- 在這套系統上,每天一定會執行的操作是什麼?大約在什麼時間、大約幾件?
- 有沒有只在月度・年度才做的操作(結帳處理、結算、盤點、年度更新等)?上一次是什麼時候、由誰執行的?
- 輸入所依據的紙本・檔案・郵件是什麼?來自哪裡?
- 這套系統會輸出的東西(報表、CSV、向外部發送)是什麼?之後會傳到哪裡?
- 系統一旦停止,業務最多能撐幾個小時?屆時能不能用人工方式代替?
- 有沒有「唯獨這個操作絕對不能做」的口耳相傳?知道原因嗎?
- 目前有沒有靠人工彌補的部分(謄寫、用 Excel 重新彙總、目視檢查等)?
- 最近1年內有沒有發生過錯誤或問題?當時是如何處理的?
- 有哪些畫面・功能是沒在使用的?從什麼時候開始不用的?
- 如果可以修改,最傷腦筋的事情是什麼?
記錄方式也要事先決定好。要點在於,將回答與畫面名稱・報表名稱・資料表名稱等專有名詞連結起來留存,若能細化到「從月次銷售彙總畫面(F050)列印銷售月報」這種粒度,而不是只寫「月底彙總」,就能與第3章的盤點表以及之後的資料庫調查相互比對。若可行請進行錄音,現場則專注於記錄專有名詞與操作順序。問題5的回答,會用於第6章的方針判斷;問題6與7的回答,則是隱藏規格所在位置的線索。
5. 沒有原始碼時,技術上能做到什麼
「讀懂內容」能夠期待到什麼程度,幾乎取決於系統是用什麼技術製作的。請先從執行檔的內容屬性或 DLL 組成推測技術堆疊,再設定期待值。
首先,先簡短定義本章會用到的術語。
| 術語 | 意義 |
|---|---|
| IL(中間語言) | Intermediate Language。C# 或 VB.NET 的編譯器最先輸出的中間格式程式碼。由於型別名稱・方法名稱・處理結構會被保留,因此可以用反編譯器還原成接近原始碼的形式 |
| JIT(執行時期編譯) | Just-In-Time。在執行前一刻將 IL 轉換為機器語言的機制。一般的 .NET 應用程式以這種方式運作 |
| Native AOT(事前編譯發行) | Ahead-Of-Time。在發行時就將 IL 轉換為機器語言,執行時不使用 JIT 的 .NET 發行方式。成品中不會保留 IL |
| 反編譯 | 從執行檔重新建構出高階語言原始碼。對於像 IL 或 Java bytecode 這種保留結構資訊的格式較為有效 |
| 混淆處理(obfuscation) | 將類別名稱・方法名稱替換為無意義的字串等,使反編譯結果變得難以閱讀的加工處理 |
| PDB(符號檔) | Program Database。建置時產生的偵錯資訊檔案。若留存在執行檔旁邊,會讓解析工作輕鬆許多 |
| 技術堆疊 | 內容的可復原程度 | 主要手段 |
|---|---|---|
| .NET(C#、VB.NET)── 一般的 IL 格式 | 高 | ILSpy 等反編譯器。Visual Studio 中也內建了以 ILSpy 為基礎的反編譯功能43 |
| .NET ── Native AOT 發行 | 低(與原生程式碼同等) | 由於不含中間語言(IL),已轉換為原生程式碼,無法期待用反編譯器復原出 C# |
| Java | 高 | 同樣可用反編譯器讀取(因為是中間程式碼) |
| Web 系統(PHP 等指令碼語言) | 原本伺服器上就有原始碼的情況居多 | 優先確認伺服器內部相當有價值 |
| VB6 | 低 | 機械式復原成接近原始碼的形式並不現實,主要以行為為基礎的解析與部分重新實作為中心 |
| C / C++(原生) | 低(專業性高) | 雖然可以進行反組譯或產生偽代碼,但成本高。應聚焦於重點解析,而非全面復原 |
以一般 IL 格式部署的 .NET 應用程式,情況相當不錯,反編譯得到的 C# 程式碼,對於理解處理內容而言已足夠實用。不過正如官方文件也明確指出的,註解・區域變數名稱・空白等編譯時不需要的資訊會遺失,因此應將其定位為「用來理解動作的資料」,而非原始碼的替代品。3 但也有例外。若施加了混淆處理(obfuscation),解讀難度會大幅提高;而以 Native AOT 發行的二進位檔案不含 IL,因此「因為是 .NET 製作所以能讀懂」的期待並不成立。Native AOT 是 .NET 7 中導入的發行方式,官方文件也明確寫明「在發行的時間點,事前編譯器就會將 IL 編譯為原生程式碼」「Native AOT 應用程式在執行時不使用 JIT 編譯器」。7 也就是說,反編譯器所要讀取的對象本身並不會保留在成品中。在評估技術堆疊時,請不只確認開發語言,連部署形式也一併確認。
若執行檔旁邊還留有 PDB(符號檔),有時甚至能復原函式名稱,以及(若有內嵌原始碼的話)原始碼本身。其中包含什麼內容、能夠期待什麼,已在「PDB(程式資料庫)是什麼」中整理。
法律上的注意事項 ── 反編譯要「先調查後行動」
技術上做得到的事,與可以做的事是兩回事。包含反編譯在內的逆向工程,存在著作權法上的爭議點,根據平成30年(2018年)修正時新增的著作權法第30條之4(不以享受著作物所表現之思想或感情為目的之利用),以程式的調查解析為目的的重製・改作,在被認定為必要的限度內,原則上被視為允許。不過條文中有「若對著作權人利益造成不當損害,則不在此限」的但書,例如利用解析結果來製作競爭產品的情況,就可能得到不同的評價。5
此外,若套裝軟體或交付物的使用授權合約中包含禁止解析的條款,該如何看待其效力,也仍是合約上的爭議點。實施前,請確認對象軟體的授權條款,以及當時的開發委託合約(著作權歸屬條款),若有疑慮,請諮詢律師。若交付物的著作權歸屬於自家公司,這個問題就會大幅簡化。關於合約書的閱讀方式,也可以參考「委託開發‧維運的合約該怎麼簽?」。
法律論述本身屬於專家的領域,但在諮詢之前,公司內部應先蒐集好的材料是固定的。先把以下項目填好,判斷就會更快。
| 確認項目 | 要看什麼 | 找不到時 |
|---|---|---|
| 是否有開發委託合約書 | 當時的合約書・訂購單・規格書一整套 | 連會計憑證、簽呈、郵件的保存庫都要找。如第2章所述,有時會沉睡在檔案庫中 |
| 著作權歸屬條款 | 是否有「著作權讓與甲方」等條款,以及著作權法第27條・第28條的權利(改作權等)是否包含在讓與對象內 | 若歸屬不明,原則上應視為仍留在開發方,並確認之後的項目 |
| 使用授權合約(EULA)的禁止解析條款 | 套裝軟體或隨附函式庫的授權本文 | 確認安裝程式內、安裝目的地資料夾、交付物 CD-R 之中 |
| 第三方函式庫・OSS 的混入 | 執行資料夾內的 DLL 及其授權標示 | 自家發包部分與第三方產品的判斷不同,需先將對象區分開來 |
| 解析的目的 | 是否純為「自家公司持續使用所需的維護・調查」,有沒有混入其他目的 | 目的是否落在第30條之4「非以享受為目的之利用」的框架內,取決於此處 |
| 解析結果的用途 | 復原的內容要用到什麼程度、給誰、為了什麼目的 | 事先排除是否混入了競爭產品開發等可能不當損害著作權人利益的用途 |
| 解析的範圍 | 是否限定在業務延續所需的部分 | 為了能說明「被認定為必要的限度」,將對象部分與理由留下記錄 |
6. 延命、包裝,還是重建
在調查中獲得的理解程度與業務端的情況齊備之後,就要決定方針。這裡同樣不應以「全面重建為前提」或「原封不動放著為前提」,而是用判斷表來整理。
| 選項 | 適合的情況 | 主要風險 |
|---|---|---|
| 原封不動延命(固定環境・虛擬化) | 使用終止時期已可預見在數年之內。幾乎沒有變更需求 | 作業系統・執行環境的壽命,以及與安全性更新之間的兼顧 |
| 包裝後延命(不動本體、新開發周邊部分) | 本體穩定,需求集中在輸入輸出或對接的新增上 | 邊界部分變得複雜。對本體隱藏規格的依賴仍會殘留 |
| 部分重建 | 變更需求集中在特定功能上 | 新舊之間整合性的維持。資料的雙重管理 |
| 全面重建 | 變更需求多、業務本身已改變、延命成本已經逆轉 | 隱藏規格的遺漏。並行運作・遷移的負擔 |
判斷的軸心有4個:剩餘使用年數、變更需求的頻率與偏向、停止時的業務影響,以及調查中所能復原的理解程度。若在理解程度偏低的狀態下就進入全面重建,會遺漏舊系統中「沒有人能說明、但在業務上卻是正確」的行為。即便選擇重建,第4章復原的規格台帳也能直接作為需求定義的基礎,因此對調查的投資不會白費。遷移時,讓新舊系統並行運作一段期間,以機械化的方式比對相同輸入所產生的輸出(報表・彙總・檔案),是標準做法。
另外,VB6 或 Access 等具體技術各自的延命・遷移判斷,已在「VB6 / Access 業務應用程式的延命與遷移」中詳細討論;公司內部 Web 系統對 IE 模式的依賴,則在「擺脫 IE 模式依賴系統的實務指南」中詳細討論。
7. 交接後的維運・維護體制
若方針是「暫時繼續維運」(實際上大多數情況都是如此),遵守以下型式可以減少事故。
- 擁有驗證環境 ── 但首次啟動務必與網路隔離 ── 將3.2製作的磁碟映像作為虛擬機器啟動,就會成為與正式環境相同組態的驗證環境。不過這份映像中原封不動地保留著正式環境的連線字串・驗證資訊・排程工作・自動啟動服務。若在保持連線的狀態下啟動,可能會導致夜間批次重複執行而更新正式資料庫、郵件被重複發送,或呼叫外部 API。首次啟動務必移除虛擬 NIC 或在隔離網路中進行,先停止排程工作與自動啟動服務,將連線目標改寫為驗證用之後,才只允許必要範圍內的連線。
- 變更一次一項,並可回復 ── 無論是設定變更,還是套用 Windows Update,一次只做一項。保留變更前的映像,一旦出現問題就能切回。並將變更了什麼的記錄(變更台帳)一併配套留存。
- 將文件當作「調查所得的副產物」逐步累積 ── 不要另外成立撰寫完美規格書的專案,而是每次故障應對或改版時,將了解到的內容追加到台帳中。只要維運上一年,文件就會依業務上重要程度依序齊備。
- 佈建監控 ── 存活監控、磁碟剩餘空間、錯誤日誌,以及「平常應該輸出的檔案沒有輸出」的偵測。即使看不見黑箱內部,也能監控入口與出口。
- 合約應將調查與改版分開 ── 若委託外部進行維護,由於對內容不明的系統進行調查無法承諾完成責任,因此調查・維護採準委任,規格已確定的個別改版採承攬(或成果完成型準委任),依階段分開簽約才是健全的做法。
8. 總結
- 接手了沒有原始碼、也沒有規格書的系統時,在改版之前,首先要做的是現狀的保全。取得磁碟映像(Disk2vhd 等)與資料庫的備份,並確認能夠復原。
- 對執行檔・自動啟動・排程工作・設定・對接對象・帳號進行盤點,將系統的整體樣貌製成清單。
- 規格可以從使用者訪談・畫面・報表・資料庫結構描述・日誌・Process Monitor 的實際行為觀測中復原。不是全部功能,而是優先處理業務影響較大的部分。
- 內容的可復原程度取決於技術堆疊。.NET 用反編譯可以讀懂相當多內容,但並非原始碼的替代品。實施前請確認著作權法第30條之4的宗旨,以及授權條款・合約書。
- 方針上,依剩餘使用年數・變更頻率・業務影響・理解程度判斷「延命・包裝・部分重建・全面重建」。調查中復原的規格,無論選擇哪條路都會成為資產。
- 在維運階段,驗證環境・一次一項的變更・變更台帳・入口與出口的監控・以準委任簽約是基本型式。
相關文章
- PDB(程式資料庫)是什麼 ── 理解偵錯資訊、符號與 Source Link
- Process Monitor(ProcMon)實戰指南 ── 在10分鐘內找出「設定未被讀取」「ACCESS DENIED」的原因
- VB6 / Access 業務應用程式的延命與遷移 ── 保留・包裝・取代的判斷表
- 擺脫 IE 模式依賴系統的實務指南
- 委託開發‧維運的合約該怎麼簽?── 從 IPA《模型交易‧合約書》學習準委任與承攬的區分使用
- 委外・委託開發 Windows 應用程式前該整理的事項
相關諮詢領域
合同會社小村軟體承接沒有留下原始碼或規格書之業務系統的現狀調查(執行檔・資料庫・實際行為的解析)、從行為復原規格、延命・遷移方針的整理,以及之後的維運・維護。即使是還處在「不知道該從何處著手」階段的諮詢,也歡迎洽詢。
參考連結
-
Microsoft Learn, Disk2vhd v2.02 (Sysinternals)。關於能夠讓運作中的系統保持連線狀態,透過 Windows 磁碟區快照功能轉換成某一時間點具一致性的 VHD、輸出到與轉換對象不同的磁碟性能較好、所選磁碟區所在的每個磁碟都會建立一個 VHD 且分割區資訊會被保留但只有所選磁碟區的資料會被複製、建立的 VHD 可作為 IDE 磁碟加入虛擬機器組態並啟動且首次啟動時會自動安裝驅動程式、以開機為目的掛載到建立來源的同一系統時磁碟簽章會被變更導致 BCD 找不到啟動磁碟、已啟用 BitLocker 的磁碟區不受支援需事先解除並等待解密完成、命令列語法為
disk2vhd <[drive: [drive:]...]|[*]> <vhdfile>、OEM 版 Windows 的 P2V 遷移在授權上有時不被允許等內容的說明。 ↩ ↩2 ↩3 ↩4 -
Microsoft Learn, Process Monitor (Sysinternals)。關於這是能夠即時監控檔案系統・登錄檔・處理序/執行緒活動的工具的說明。實務上的使用方法,已在本站的「Process Monitor(ProcMon)實戰指南」中解說。 ↩ ↩2 ↩3
-
Microsoft Learn, Generate source code from .NET assemblies while debugging。關於 Visual Studio 的反編譯功能是以開放原始碼的 ILSpy 為基礎(Visual Studio 2019 16.5 以後)、產生的原始碼會因為編譯時不需要的空白・註解・區域變數名稱等資訊遺失而與原始碼並不相同,應作為理解動作之用而非替代品、async/await 模式的反編譯有時並不完整、僅能產生 C# 等內容的說明。 ↩ ↩2 ↩3
-
ILSpy (icsharpcode/ILSpy)。開放原始碼的 .NET 組件瀏覽器・反編譯器。Microsoft Learn 的文件中也將其作為 Visual Studio 反編譯功能的基礎加以參照。 ↩ ↩2
-
e-Gov 法令檢索, 著作權法(昭和四十五年法律第四十八號) 第30條之4(不以享受著作物所表現之思想或感情為目的之利用)。這是平成30年修正時整備的彈性權利限制規定之一,以程式調查解析為目的的利用,被視為在此規定下於必要限度內獲得允許。同條但書中「對著作權人利益造成不當損害之情形」的排除,以及使用授權合約中禁止解析條款的效力,則需要個別檢討(參考:律師法人內田・鮫島法律事務所「程式相關逆向工程的可否(平成30年著作權法修正)」)。 ↩ ↩2
-
Microsoft Learn, Autoruns for Windows (Sysinternals)。關於能夠網羅性地列出登錄在啟動項目、服務、排程工作等 Windows 自動啟動點的程式的說明。 ↩
-
Microsoft Learn, Native AOT deployment overview。關於這是 .NET 7 以後的發行方式、在發行的時間點事前編譯器會將 IL 編譯為原生程式碼、Native AOT 應用程式在執行時不使用 JIT 編譯器、以自我封裝形式發行並可在未安裝 .NET 執行環境的機器上運作等內容的說明。 ↩
相關文章
共用相同標籤的最新文章。能以相近的主題延伸理解。
委外・委託開發 Windows 應用程式前該整理的事項
在委外・委託開發 Windows 應用程式之前,整理既有軟體改版、設備整合、COM/ActiveX、發布與更新、維護等應留意的重點。
故障處理不止於復原 ── 給小型開發團隊的 Postmortem(再發防止)實務範本
把故障處理停留在「修好、道歉就結束」,同樣的故障就會反覆發生。本文把 blameless postmortem 翻譯給小型團隊使用,整理出可在 1 小時內寫完的模板、再發防止策略的強度判斷表,以及實施的分級(triage)。
ADR(Architecture Decision Record)入門 ── 在小規模開發中留下「為何採用此設計」的最小做法
程式碼不會說明「為什麼這樣做」。本文說明如何用ADR(Architecture Decision Record)以「1個決定=1個檔案」的Markdown留下設計判斷的理由,並附上範本、該寫/不該寫的判斷表與實例。
為沒有測試的遺留業務應用程式安全地動手修改 ── 特性化測試與重構的實踐
為了在沒有測試的業務應用程式上安全地進行修改,本文以 C# 為例,說明固定目前行為的特性化測試(黃金主檔法)步驟、建立接縫(seam)的方法,以及不將重構與功能新增混在一起的運用規則。
MAX_PATH 與 Windows 路徑・檔案名稱的陷阱 ── 260 字元限制、保留名稱、結尾句點、大小寫
本文整理「找不到檔案」這類問題的常見原因──路徑與檔案名稱的限制。內容涵蓋 MAX_PATH=260 字元的組成、透過 LongPathsEnabled 啟用長路徑、CON 等保留名稱、結尾句點的正規化,直到 Path.Combine 的陷阱。
相關主題
與本文相近的主題頁面。以本文為起點,可進一步連到相關服務與其他文章。
Windows 技術主題
彙整 KomuraSoft LLC 關於 Windows 開發、故障調查與既有資產活用文章的主題中心。
故障調查 & 長期運行故障
整理間歇性故障、通訊診斷、長期運行當機、失敗路徑測試基礎的主題頁面。
與本主題相關的服務
本文連結到以下服務頁面,歡迎從最接近的入口查看。
Windows 應用程式開發
支援包含常駐處理、設備連動、運作日誌與可維護結構的 Windows 桌面應用程式。
故障調查 & 根本原因分析
調查難以重現的故障、長時間執行後的問題、記憶體洩漏、通訊停滯等棘手的正式環境問題。
常見問題
整理諮詢這個主題時常見的問題。
- 沒有原始碼的系統,也能委託維護或改版嗎?
- 可以委託。不過進行方式會與一般的維護不同。首先要對現行環境進行保全與備份,接著設置一個調查階段,從畫面・報表・資料庫・日誌・執行檔的解析中復原規格,再依當時所理解的範圍推進改版或周邊功能的開發,這才是務實的做法。由於調查工作在事前無法保證成果,因此一般會以不負擔完成責任的準委任契約來進行,而非承攬契約。
- 反編譯(逆向工程)執行檔,難道不違法嗎?
- 並非一律違法。根據平成30年(2018年)修正的著作權法所新增的第30條之4,像程式調查解析這類「不以享受著作物所表現之思想或感情為目的之利用」,在被認定為必要的限度內,原則上被視為允許。不過,「將對著作權人利益造成不當損害之情形」則被排除在外,另外,若使用授權合約中禁止解析,該如何處理也仍是一個爭議點。實際執行前,請先確認授權條款以及當初委託開發時的合約書,若判斷有困難,請諮詢律師等專業人士。
- 開發公司已倒閉,無法取得原始碼,該怎麼辦?
- 請先確認過去的合約書與交付物。若開發委託合約中明訂了著作權或原始碼的歸屬・交付方式,這便可作為取得與使用的依據。若還能聯絡上相關人員,也值得嘗試交涉取得的可能性。不過在實務上,重要的是不要停在「終究還是拿不到」這一步,建議在假設無法取得的前提下,同時展開現行環境的保全・備份,以及從行為與資料庫進行的規格復原。
- 沒有規格書的系統,該從何處著手?
- 在改版之前,首先要做的是現狀的保全。取得正在運作的正式環境的磁碟映像與資料庫備份,並確認能夠復原。接著對執行檔・自動啟動項目・排程工作・設定・對接對象・帳號進行盤點,將系統的整體樣貌製成清單。在此基礎上,透過對業務使用者的訪談,以及對畫面・報表・資料庫結構描述的觀察,聚焦在業務上重要的部分逐步將規格文件化,這是標準做法。