一键脱环境

发布时间 2023-07-06 23:14:11作者: AngDH

 

 

 

 

function deEnvironment_defineHeader_function_proto(ObjEct){ //第一步 定义头部函数,并关联上级原型链
    ObjEct.name = ObjEct.constructor.name;
    let jsCode = "";
    try {
        new ObjEct()
        jsCode += `${ObjEct.name} = function ${ObjEct.name}(){
            debugger;\r\n};` + "\r\n";
    }catch (e){
        jsCode += `${ObjEct.name} = function ${ObjEct.name}(){
            plugin.throwError(${e.constructor.name},'${e.message}');\r\n};` + "\r\n"
    }
    jsCode += `plugin.func_set_native(${ObjEct.name})` + "\r\n";
    jsCode += `plugin.rename(${ObjEct.name}.prototype, "${ObjEct.name}")` + "\r\n";
    if (ObjEct.__proto__.name != "Object" && ObjEct.__proto__.name != ""){
        jsCode += `Object.setPrototypeOf(${ObjEct.name}.prototype,${ObjEct.__proto__.name}.prototype)` + "\r\n";
    }

    return jsCode;
}

function deEnvironment_Shelling_proto(ObjEct,myThis){ //第二步 脱取原型链属性
    let jsCode = "";
    let temp = myThis;
    let isSos;
    try {
        while (true){
            temp = temp.__proto__;
            if(temp.constructor.name === ObjEct.name){
                isSos = true;
                break;
            }
        }
    }catch (e) {
        console.error(`未找到该对象${myThis.constructor.name}上的原型${ObjEct.name}`)
    }

    if (isSos){
        function getCode(OwnPropertyName,OwnPropertyDescriptor){
            function getValueOrGetSet(functionName){
                let jsCodeTemp = "";

                if(OwnPropertyDescriptor.value == undefined){
                    if(value === "" || value === undefined || value === "''"){
                        jsCodeTemp = `plugin.defineProperty(${ObjEct.name}.prototype,'${OwnPropertyName}',undefined,${OwnPropertyDescriptor.configurable},${OwnPropertyDescriptor.enumerable},${OwnPropertyDescriptor.writable},function (){ debugger; },function (value){ debugger; });plugin.func_set_native_Div(Object.getOwnPropertyDescriptors(${ObjEct.name}.prototype)['${OwnPropertyName}'].get,'get ${OwnPropertyName}');plugin.func_set_native_Div(Object.getOwnPropertyDescriptors(${ObjEct.name}.prototype)['${OwnPropertyName}'].set,'set ${OwnPropertyName}');`
                    }else {
                        jsCodeTemp = `plugin.defineProperty(${ObjEct.name}.prototype,'${OwnPropertyName}',undefined,${OwnPropertyDescriptor.configurable},${OwnPropertyDescriptor.enumerable},${OwnPropertyDescriptor.writable},function (){ debugger; },function (value){ debugger; });plugin.func_set_native_Div(Object.getOwnPropertyDescriptors(${ObjEct.name}.prototype)['${OwnPropertyName}'].get,'get ${OwnPropertyName}');plugin.func_set_native_Div(Object.getOwnPropertyDescriptors(${ObjEct.name}.prototype)['${OwnPropertyName}'].set,'set ${OwnPropertyName}');`
                    }
                }else {
                    jsCodeTemp = `plugin.defineProperty(${ObjEct.name}.prototype,'${OwnPropertyName}',${value},${OwnPropertyDescriptor.configurable},${OwnPropertyDescriptor.enumerable},${OwnPropertyDescriptor.writable});`
                    if (functionName){
                        jsCodeTemp += `plugin.func_set_native(${ObjEct.name}.prototype.${functionName});`;
                    }
                }
                return jsCodeTemp;
            }
            let code = "";
            let value = myThis[OwnPropertyName];
            switch (typeof value){
                case "string":
                    value = `'${value}'`;
                    code = getValueOrGetSet();
                    break;
                case "number":
                    code = getValueOrGetSet();
                    break;
                case "function":
                    const functionName = value.name;
                    value = `function ${functionName}(){ debugger; }`
                    code = getValueOrGetSet(functionName);
                    break;
                case "object":
                    // if(value instanceof Array){
                    //     value = "[]";
                    // }else if(value == null){
                    //     value = "null"
                    // }else {
                    //     value = "{}";
                    // }
                    value = "(function(){debugger;})()";
                    code = getValueOrGetSet();
                    break;
                case "boolean":
                    code = getValueOrGetSet();
                    break;
                case "undefined":
                    value = `undefined`;
                    code = getValueOrGetSet();
                    break;
                default:
                    debugger;
            }
            return code;
        }
        let OwnPropertyNames = Object.getOwnPropertyNames(temp);
        let OwnPropertyDescriptors = Object.getOwnPropertyDescriptors(temp);
        OwnPropertyNames.forEach((key) =>{
            if (key !== "constructor" && key !== "arguments" && key !== "caller" && key !== "length" && key !== "name"){
                jsCode += getCode(key,OwnPropertyDescriptors[key]) + "\r\n";
            }
        })
    }

    return jsCode;
}

