参考までにここに投稿します -- JSL の暗号化クラスは安全ではありません。関数はこの脆弱性に対して脆弱ではないため、クラスではなく関数のみを使用することをお勧めします。
問題は、JMP クラスが内省的であるのに対し、コンパイルされた関数は内省的ではないという事実にあります。本当に秘密にしておきたいメソッドが含まれる次のクラスを考えてみましょう。
Define Class(
"complex",
real = 0;
imag = 0;
_init_ = Method( {a, b},
real = a;
imag = b;
);
secret method = Method( {secret input 1, secret input 2 = "foo"},
{Default Local},
my secret password = "password123";
my secret connection database = "database=UML_4x7z;source=axml1131;pwd=my_great_password";
Eval( Eval Expr(
my ultra secret program = Run Program(
Executable( "secret_exe.exe" ),
Options( Expr( "-o " || my secret connection database ) )
)
) );
);
Add = Method( {y},
New Object( complex( real + y:real, imag + y:imag ) )
);
Sub = Method( {y},
New Object( complex( real - y:real, imag - y:imag ) )
);
Mul = Method( {y},
New Object( complex( real * y:real - imag * y:imag, imag * y:real + real * y:imag ) )
);
Div = Method( {y},
t = New Object( complex( 0, 0 ) );
mag2 = y:Magsq();
t:real = real * y:real + imag * y:imag;
t:imag = imag * y:real + real * y:imag;
t:real = t:real / mag2;
t:imag = t:imag / mag2;
t;
);
Magsq = Method( {},
real * real + imag * imag
);
Mag = Method( {},
Sqrt( real * real + imag * imag )
);
_to string_ = Method( {},
Char( real ) || " + " || Char( imag ) || "i"
);
_show_ = _to string_;
);このスクリプトを取得して暗号化する場合 ([編集] -> [スクリプトの暗号化...] を使用)、理想的には、これを配布する可能性のあるエンド ユーザーに内部コードが簡単に表示されないようにする必要があります。しかし、そうではありません。実際、解体と再構築は驚くほど簡単です。
以下に、暗号化されたメソッド (これが問題です) を分解し、便宜上再構築できる関数をいくつか示します。
clref = New Object( complex( 1, 2 ) );
introspect = Function( {obj},
{Default Local},
i = 1;
obj part = Arg( obj, 1 );
ret = Eval List( {Head Name( obj part )} );
While( !Is Empty( Arg( obj part, i ) ),
moil = Eval List({Arg( obj part, i)} );
ret[N Items( ret ) + 1] = If( N Arg( Arg( moil, 1 ) ) > 0, Recurse( moil ), Head Name( Arg( moil, 1 ) ) );
i++
);
ret
);
Clear Log();
deconstructed = introspect( Eval List( {Name Expr( clref:secret method )} ) );
Show( deconstructed );
reconstruct = Function( {input},
{Default Local},
init = Parse( input[1] || "()" );
If( Is List( input ) & N Items( input ) > 1,
For( i = 2, i <= N Items( input ), i++,
If( Is List( input[i] ),
Insert Into( init, Try( ( s = Recurse( input[i] ); s )[1], Char( s ) ) )
,
Insert Into( init, Parse( input[i] ) )
)
);
);
Eval List( {Name Expr( init ) } );
);
Show( reconstruct( v ) );これには 2 つの注意点があることに注意してください。文字列と名前を簡単に区別することはできません (ただし、人間であればおそらく区別できるでしょう)。また、次のような構成体の中心引数は表示されません。クラス:メソッド( arg1, arg2 ):returned_class_method( arg );ここで、最初のメソッドは、さらにメソッドを呼び出すクラスを返します。これらの制限があっても、パスワードや機密情報の実装詳細を非常に迅速に見つけることができます。
繰り返しになりますが、セキュリティ目的で 1 つまたは複数のスクリプトを暗号化している場合は、クラスに依存しないことをお勧めします。
知っておいてよかったです。これを次の宛先に送ることをお勧めしますsupport@jmp.comまだお持ちでない場合も同様です。