PL/SQL のソースコードの不明瞭化
WRAP ユーティリティは PL/SQL で書かれた ストアドプロシージャ などのソースコードを難読化することでリバースエンジニアリングに対する防止策となる。
暗号化とは異なりバージョンによって定数項目が可視状態のままであったり、熱心な一部のユーザーにより仕組みが解析されている。そのレポートもネット上でセミナー資料として公開されているためソースコードの内容が解析される可能性がある。ソースコードにアカウント情報やパスワードを埋め込むことは避ける。
wrap コマンドは OS レベルから実行するコマンドであり SQL*Plus から実行するものではない。(⇔ DBMS_DDL.WRAP)
2つしかオプションがないものの ifile/ infile だったろうか?と良く間違えるので毎度マニュアルのお世話になってしまう。
簡単ゆえに usage (help=y など) をぜひ付けてほしいと思う。
wrap を実行するにはソースコードを抽出したファイルを用意する。
wrap iname=難読化したいファイル名 [oname=出力ファイル名]
iname にはソースファイルを指定する。拡張子が指定されていない場合には デフォルトの拡張子として .sql が補完される。
oname には難読化されたアスキーコードのテキストファイル(printable) が出力される。
oname を省略した場合には入力ファイルの拡張子を plb したファイルに対して出力される。
ファイル名を指定して拡張子が指定されていない場合には デフォルトの拡張子として .plb が補完される。
マニュアルには iname/oname 指定の = の前後にスペース使用するなという注意がある。
wrap iname = himitsu
↑↑
PSU(33,1,0,0):Invalid command line arguments
PL/SQL Wrapper error: Couldn't process command line arguments.
wrap iname=hoge oname=hoge を実行しても hoge.sql を変換して hoge.plb を生成するため、元のソースコードが壊れることもない。
WRAP コマンドの互換性
あるバージョンの wrap コマンドで難読化したソースコードは、その リリース (※) より前のリリースのオラクルに使用することができない。上位リリースであれば使用可能。ソースコードは簡易チェックは行われるが完全なコンパイルがされているわけではない。
(※) リリース とはメジャーバージョンのさらに下の番号も含まれている数値である。
SQL> select VERSION from v$instance ;
VERSION
------------
10.2.0.1.0
SQL> define
...
DEFINE _O_VERSION = "Oracle (略)... 10.2.0.1.0 - (略)..." (CHAR)
DEFINE _O_RELEASE = "1002000100" (CHAR)
...
WRAP で不明瞭化される部分とそのままの部分
不明瞭化、難読化される部分は
- パッケージ仕様部、パッケージ本体 (CREATE PACKAGE / CREATE PACKAGE BODY)
- ファンクション、プロシージャ (CREATE FUNCTION / CREATE PROCEDURE)
- 型仕様部、型本体 (CREATE TYPE / CREATE TYPE BODY)
不明瞭化されない部分は
- 無名ブロック (BEGIN 〜 END)
- トリガー (CREATE TRIGGER)
- PL/SQL 以外のコード
つまり
-- himitsu.sql
DECLARE
vSecret := 'ないしょのメッセージ'
BEGIN
DBMS_OUTPUT.PUT_LINE(vSecret);
END;
/
--
Windows 上での実行例 (ソースがそのまま出力されている)
C:\> wrap iname=himitsu
PL/SQL Wrapper: Release 10.2.0.1.0
Copyright (c) 1993, 2004, Oracle. All rights reserved.
Processing himitsu.sql to himitsu.plb
C:\>type himitsu.plb
DECLARE
vSecret := 'ないしょのメッセージ'
BEGIN
DBMS_OUTPUT.PUT_LINE(vSecret);
END;
/
WRAP コマンド 関連事項