function deEnvironment_main_proto(ObjEct,myThis){
    let jsCode = "";
    jsCode += deEnvironment_defineHeader_function_proto(ObjEct) + "\r\n"; //第一步 定义头部函数,并关联上级原型链
    jsCode += deEnvironment_Shelling_proto(ObjEct,myThis) + "\r\n"; //第二步 脱取原型链属性
    return jsCode;
}

function deEnvironment_defineHeader_function(myThis,name){
    let jsCode = "";
    jsCode += `${name} = {};` + "\r\n";


    if (myThis.constructor.name != "" && myThis.constructor.name != "Object"){
        jsCode += `Object.setPrototypeOf(${name}, ${myThis.constructor.name}.prototype);` + "\r\n";
    }

    return jsCode;
}

function deEnvironment_Shelling(myThis,name){
    let jsCode = "";
    function getCode(OwnPropertyName,OwnPropertyDescriptor){
        function getValueOrGetSet(functionName){
            let jsCodeTemp = "";
            if(OwnPropertyDescriptor.value == undefined){
                jsCodeTemp = `plugin.defineProperty(${name},'${OwnPropertyName}',undefined,${OwnPropertyDescriptor.configurable},${OwnPropertyDescriptor.enumerable},${OwnPropertyDescriptor.writable},function (){ debugger; },function (){ debugger; });plugin.func_set_native_Div(Object.getOwnPropertyDescriptors(${name})['${OwnPropertyName}'].get,'get ${OwnPropertyName}');plugin.func_set_native_Div(Object.getOwnPropertyDescriptors(${name})['${OwnPropertyName}'].set,'set ${OwnPropertyName}');`
            }else {
                jsCodeTemp = `plugin.defineProperty(${name},'${OwnPropertyName}',${value},${OwnPropertyDescriptor.configurable},${OwnPropertyDescriptor.enumerable},${OwnPropertyDescriptor.writable});`
                if (functionName){
                    jsCodeTemp += `plugin.func_set_native(${name}.${functionName});`;
                }
            }
            return jsCodeTemp;
        }
        let code = "";
        let value = myThis[OwnPropertyName];
        switch (typeof value){
            case "string":
                value = `'${value}'`;
                code = getValueOrGetSet();
                break;
            case "number":
                code = getValueOrGetSet();
                break;
            case "function":
                const functionName = value.name;
                value = `function ${functionName}(){ debugger; }`
                code = getValueOrGetSet(functionName);
                break;
            case "object":
                // if(value instanceof Array){
                //     value = "[]";
                // }else if(value == null){
                //     value = "null"
                // }else {
                //     value = "{}";
                // }
                value = "(function(){debugger;})()";

                code = getValueOrGetSet();
                break;
            case "boolean":
                code = getValueOrGetSet();
                break;
            case "undefined":
                value = `undefined`;
                code = getValueOrGetSet();
                break;
            default:
                debugger;
        }
        return code;
    }
    let OwnPropertyNames = Object.getOwnPropertyNames(myThis);
    let OwnPropertyDescriptors = Object.getOwnPropertyDescriptors(myThis);
    OwnPropertyNames.forEach((key) =>{
        if (key !== "constructor" && key !== "arguments" && key !== "caller" && key !== "length" && key !== "name"){
            if (key,OwnPropertyDescriptors[key] == undefined) {
                return;
            }
            jsCode += getCode(key,OwnPropertyDescriptors[key]) + "\r\n";
        }
    })

    return jsCode;

}

function deEnvironment_main(myThis,name){
    let jsCode = "";
    jsCode += deEnvironment_defineHeader_function(myThis,name) + "\r\n"; //第一步 定义头部函数,并关联上级原型链
    jsCode += deEnvironment_Shelling(myThis,name) + "\r\n"; //第二步 脱取对象属性
    return jsCode;
}

let code = '';

// code = deEnvironment_main(document.body.style,"CSSStyleDeclaration");

code = deEnvironment_main_proto(HTMLDivElement,document.createElement("div"));

copy(code)

console.log(code)