Ich poste hier als FYI - 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 in der Tatsache, dass JMP-Klassen introspektiv sind, während kompilierte Funktionen dies nicht sind.Betrachten Sie die folgende Klasse mit einer Methode, die ich wirklich geheim halten möchte:
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 verschlüsseln (mit Bearbeiten->Skript verschlüsseln...), dann sollte der interne Code im Idealfall nicht ohne Weiteres für Endbenutzer sichtbar sein, an die Sie ihn möglicherweise verteilen.Dies ist jedoch nicht der Fall.Es ist eigentlich lächerlich einfach 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 Vorbehalte gibt – es kann nicht einfach zwischen Zeichenfolgen und Namen unterscheiden (aber Sie als Mensch können es wahrscheinlich), und es hat keine Sichtbarkeit für die zentralen Argumente eines solchen Konstrukts wie class:method( arg1, arg2 ):returned_class_method( arg ); , wobei die erste Methode eine Klasse zurückgibt, von der Sie eine weitere Methode aufrufen.Selbst mit diesen Einschränkungen kann es sehr schnell sein, Implementierungsdetails für sogar Passwörter / vertrauliche Informationen zu finden.
Auch hier lautet meine Empfehlung, dass Sie sich nicht auf Klassen verlassen, wenn Sie ein Skript / mehrere Skripts aus Sicherheitsgründen verschlüsseln.
Gut zu wissen.Ich schlage vor, diese an zu senden support@jmp.com auch, wenn Sie es noch nicht getan haben.