Ich poste hier zu Ihrer Information: Verschlüsselte Klassen in JSL sind nicht sicher.Ich empfehle, nur Funktionen und keine Klassen zu verwenden, da Funktionen dafür nicht anfällig sind.
Das Problem liegt darin, dass JMP-Klassen introspektiv sind, kompilierte Funktionen jedoch nicht.Betrachten Sie die folgende Klasse, die eine Methode enthält, die ich wirklich gerne geheim halten würde:
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_;
);Wenn Sie dieses Skript nehmen und es verschlüsseln (mit Bearbeiten->Skript verschlüsseln...), sollte der interne Code idealerweise für keinen Endbenutzer, an den Sie ihn verteilen, ohne weiteres sichtbar sein.Dies ist jedoch nicht der Fall.Es ist tatsächlich lächerlich einfach, es zu dekonstruieren und zu rekonstruieren.
Hier sind ein paar Funktionen, die die verschlüsselten Methoden dekonstruieren können (das ist das Problem) und sie dann der Einfachheit halber rekonstruieren können:
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 ) );Beachten Sie, dass es dabei zwei Einschränkungen gibt: Es kann nicht einfach zwischen Zeichenfolgen und Namen unterscheiden (Sie als Mensch können es aber wahrscheinlich) und die zentralen Argumente eines solchen Konstrukts sind nicht sichtbar class:method( arg1, arg2 ):returned_class_method( arg ); , wobei die erste Methode eine Klasse zurückgibt, deren Methode Sie anschließend aufrufen.Trotz dieser Einschränkungen können Implementierungsdetails sogar für Passwörter/sensible Informationen sehr schnell gefunden werden.
Auch hier gilt meine Empfehlung: Wenn Sie aus Sicherheitsgründen ein Skript oder mehrere Skripte verschlüsseln, verlassen Sie sich nicht auf Klassen.
Gut zu wissen.Ich schlage vor, dies an zu senden support@jmp.com auch wenn Sie es noch nicht getan haben.