更新履歴(3件・最終更新 2026年08月02日)
この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。
- 記事の冒頭に「この記事の知識マップ」節を追加しました。本文で扱っている概念とその関係を、要約・図・詳細ページへのリンクにまとめたものです。本文の主張は変えていません。
- 外部レビュー(1283件)への対応として本文を更新しました。個々の変更内容は、この下の履歴を参照してください。
- 引き受けから運用に乗せるまでの流れを図にしました。あわせて誰に何を聞けば何が分かるかを整理したヒアリングの型と、用語の表を追加しています。
- 初版公開
この記事を引用する(DOI: 10.5281/zenodo.21590070)
この記事はZenodoにアーカイブされています。常に最新版へ解決されるDOIと、いま表示している版に固定されたDOIの両方を下に示します。
小村 豪(2026)「ソースコードも仕様書もないシステムを引き継いだら ── 止めずに運用・保守するための実務手順」合同会社小村ソフト. https://doi.org/10.5281/zenodo.21590070 https://staging.comcomponent.com/blog/no-source-no-docs-system-maintenance/
- DOI(最新版)
- 10.5281/zenodo.21590070
- DOI(この版)
- 10.5281/zenodo.21733035
「開発した会社がもう存在しない」「作った担当者が退職して連絡が取れない」「サーバーの中に実行ファイルとデータベースはあるが、ソースコードも仕様書も見つからない」── 中小企業の業務システムの相談で、決して珍しくない状況です。それでもシステムは今日も動いていて、業務はそれに依存しています。
この状態で最悪の選択は、「よく分からないから」と手探りの改修や思いつきの環境変更を始めてしまうことです。ソースコードがないシステムは、壊れたときに直せる保証がありません。一方で、「何もできない、全面再構築しかない」と最初から結論を出すのも早計です。仕様書がなくても仕様を復元する手段はあり、ソースコードがなくても中身を読める場合があります。この記事では、何もない状態から運用・保守を成立させるまでの手順を、実務の順番どおりに整理します。
1. まず結論
- 最初にやるべきは改修ではなく「現状の保全」です。動いている本番環境そのものが最重要資産です。ディスクイメージのバックアップ(Disk2vhdによる仮想マシン化など)とデータベースのバックアップを取得し、復元できることまで確認してから次に進みます。1
- 仕様書がなくても、仕様は復元できます。業務利用者へのヒアリング、画面・帳票、データベーススキーマ、ログ、そしてProcess Monitorによる実挙動の観察が主な材料です。2
- ソースコードの復元可能性は、技術スタックで大きく異なります。.NET製ならILSpy等の逆コンパイラでかなり読める一方、VB6やC++などネイティブコードの復元は現実的には期待できません。34
- 逆コンパイルには法的な論点があります。著作権法第30条の4により調査解析目的の利用は原則許容されると整理されていますが、契約(使用許諾条項)の確認は必須です。5
- 「完全に理解してから」を待たないことです。止まったら業務が止まる箇所と、変更の必要が近い箇所から優先的に把握し、変更は小さく一つずつ、戻せる形で行います。
- 保守契約は準委任が基本です。中身の分からないシステムの調査に完成責任(請負)は約束できません。調査フェーズと改修フェーズを分けて契約します。
この記事は、実務で踏む順番どおりに構成しています。全体像は次のとおりです。
flowchart TD
A["第3章 保全<br/>変更凍結・ディスクイメージ<br/>DBバックアップと復元確認"] --> B["第3章 棚卸し<br/>実行ファイル・自動起動・タスク<br/>設定・連携先・アカウント"]
B --> C["第4章 仕様復元<br/>ヒアリング・画面と帳票<br/>DBスキーマ・実挙動の観測"]
C --> D["第5章 技術的な可否<br/>技術スタックの見立て<br/>逆コンパイルと法的確認"]
D --> E["第6章 方針決定<br/>延命・包む・部分再構築・全面再構築"]
E --> F["第7章 運用移行<br/>検証環境・変更台帳・監視・契約"]
C -.->|"復元した仕様の台帳は<br/>どの方針を選んでも資産になる"| E
図1: 引き継ぎの全体フローと対応する章
工程ごとの所要期間は、システムの規模(画面・帳票・バッチの本数)、技術スタック、業務側からヒアリングに割いてもらえる時間、そして「どこまで分かれば十分とするか」の目標設定で大きく変わるため、着手前に一律の目安を置くことはできません。見積もりの精度を上げる唯一の近道は、第3章の棚卸しを先に終えて対象の本数を数えることです。本数が出るまで仕様復元の期間は見積もれません。裏を返せば、棚卸しは短期間で切り上げるべき工程で、ここを引き延ばすと以降の計画がすべて立たなくなります。
この記事の知識マップ
ソースコードも仕様書もない業務システムを引き継いだ場合、最初にすべきは改修ではなく現状の保全で、Disk2vhdによるディスクイメージ化とVSSを使ったバックアップを取得し、復元できることまで確かめる。次に実行ファイル・自動起動・スケジュールタスクなどをAutorunsやProcess Monitorで棚卸しし、業務利用者へのヒアリングや実挙動の観測から仕様を復元していく。中身の復元可能性は技術スタック次第で、通常のIL形式の.NETアセンブリはILSpyでかなり読める一方、Native AOT発行やVB6は逆コンパイルによる復元が現実的でなく、著作権法第30条の4や使用許諾契約の解析禁止条項も事前に確認する必要がある。中身の分からないシステムの調査は準委任契約で進め、仕様が固まった個別改修だけ請負に切り替えるのが健全な進め方である。
flowchart LR
accTitle: ソース・仕様書のないシステム引き継ぎの知識マップ
accDescr: 現状の保全・棚卸し・仕様復元という実務の順序と、技術スタックによる逆コンパイルの可否、著作権法上の留意点、契約形態の選び方の関係を示す図
legacy_system_handover["ソースコード・仕様書がないシステムの引き継ぎ"]
environment_preservation["現状の保全"]
spec_recovery["仕様の復元"]
disk2vhd["Disk2vhd"]
vss["VSS(ボリュームシャドウコピーサービス)"]
asset_inventory["構成要素の棚卸し"]
autoruns["Autoruns"]
procmon["Process Monitor(procmon.exe)"]
user_hearing["業務利用者へのヒアリング"]
decompilation["逆コンパイル"]
ilspy["ILSpy"]
dotnet[".NET(Core以降)"]
native_aot["Native AOT"]
vb6["Visual Basic 6.0(VB6)"]
obfuscation["難読化(オブファスケーション)"]
pdb["PDB(プログラムデータベース)"]
copyright_law_article_30_4["著作権法第30条の4"]
eula_restriction["使用許諾契約(EULA)の解析禁止条項"]
quasi_mandate_contract["準委任契約"]
ukeoi_contract["請負契約"]
legacy_system_handover -->|"前提とする"| environment_preservation
environment_preservation -.->|"利用する"| disk2vhd
disk2vhd -->|"利用する"| vss
legacy_system_handover -->|"前提とする"| asset_inventory
asset_inventory -.->|"利用する"| autoruns
asset_inventory -.->|"利用する"| procmon
legacy_system_handover -->|"前提とする"| spec_recovery
spec_recovery -->|"利用する"| user_hearing
spec_recovery -->|"利用する"| procmon
spec_recovery -.->|"前提とする"| decompilation
decompilation -.->|"利用する"| ilspy
decompilation -.->|"前提とする"| dotnet
decompilation -->|"用いるのは非推奨"| native_aot
decompilation -->|"用いるのは非推奨"| vb6
obfuscation -.->|"軽減する"| decompilation
pdb -.->|"推奨される対応"| decompilation
decompilation -->|"前提とする"| copyright_law_article_30_4
eula_restriction -.->|"両立しない"| decompilation
legacy_system_handover -.->|"前提とする"| quasi_mandate_contract
quasi_mandate_contract -->|"より先に行うべき"| ukeoi_contract
environment_preservation -->|"より先に行うべき"| asset_inventory
asset_inventory -->|"より先に行うべき"| spec_recovery
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全22件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
2. なぜ「何もない」状態が生まれるのか
対処を考える前に、自社がどのパターンなのかを確認しておくと、残っている手がかりの見当が付きます。
| パターン | 典型的な経緯 | 残っていることが多いもの |
|---|---|---|
| 開発会社の廃業・撤退 | 保守契約が切れたまま数年経過し、連絡が取れなくなった | 納品時のCD-R・検収書・契約書(書庫に眠っていることがある) |
| 内製担当者の退職 | 一人の担当者が作り、属人化したまま退職 | 本人のPC・共有フォルダーの中の開発環境やソースの断片 |
| 事業譲渡・M&A | システムごと引き継いだが、ドキュメントは移管されなかった | 譲渡契約の目録、旧会社の担当者への連絡経路 |
| ソースはあるが信用できない | ソースは見つかったが、動いている実行ファイルと一致する保証がない | ビルド日時・バージョン情報の突き合わせ材料 |
最後のパターンは見落とされがちですが、実質的には「ソースがない」のと同じ扱いが必要です。古いソースを正として改修し、実は本番の実行ファイルに数年分の修正が入っていた、という事故は典型的な失敗例です。ソースが見つかった場合も、ビルドして本番の実行ファイルと突き合わせるまでは信用しないでください。
いずれのパターンでも、まず契約書・納品書・検収書を探すことには価値があります。著作権の帰属やソースコードの納品義務が書かれていれば、その後の交渉や法的な整理の土台になります。
3. 最初の一週間でやること ── 現状の保全と棚卸し
3.1 変更の凍結
調査が終わるまで、対象のサーバー・端末には手を入れないのが原則です。「とりあえずOSを更新しよう」「使っていなさそうなファイルを整理しよう」が命取りになります。ソースコードがない以上、壊れたときに「直す」という選択肢がないからです。自動更新(Windows Update、ウイルス対策ソフトの動作変更)が勝手に環境を変えないよう、更新の適用タイミングを管理下に置くことも検討します。
3.2 バックアップ ── 環境そのものを資産として複製する
ファイル単位のバックアップだけでは不十分です。この種のシステムは、OS設定・レジストリ・ランタイム・配置場所のすべてが「動いている理由」の一部である可能性があるため、ディスクイメージ全体を保全します。
実務でよく使うのはSysinternalsのDisk2vhdです。稼働中のシステムをオンラインのまま、Windowsのボリュームスナップショット機能(VSS: Volume Shadow Copy Service、ボリュームシャドウコピーサービス)で一貫性のある時点のVHD/VHDXに変換でき、Hyper-V上の仮想マシンとして起動する検証環境の土台になります。1 物理サーバーの老朽化対策と検証環境の確保を一度に進められるのが利点です(なお、OEMライセンスのWindowsは仮想環境への移行がライセンス上認められない場合があるため、ライセンス形態の確認は必要です1)。
Disk2vhdは画面が1枚だけの単純なツールですが、選択を間違えると「起動しないイメージ」ができあがります。次の順で進めてください。1
- 出力先を用意する。VHD/VHDXは変換対象のボリューム上にも作成できますが、対象とは別のディスク(外付けドライブやNASなど)に出力するほうが性能が良い、と公式ドキュメントも明記しています。空き容量は、選択するボリュームの使用領域の合計以上を見ておきます。
- BitLockerを確認する。Disk2vhdはBitLockerが有効なボリュームの変換に非対応です。対象になっている場合は、事前にBitLockerを解除し、復号が完了するまで待ってから実行します。
- 取り込むボリュームを選ぶ。起動したままのシステムでツールを実行すると、そのシステムのボリューム一覧が表示されます。ここで選んだボリュームが存在するディスクごとに1つの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バイトコードのように構造情報が残る形式で有効 |
| 難読化(オブファスケーション) | クラス名・メソッド名を無意味な文字列に置き換えるなどして、逆コンパイル結果を読みにくくする加工 |
| 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 また例外もあります。難読化(オブファスケーション)が施されている場合は解読の難易度が大きく上がりますし、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. 延命か、包むか、作り直すか
調査で得られた理解度と業務側の事情が揃ったら、方針を決めます。ここでも「全面再構築ありき」でも「塩漬けありき」でもなく、判断表で整理します。
| 選択肢 | 向いているケース | 主なリスク |
|---|---|---|
| そのまま延命(環境固定・仮想化) | 利用終了時期が数年内に見えている。変更要望がほぼない | OS・ランタイムの寿命、セキュリティ更新との両立 |
| 包んで延命(本体は触らず周辺を新規開発) | 本体は安定しており、要望が入出力や連携の追加に集中している | 境界部分の複雑化。本体の隠れ仕様への依存が残る |
| 部分再構築 | 変更要望が特定の機能に集中している | 新旧の整合性維持。データの二重管理 |
| 全面再構築 | 変更要望が多い、業務自体が変わっている、延命コストが逆転した | 隠れ仕様の取りこぼし。並行稼働・移行の負担 |
判断軸は、残存利用年数、変更要望の頻度と偏り、止まったときの業務影響、そして調査で復元できた理解度の4つです。理解度が低いまま全面再構築に進むと、旧システムの「誰も説明できないが業務上は正しい挙動」を取りこぼします。再構築を選ぶ場合も、第4章で復元した仕様の台帳がそのまま要件定義の下敷きになるため、調査への投資は無駄になりません。移行時は新旧システムを一定期間並行稼働させ、同じ入力に対する出力(帳票・集計・ファイル)を機械的に突き合わせるのが定石です。
なお、VB6やAccessといった具体的な技術ごとの延命・移行判断は「VB6 / Access業務アプリの延命と移行」で、社内WebシステムのIEモード依存については「IEモード依存システムの脱却ガイド」で詳しく扱っています。
7. 引き継いだ後の運用・保守体制
方針が「当面は運用を続ける」である場合(実際にはほとんどのケースがそうです)、次の型を守ると事故が減ります。
- 検証環境を持つ ── ただし初回起動は必ずネットワークから隔離する ── 3.2で作ったディスクイメージを仮想マシンとして起動すれば、本番と同じ構成の検証環境になります。ただしこのイメージには本番の接続文字列・認証情報・スケジュールタスク・自動起動サービスがそのまま残っています。ネットワークに接続したまま起動すると、夜間バッチが二重に走って本番データベースを更新したり、メールが再送されたり、外部APIを呼び出したりしかねません。初回起動は必ず仮想NICを外すか隔離ネットワークで行い、スケジュールタスクと自動起動サービスを止め、接続先を検証用に書き換えてから、必要な範囲だけ接続を許可します。
- 変更は一つずつ、戻せる形で ── 設定変更もWindows Updateの適用も、一度に一つ。変更前のイメージを残し、問題が出たら切り戻します。何を変えたかの記録(変更台帳)をセットにします。
- ドキュメントは「調べたことの副産物」として育てる ── 完璧な仕様書を書くプロジェクトを立てるのではなく、障害対応や改修のたびに分かったことを台帳に追記します。1年も運用すれば、業務上重要な箇所から順にドキュメントが揃っていきます。
- 監視を仕込む ── 死活監視、ディスク残量、エラーログ、そして「いつも出力されるはずのファイルが出ていない」の検知。ブラックボックスの内部は見えなくても、入口と出口は監視できます。
- 契約は調査と改修を分ける ── 外部に保守を依頼する場合、中身の分からないシステムの調査に完成責任は約束できないため、調査・保守は準委任、仕様が固まった個別改修は請負(または成果完成型準委任)と、フェーズで契約を分けるのが健全です。
8. まとめ
- ソースコードも仕様書もないシステムを引き継いだら、改修より先に現状の保全です。ディスクイメージ(Disk2vhd等)とDBのバックアップを取得し、復元できることまで確認します。
- 実行ファイル・自動起動・スケジュールタスク・設定・連携先・アカウントを棚卸しし、システムの全体像を一覧にします。
- 仕様は、利用者ヒアリング・画面・帳票・DBスキーマ・ログ・Process Monitorでの実挙動観測から復元できます。全機能ではなく、業務影響の大きい箇所から優先します。
- 中身の復元可能性は技術スタック次第です。.NETは逆コンパイルでかなり読めますが、元ソースの代替ではありません。実施前に著作権法第30条の4の趣旨とライセンス条項・契約書を確認します。
- 方針は「延命・包む・部分再構築・全面再構築」を、残存利用年数・変更頻度・業務影響・理解度で判断します。調査で復元した仕様は、どの道を選んでも資産になります。
- 運用フェーズでは、検証環境・一つずつの変更・変更台帳・入口と出口の監視・準委任での契約が基本の型です。
関連記事
- PDB(プログラムデータベース)とは何か ── デバッグ情報・シンボル・Source Linkを理解する
- Process Monitor実践ガイド
- VB6 / Access業務アプリの延命と移行 ── 残す・包む・置き換えるの判断表
- IEモード依存システムの脱却ガイド
- 受託開発・運用保守の契約はどう結ぶべきか ── IPA「モデル取引・契約書」に学ぶ準委任と請負の使い分け
- Windowsアプリ 外注・受託開発を依頼する前に整理したいこと
関連する相談領域
合同会社小村ソフトでは、ソースコードや仕様書が残っていない業務システムの現状調査(実行ファイル・データベース・実挙動の解析)、挙動からの仕様復元、延命・移行方針の整理、その後の運用・保守までを扱っています。「何から手を付ければいいか分からない」という段階からのご相談も歓迎です。
参考リンク
-
Microsoft Learn, Disk2vhd v2.02 (Sysinternals). 稼働中のシステムをオンラインのままWindowsのボリュームスナップショット機能で一貫性のある時点のVHDに変換できること、変換対象と別のディスクにVHDを出力するほうが性能が良いこと、選択したボリュームが存在するディスクごとに1つのVHDが作られパーティション情報は保持されるがデータが複写されるのは選択したボリュームだけであること、作成したVHDをIDEディスクとして仮想マシンの構成に追加して起動でき初回起動時にドライバーが自動導入されること、作成元と同じシステムにブート目的でアタッチするとディスク署名が変更されBCDが起動ディスクを見つけられなくなること、BitLocker有効ボリュームは非対応で事前に解除と復号完了が必要であること、コマンドライン構文が
disk2vhd <[drive: [drive:]...]|[*]> <vhdfile>であること、OEM版WindowsのP2V移行はライセンス上認められない場合があることについて。 ↩ ↩2 ↩3 ↩4 -
Microsoft Learn, Process Monitor (Sysinternals). ファイルシステム・レジストリ・プロセス/スレッドの活動をリアルタイムに監視できるツールであることについて。実務での使い方は当サイトの「Process Monitor実践ガイド」で解説しています。 ↩ ↩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アセンブリブラウザー・逆コンパイラ。Visual Studioの逆コンパイル機能の基盤としてMicrosoft Learnのドキュメントからも参照されています。 ↩ ↩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ランタイム未導入のマシンでも動作することについて。 ↩
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
障害対応は復旧で終わらない ── 小さな開発チームのためのポストモーテム(再発防止)の型
障害を「直して謝って終わり」にすると同じ障害を繰り返します。blameless postmortemを小規模チーム向けに翻訳し、1時間で書けるテンプレート、再発防止策の強度判断表、実施のトリアージまでをまとめます。
テストのないレガシー業務アプリに安全に手を入れる ── 特性化テストとリファクタリングの実践
テストのない業務アプリに安全に手を入れるために、現在の挙動を固定する特性化テスト(ゴールデンマスター法)の手順、継ぎ目(seam)の作り方、リファクタリングと機能追加を混ぜない運用ルールをC#の例で解説します。
VB6アプリはいつまで動くのか ── ランタイムのサポート状況と現実的な.NET移行の進め方
VB6アプリはいつまで動くのか。ランタイムはWindows 11でも動作対象、IDEはサポート終了という現状を整理し、全面リライト・自動変換・段階移行の判断表、移行前の棚卸し、VB6と.NETの非互換までをまとめます。
Windowsアプリ 外注・受託開発を依頼する前に整理したいこと
Windowsアプリの外注・受託開発を依頼する前に、既存ソフト改修、装置連携、COM/ActiveX、配布・更新、保守の整理ポイントを解説します。
Power Automateの属人化対策 ── 作った人が辞めてもフローが止まらないために
Power Automateのフローが作成者の退職・異動で止まる属人化リスクへの対策を整理。所有者削除時の挙動、共同所有者の設定、孤立フローの引き継ぎ、実行アカウントの設計、フロー台帳による棚卸しまで解説します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
ActiveX / 移行テーマ
COM / ActiveX / OCX を残すか、包むか、置き換えるかを整理するトピックです。
不具合調査 / 長期稼働テーマ
再現しにくい不具合、通信停止、長期稼働障害、失敗パス検証を整理するトピックです。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
不具合調査・原因解析
再現しにくい障害、長期稼働後の不具合、通信停止などの調査を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- ソースコードがないシステムでも保守や改修を依頼できますか?
- 依頼できます。ただし通常の保守とは進め方が変わります。まず動いている環境の保全とバックアップを行ったうえで、画面・帳票・データベース・ログ・実行ファイルの解析から仕様を復元する調査フェーズを設け、そこで得られた理解の範囲で改修や周辺機能の開発に進むのが現実的です。調査は成果を事前に約束できない性質の作業なので、完成責任を負う請負ではなく準委任契約で進めるのが一般的です。
- 実行ファイルの逆コンパイル(リバースエンジニアリング)は違法ではないですか?
- 一律に違法ではありません。平成30年(2018年)改正の著作権法で新設された第30条の4により、プログラムの調査解析のような「著作物に表現された思想又は感情の享受を目的としない利用」は、必要と認められる限度で原則として許容されると整理されています。ただし「著作権者の利益を不当に害することとなる場合」は除外されるほか、使用許諾契約で解析が禁止されている場合の扱いという論点も残ります。実施前にライセンス条項と開発委託時の契約書を確認し、判断に迷う場合は弁護士等の専門家に相談してください。
- 開発会社が倒産してソースコードが手に入りません。どうすればよいですか?
- まず過去の契約書と納品物を確認してください。開発委託契約で著作権やソースコードの帰属・納品が定められていれば、入手や利用の根拠になります。連絡が取れる関係者がいれば入手交渉の余地も探る価値があります。ただし実務では「結局手に入らなかった」で止まらないことが重要で、入手できない前提で動いている環境の保全・バックアップと、挙動やデータベースからの仕様復元を並行して始めることをおすすめします。
- 仕様書がないシステムは、何から手を付ければよいですか?
- 改修より先に、まず現状の保全です。動いている本番環境のディスクイメージとデータベースのバックアップを取得し、復元できることを確認します。次に実行ファイル・自動起動・スケジュールタスク・設定・連携先・アカウントの棚卸しを行い、システムの全体像を一覧にします。そのうえで、業務利用者へのヒアリングと画面・帳票・データベーススキーマの観察から、業務上重要な箇所に絞って仕様を文書化していくのが定石です。