distinctiomagnam
Version:
JavaScript Obfuscation Tool.
395 lines (306 loc) • 7.29 kB
text/typescript
import JsConfuser from "../../../src/index";
it("should convert class declarations to variable declarations", async () => {
var output = await JsConfuser(
`
class Person {
constructor(name){this.name = name}
getName(){return this.name}
};
var person = new Person("John");
TEST_VARIABLE = person.name`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_VARIABLE;
eval(output);
expect(TEST_VARIABLE).toStrictEqual("John");
});
it("should convert class expressions to function expressions", async () => {
var output = await JsConfuser(
`
var PersonClass = (class Person { constructor(name){this.name = name} getName(){return this.name} });
var person = new PersonClass("John");
TEST_VARIABLE = person.getName()`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_VARIABLE;
eval(output);
expect(TEST_VARIABLE).toStrictEqual("John");
});
it("should support static methods", async () => {
var output = await JsConfuser(
`
class Person {
static createPerson(name){
return new Person(name)
}
constructor(name){
this.name = name
}
getName(){
return this.name
}
};
var person = Person.createPerson("John");
TEST_VARIABLE = person.name;
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_VARIABLE;
eval(output);
expect(TEST_VARIABLE).toStrictEqual("John");
});
it("should support computed property names", async () => {
var output = await JsConfuser(
`
var constructorKey = "constructor";
var getNameKey = "getName";
class Person {
static createPerson(name){
return new Person(name)
}
[constructorKey](name){
this.name = name
}
[getNameKey](){
return this.name
}
};
var person = new Person("John");
TEST_VARIABLE = person.name;
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_VARIABLE;
eval(output);
expect(TEST_VARIABLE).toStrictEqual("John");
});
it("should support extending from a super class", async () => {
var output = await JsConfuser(
`
class Shape {
isShape(){
return true
}
getShapeID(){
return 0;
}
}
class Rectangle extends Shape {
constructor(width, height){
super()
this.width = width;
this.height = height;
}
getShapeID(){
return super.getShapeID() + 10;
}
getArea(){
return this.width * this.height;
}
}
var rect = new Rectangle(10, 20)
TEST_AREA = rect.getArea()
TEST_SHAPE_ID = rect.getShapeID()
TEST_IS_SHAPE = rect.isShape()
`,
{ target: "node", es5: true }
);
expect(output).not.toContain("class");
var TEST_AREA, TEST_SHAPE_ID, TEST_IS_SHAPE;
eval(output);
expect(TEST_AREA).toStrictEqual(200);
expect(TEST_SHAPE_ID).toStrictEqual(10);
expect(TEST_IS_SHAPE).toStrictEqual(true);
});
it("should support getters and setters on the class", async () => {
var output = await JsConfuser(
`
class Rectangle {
constructor(width, height){
this.width = width;
this.height = height;
}
get area(){
return this.width * this.height;
}
set setterProperty(newArea){
this.width = newArea/2;
this.height = 2;
}
}
var rect = new Rectangle(10, 15)
TEST_AREA = rect.area
rect.setterProperty = 500
TEST_NEW_AREA = rect.area
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_AREA, TEST_NEW_AREA;
eval(output);
expect(TEST_AREA).toStrictEqual(150);
expect(TEST_NEW_AREA).toStrictEqual(500);
});
it("should support getters and setters on static methods", async () => {
var output = await JsConfuser(
`
var timesSet = 0;
var theRectangle;
class Rectangle {
constructor(width, height){
this.width = width;
this.height = height;
}
static get theRectangle(){
if( !theRectangle ) {
this.theRectangle = new Rectangle(4, 5)
}
}
static set theRectangle(value){
theRectangle = value;
timesSet++;
}
}
TEST_FIRST_RECT = theRectangle
var rect = Rectangle.theRectangle;
TEST_SECOND_RECT = theRectangle.width
Rectangle.theRectangle = new Rectangle(40, 35)
TEST_THIRD_RECT = theRectangle.width
TEST_TIMES_SET = timesSet;
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_FIRST_RECT, TEST_SECOND_RECT, TEST_THIRD_RECT, TEST_TIMES_SET;
eval(output);
expect(TEST_FIRST_RECT).toStrictEqual(undefined);
expect(TEST_SECOND_RECT).toStrictEqual(4);
expect(TEST_THIRD_RECT).toStrictEqual(40);
expect(TEST_TIMES_SET).toStrictEqual(2);
});
it("should support classes with no constructor", async () => {
var output = await JsConfuser(
`
class Rectangle {
getArea(){
return this.width * this.height;
}
}
var rect = new Rectangle();
rect.width = 5;
rect.height = 10;
TEST_AREA = rect.getArea()
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_AREA;
eval(output);
expect(TEST_AREA).toStrictEqual(50);
});
it("should support preserving the class name", async () => {
var output = await JsConfuser(
`
class Rectangle {
getArea(){
return this.width * this.height;
}
}
var rect = new Rectangle();
TEST_VALUE = rect.constructor.name;
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_VALUE;
eval(output);
expect(TEST_VALUE).toStrictEqual("Rectangle");
});
it("should properly pass arguments to super class", async () => {
var output = await JsConfuser(
`
class Logger {
constructor(name){
TEST_INIT_ARG = name;
this.name = name;
}
log(message){
TEST_NAME = this.name;
}
}
class Player extends Logger {
constructor(){
super("Player")
}
jump(){
this.log("I jumped")
}
}
var player = new Player();
player.jump();
`,
{
target: "node",
es5: true,
}
);
expect(output).not.toContain("class");
var TEST_INIT_ARG, TEST_NAME;
eval(output);
expect(TEST_INIT_ARG).toStrictEqual("Player");
expect(TEST_NAME).toStrictEqual("Player");
});
it("should work with stringConcealing and hide method names", async () => {
var output = await JsConfuser(
`
class MyClass {
constructor(value){
this.value = value
}
getValue(){
return this.value
}
}
var instance = new MyClass(100)
TEST_VALUE = instance.getValue()
`,
{
target: "node",
es5: true,
stringConcealing: true,
}
);
expect(output).not.toContain("class");
expect(output).not.toContain("getValue");
var TEST_VALUE;
eval(output);
expect(TEST_VALUE).toStrictEqual(100);
});