JS逆向常见问题解决方式**
一、AES加密
JS实现
const CryptoJS = require('crypto-js'); //引用AES源码js
const key = CryptoJS.enc.Utf8.parse("1234123412ABCDEF"); //十六位十六进制数作为密钥
const iv = CryptoJS.enc.Utf8.parse('ABCDEF1234123412'); //十六位十六进制数作为密钥偏移量
//解密方法
function Decrypt(word) {
let encryptedHexStr = CryptoJS.enc.Hex.parse(word);
let srcs = CryptoJS.enc.Base64.stringify(encryptedHexStr);
let decrypt = CryptoJS.AES.decrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
}
//加密方法
function Encrypt(word) {
let srcs = CryptoJS.enc.Utf8.parse(word);
let encrypted = CryptoJS.AES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });
return encrypted.ciphertext.toString().toUpperCase();
}
export default {
Decrypt ,
Encrypt
}
Python实现
import base64
import binascii
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
class AESUtil(object):
config = {
'ECB': 1,
'CBC': 2,
'CFB': 3,
'OFB': 5,
'CTR': 6,
'OPENPGP': 7,
'CCM': 8,
'EAX': 9,
'SIV': 10,
'GCM': 11,
'OCB': 12
}
@classmethod
def encrypt(cls, text, key, iv=None, encoding='b64', mode='ECB', padding='pkcs7'):
key = key.encode() # 秘钥,b就是表示为bytes类型
if mode != 'ECB':
iv = iv.encode()
aes = AES.new(key, mode=cls.config[mode], iv=iv) # 创建一个aes对象
else:
aes = AES.new(key, mode=cls.config[mode]) # 创建一个aes对象
text = text.encode()
if padding:
text = pad(text, AES.block_size, style='pkcs7') # 选择pkcs7补全
encrypt_aes = aes.encrypt(text)
if encoding == 'b64':
encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 解码
elif encoding == 'hex':
encrypted_text = str(binascii.b2a_hex(encrypt_aes), encoding='utf-8')
else:
raise ValueError('错误的编码')
encrypted_text_str = encrypted_text.replace("\n", "")
return encrypted_text_str
if __name__ == '__main__':
t = '{"YSZH":"2023","XMMC":"","verifyCode":"bg34"}'
key = 'dbd99c5139145091'
# iv = '0000000000000000'
m = 'ECB'
encoding = 'hex'
res = AESUtil.encrypt(t, key=key, iv=None, mode=m, encoding=encoding)
print(res)
import base64
import binascii
from Crypto.Cipher import AES
# 需要补位,str不是16的倍数那就补足为16的倍数
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return str.encode(value)
# 加密方法
def aes_encrypt(key, t, iv):
aes = AES.new(add_to_16(key), AES.MODE_CBC, add_to_16(iv)) # 初始化加密器
encrypt_aes = aes.encrypt(add_to_16(t)) # 先进行 aes 加密
encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8') # 执行加密并转码返回 bytes
return encrypted_text
# 解密方法
def aes_decrypt(key, t, iv):
aes = AES.new(add_to_16(key), AES.MODE_CBC, add_to_16(iv)) # 初始化加密器
base64_decrypted = binascii.a2b_hex(t) # 优先逆向解密 hex 成 bytes
decrypted_text = str(aes.decrypt(base64_decrypted), encoding='utf-8').replace('\0', '') # 执行解密密并转码返回str
return decrypted_text
if __name__ == '__main__':
secret_key = 'jo8j9wGw%6HbxfFn'
encrypted_str = ''
iv = '0123456789ABCDEF'
decrypted_str = aes_decrypt(secret_key, encrypted_str, iv)
print('解密字符串:', decrypted_str)
import rsa
import json
import struct
import base64
import random
import binascii
import hashlib
from Crypto.Cipher import AES
from Crypto.PublicKey import RSA
from Crypto.Util.Padding import pad
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
class AESUtil(object):
config = {
'ECB': 1,
'CBC': 2,
'CFB': 3,
'OFB': 5,
'CTR': 6,
'OPENPGP': 7,
'CCM': 8,
'EAX': 9,
'SIV': 10,
'GCM': 11,
'OCB': 12
}
@classmethod
def encrypt(cls, text, key, iv='0000000000000000', mode='CBC', padding='pkcs7'):
key = key.encode() # 秘钥,b就是表示为bytes类型
iv = iv.encode()
text = text.encode()
if padding:
text = pad(text, AES.block_size, style='pkcs7') # 选择pkcs7补全
aes = AES.new(key, mode=cls.config[mode], iv=iv) # 创建一个aes对象
encrypt_aes = aes.encrypt(text)
integers = struct.unpack('>' + 'i'*int(len(encrypt_aes)/4), encrypt_aes)
s = []
for i in range(len(encrypt_aes)):
c = integers[i >> 2] >> 24 - i % 4 * 8 & 255
s.append(c)
return s
@classmethod
def decrypt(cls, text, key='jo8j9wGw%6HbxfFn', iv='0123456789ABCDEF',):
key = key.encode() # 秘钥,b就是表示为bytes类型
iv = iv.encode()
text = text.encode()
aes = AES.new(key, AES.MODE_CBC, iv) # 初始化加密器
base64_decrypted = binascii.a2b_hex(text) # 优先逆向解密 hex 成 bytes
decrypted_text = aes.decrypt(base64_decrypted).decode() # 执行解密密并转码返回str
unpad = lambda x: x[0:-ord(x[-1])]
return unpad(decrypted_text)
class RsaUtil:
@staticmethod
def rsa_encrypt(password, public_key):
public_key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
rsa_key = RSA.importKey(public_key)
cipher = Cipher_pksc1_v1_5.new(rsa_key)
cipher_text = base64.b64encode(cipher.encrypt(password.encode()))
return cipher_text.decode()
@staticmethod
def encrypt(e=None, n=None, text=None):
e = int(e, 16)
n = int(n, 16)
pub_key = rsa.PublicKey(e=e, n=n)
m = rsa.encrypt(text.encode(), pub_key)
return m.hex()
def gen_rsa_number():
def _e():
return str(hex(int(65536 * (1 + random.random())))).replace('0x', '')[1:]
def _rand_str_16():
random_16_str = ''.join([_e() for i in range(4)])
return random_16_str
def _gen_u():
while True:
n = "00C1E3934D1614465B33053E7F48EE4EC87B14B95EF88947713D25EECBFF7E74C7977D02DC1D9451F79DD5D1C10C29ACB6A9B4D6FB7D0A0279B6719E1772565F09AF627715919221AEF91899CAE08C0D686D748B20A3603BE2318CA6BC2B59706592A9219D0BF05C9F65023A21D2330807252AE0066D59CEEFA5F2748EA80BAB81"
e = '10001'
random_str = _rand_str_16()
u = RsaUtil().encrypt(e, n, random_str)
if len(u) == 256:
return u, random_str
return _gen_u()
def _gen_p(e):
def t(e, t):
n = 0
for r in range(23, -1, -1):
if 1 == (t >> r & 1):
n = (n << 1) + (e >> r & 1)
return n
def bggf(e):
t = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789()"
return "." if e < 0 or e >= len(t) else t[e]
n = ''
r = ''
o = len(e)
for _ in range(0, o, 3):
if _ + 2 < o:
a = (e[_] << 16) + (e[_ + 1] << 8) + e[_ + 2]
n += bggf(t(a, 7274496)) + bggf(t(a, 9483264)) + bggf(t(a, 19220)) + bggf(t(a, 235))
else:
c = o % 3
if 2 == c:
a = e[_] << 16 + e[_ + 1] << 8
n += bggf(t(a, 7274496)) + bggf(t(a, 9483264)) + bggf(t(a, 19220))
r = '.'
elif 1 == c:
a = e[_] << 16
n += bggf(t(a, 7274496)) + bggf(t(a, 9483264))
r = '.' + '.'
# print(n)
return {
'res': n,
'end': r
}
def gen_i(data, u, random_str):
text = json.dumps(data, separators=(',', ':'))
o = AESUtil.encrypt(text, key=random_str)
r = ''.join([v for k, v in _gen_p(o).items()])
w = r + u
return w
def get_ord_md5(magic):
magic_ord_list = [ord(i) for i in magic]
r = ''.join([v for k, v in _gen_p(magic_ord_list).items()])
md5_str = hashlib.md5(r.encode()).hexdigest()
return md5_str
def get_md5(magic):
md5_str = hashlib.md5(magic.encode()).hexdigest()
return md5_str
if __name__ == '__main__':
# t = '{"lang":"zh-cn","passtime":570,"a":"1885_8784","pic":"/nerualpic/space_l1_zh_2019.07.17/space/6e4b452f02a5bc85a995e189b550affd.jpg","tt":"M.O8Pjn5(?PjUA3(/@AJ@Ff0B-1/9j5)*)**O,/jK:*)))P3M9)Lp**5*)M9Y9G1(gY85555,8e,b(c,((beo94*M?0)(Y7)4)(fD)(d8)(N4)(?5Y-,SD)N5/,bE1I-*-E-(ME-P:TOU-4SURjM9JTM99j-*M9/)(0qq(()(*gSLM0qM/2wk-b(b1(56(99,-9)/39A0(MA,)b52(MF*9b9(((","ep":{"ca":[{"x":1225,"y":305,"t":1,"dt":734},{"x":1364,"y":391,"t":3,"dt":583},{"x":1176,"y":322,"t":1,"dt":22696},{"x":1336,"y":384,"t":3,"dt":569}],"v":"3.0.8","te":false,"me":true,"tm":{"a":1690862300260,"b":1690862300321,"c":1690862300322,"d":0,"e":0,"f":1690862300261,"g":1690862300266,"h":1690862300266,"i":1690862300266,"j":1690862300299,"k":1690862300282,"l":1690862300300,"m":1690862300320,"n":1690862300320,"o":1690862300323,"p":1690862301099,"q":1690862301099,"r":1690862301099,"s":1690862301428,"t":1690862301428,"u":1690862301428}},"h9s9":"1816378497","rp":"ebf4ed2074c7d048821a9e00bf2b9fdf"}'
# key = 'fa45533e57615018'
# iv = '0000000000000000'
# m = 'CBC'
# encoding = 'hex'
# res = AESUtil.encrypt(t, key=key, iv=iv, mode=m, encoding=encoding)
# print(res)
# t = '04aba42c7f286c7387e7ca2d1134c344fb8f4e142ac42aba39d1ed76735d249ef44e8ff177c74512439b932d70aa9c17'
# key = 'jo8j9wGw%6HbxfFn'
# iv = '0123456789ABCDEF'
# res = AESUtil.decrypt(t, key, iv)
# print(res)
# gen_rsa_number()
print(AESUtil.decrypt(
'fa8f1891eb026fa5ffabbd521d5acd4dace8066fd57432ad7076b9deb603f4890bdd337cec56fe776c64ff0de5a9be054b76ab1f4952248619c76d1f88cbb64714242b80311914b51c2e53b76e51cf4a0f09c4a8a39be3a9e2abd92009e9ab04cf5ec42feecf1e9470e7e4838ce9c65afcdd4d453697f8883ba4ce19d9000a6fae0e704c1c3504dfd8fed03c02e7cc85a7e3138c2c951d224c1c5089978080f1a764f33210c08b0079d4efc539a78450b97fa9196dcb25c46f088cf7c2fe1d130e393eceda5d71539e6e77bfe3b4d51acaf3485d493db3c06bee24c992bd3ca8'))
二、DES加密
JS代码
// DES-128-CBC-Zero-crypt
function desZeroEncrypt(data, key) {
let iv = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Base64.stringify(iv).toString().substring(0,8);//base64加密取前8位
iv = CryptoJS.enc.Utf8.parse(iv);
key = CryptoJS.enc.Utf8.parse(key);
return CryptoJS.DES.encrypt(data, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.ZeroPadding
}).toString();
}
Python代码
# -*- coding:utf-8 -*-
import base64
import json
from Crypto.Cipher import DES
class Crypt(object):
"""加密和解密工具类"""
des_key = "fipFfVsZsTda94hJNKJfLoaqyqMZFFimwLt"
block_size = DES.block_size
pad_str = ['\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07', '\x08']
@classmethod
def des_base64_encrypt(cls, reqdata):
""" 基于DES和base64的加密算法
@:param reqdata 需要加密的请求数据
"""
key = cls.des_key.encode()[:8]
length = len(reqdata)
if length < cls.block_size:
add = cls.block_size - length
elif length > cls.block_size:
add = cls.block_size - (length % cls.block_size)
else:
add = 8
reqdata = reqdata + (cls.pad_str[add - 1] * add)
des = DES.new(key, DES.MODE_ECB)
encrypt_data = des.encrypt(reqdata.encode())
return base64.b64encode(encrypt_data).decode()
@classmethod
def des_base64_decrypt(cls, retdata):
"""DES解密
@:param retdata: lakala reponse retData
"""
key = cls.des_key.encode()[:8]
debase64_data = base64.b64decode(retdata)
des = DES.new(key, DES.MODE_ECB)
decrypt_data = des.decrypt(debase64_data)
return decrypt_data
if __name__ == '__main__':
item = {
'name': '凯文-杜兰特',
'image': 'durant.png',
'birthday': '1988-09-29',
'height': '208cm',
'weight': '108.9KG'
}
string = f'{base64.b64encode(item["name"].encode()).decode()}{item["birthday"]}{item["height"]}{item["weight"]}'
print(string)
print(Crypt.des_base64_encrypt(string))
三、RSA加密
JS代码
import JSEncrypt from "jsencrypt";
export const encryption = (params: string) => {
const encryptor = new JSEncrypt(); // 创建加密对象实例
// openssl生成的公钥,复制的时候要小心不要有空格
let pubKey = ''
pubKey =
"-----BEGIN PUBLIC KEY-----" +
"这里放公钥"
"-----END PUBLIC KEY-----";
encryptor.setPublicKey(pubKey); // 设置公钥
const rsaPassWord = encryptor.encrypt(params); // 对内容进行加密
return rsaPassWord;
};
Python代码
import base64
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA
def encrypt(password, public_key):
public_key = '-----BEGIN PUBLIC KEY-----\n' + public_key + '\n-----END PUBLIC KEY-----'
rsakey = RSA.importKey(public_key)
cipher = Cipher_pksc1_v1_5.new(rsakey)
cipher_text = base64.b64encode(cipher.encrypt(password.encode()))
return cipher_text.decode()
import rsa
def encrypt(e, n, text):
e = int(e, 16)
n = int(n, 16)
pub_key = rsa.PublicKey(e=e, n=n)
m = rsa.encrypt(text.encode(), pub_key)
return m.hex()
四、DES3加密
JS代码
// 引用 crypto-js 加密模块
var CryptoJS = require('crypto-js')
function tripleDesEncrypt() {
var key = CryptoJS.enc.Utf8.parse(desKey),
iv = CryptoJS.enc.Utf8.parse(desIv),
srcs = CryptoJS.enc.Utf8.parse(text),
// ECB 加密方式,Iso10126 填充方式
encrypted = CryptoJS.TripleDES.encrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Iso10126
});
return encrypted.toString();
}
function tripleDesDecrypt() {
var key = CryptoJS.enc.Utf8.parse(desKey),
iv = CryptoJS.enc.Utf8.parse(desIv),
srcs = encryptedData,
// ECB 加密方式,Iso10126 填充方式
decrypted = CryptoJS.TripleDES.decrypt(srcs, key, {
iv: iv,
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Iso10126
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
var text = "I love Python!" // 待加密对象
var desKey = "6f726c64f2c2057c" // 密钥
var desIv = "0123456789ABCDEF" // 偏移量
var encryptedData = tripleDesEncrypt()
var decryptedData = tripleDesDecrypt()
console.log("加密字符串: ", encryptedData)
console.log("解密字符串: ", decryptedData)
// 加密字符串: 3J0NX7x6GbewjjhoW2HKqg==
// 解密字符串: I love Python!
Python代码
from Cryptodome.Cipher import DES3
from Cryptodome import Random
# 需要补位,str不是16的倍数那就补足为16的倍数
def add_to_16(value):
while len(value) % 16 != 0:
value += '\0'
return str.encode(value)
def des_encrypt(key, text, iv):
# 加密模式 OFB
cipher_encrypt = DES3.new(add_to_16(key), DES3.MODE_OFB, iv)
encrypted_text = cipher_encrypt.encrypt(text.encode("utf-8"))
return encrypted_text
def des_decrypt(key, text, iv):
# 加密模式 OFB
cipher_decrypt = DES3.new(add_to_16(key), DES3.MODE_OFB, iv)
decrypted_text = cipher_decrypt.decrypt(text)
return decrypted_text
if __name__ == '__main__':
key = '12345678' # 密钥,16 位
text = 'I love Python!' # 加密对象
iv = Random.new().read(DES3.block_size) # DES3.block_size == 8
secret_str = des_encrypt(key, text, iv)
print('加密字符串:', secret_str)
clear_str = des_decrypt(key, secret_str, iv)
print('解密字符串:', clear_str)
# 加密字符串:b'\xa5\x8a\xd4R\x99\x16j\xba?vg\xf2\xb6\xa9'
# 解密字符串:b'I love Python!'
五、无限Debugger绕过
Function.prototype.constructor_bc=Function.prototype.constructor;
Function.prototype.constructor=function(){
if(arguments && arguments[0]==="debugger"){"什么都不做"} //利用arguments关键字的属性获取当前方法里面的参数
else{
return Function.prototype.constructor_bc.apply(this,arguments) //跟上面处理debugger和定时器一起用的处理方法一样
}
}
六、Hook cookie
// ==UserScript==
// @name Hook Cookie
// @namespace http://tampermonkey.net/
// @version 0.1
// @description try to take over the world!
// @author You
// @include *
// @grant none
// @run-at document-start
// ==/UserScript==
(function () {
'use strict';
var cookie_cache = document.cookie;
Object.defineProperty(document, 'cookie', {
get: function () {
return cookie_cache;
},
set: function (val) {
console.log('Setting cookie', val);
// 填写cookie名
if (val.indexOf('lqWVdQzgOVyaT') != -1) {
debugger;
}
var cookie = val.split(";")[0];
var ncookie = cookie.split("=");
var flag = false;
var cache = cookie_cache.split("; ");
cache = cache.map(function (a) {
if (a.split("=")[0] === ncookie[0]) {
flag = true;
return cookie;
}
return a;
})
cookie_cache = cache.join("; ");
if (!flag) {
cookie_cache += cookie + "; ";
}
return cookie_cache;
}
});
})();
(function () {
'use strict';
var cookie_cache = document.cookie;
Object.defineProperty(document, 'cookie', {
get: function () {
return cookie_cache;
},
set: function (val) {
console.log('Setting cookie', val);
// 填写cookie名
if (val.indexOf('lqWVdQzgOVyaT') != -1) {
debugger;
}
var cookie = val.split(";")[0];
var ncookie = cookie.split("=");
var flag = false;
var cache = cookie_cache.split("; ");
cache = cache.map(function (a) {
if (a.split("=")[0] === ncookie[0]) {
flag = true;
return cookie;
}
return a;
})
cookie_cache = cache.join("; ");
if (!flag) {
cookie_cache += cookie + "; ";
}
return cookie_cache;
}
});
})();
七、Hook JSON.parse
(function() {
var parse = JSON.parse;
JSON.parse = function(params) {
console.log("Hook JSON.parse ——> ", params);
debugger;
return parse(params);
}
})();
八、Proxy代理设置
function vmProxy(object){
return new Proxy(object, {
get: function(target, property, receiver) {
if(target[property] == undefined){
console.log("get: ", target, property, target[property]);
}
return target[property];
},
set: function(target, property, value) {
console.log("set: ", target, property, value);
return Reflect.set(...arguments);
}
})
}
ld = {};
ld.config = {};
ld.config.proxy = true; // 代理开关
ld.getType = function getType(obj){
return Object.prototype.toString.call(obj);
}
ld.proxy = function proxy(obj, objName){
// obj: 原始对象
// objName: 原始对象的名字
if(!ld.config.proxy){
return obj;
}
let handler = {
get:function (target,prop,receiver){ // 三个参数 获取属性时调用
let result;
try {//防止报错
result = Reflect.get(target,prop,receiver);
let type = ld.getType(result);
if(result instanceof Object){
console.log(`{get|obj:[${objName}] -> prop:[${prop.toString()}],type:[${type}]}`);
// 递归代理
result = ld.proxy(result, `${objName}.${prop.toString()}`);
}else if(typeof result === "symbol"){
console.log(`{get|obj:[${objName}] -> prop:[${prop.toString()}],ret:[${result.toString()}]}`);
}else{
console.log(`{get|obj:[${objName}] -> prop:[${prop.toString()}],ret:[${result}]}`);
}
}catch (e) {
console.log(`{get|obj:[${objName}] -> prop:[${prop.toString()}],error:[${e.message}]}`);
}
return result;
},
set:function (target,prop,value,receiver){ // 设置属性时调用
let result;
try{
result = Reflect.set(target,prop,value,receiver);
let type = ld.getType(value);
if(value instanceof Object){
console.log(`{set|obj:[${objName}] -> prop:[${prop.toString()}],type:[${type}]}`);
}else if(typeof value === "symbol"){
console.log(`{set|obj:[${objName}] -> prop:[${prop.toString()}],value:[${value.toString()}]}`);
}else{
console.log(`{set|obj:[${objName}] -> prop:[${prop.toString()}],value:[${value}]}`);
}
}catch (e){
console.log(`{set|obj:[${objName}] -> prop:[${prop.toString()}],error:[${e.message}]}`);
}
return result;
},
getOwnPropertyDescriptor:function (target, prop){ // 获取属性描述符时调用
let result;// undefined, 描述符对象
try{
result = Reflect.getOwnPropertyDescriptor(target, prop);
let type = ld.getType(result);
// debugger;
console.log(`{getOwnPropertyDescriptor|obj:[${objName}] -> prop:[${prop.toString()}],type:[${type}]}`);
// if(typeof result !== "undefined"){
// result = ld.proxy(result, `${objName}.${prop.toString()}.PropertyDescriptor`);
// }
}catch (e){
console.log(`{getOwnPropertyDescriptor|obj:[${objName}] -> prop:[${prop.toString()}],error:[${e.message}]}`);
}
return result;
},
defineProperty: function (target, prop, descriptor){ // 定义属性时调用
let result;
try{
result = Reflect.defineProperty(target, prop, descriptor);
console.log(`{defineProperty|obj:[${objName}] -> prop:[${prop.toString()}]}`);
}catch (e) {
console.log(`{defineProperty|obj:[${objName}] -> prop:[${prop.toString()}],error:[${e.message}]}`);
}
return result;
},
apply:function (target, thisArg, argumentsList){ // 函数调用时使用
// target: 函数对象
// thisArg: 调用函数的this指针
// argumentsList: 数组, 函数的入参组成的一个列表
let result;
try{
result = Reflect.apply(target, thisArg, argumentsList);
let type = ld.getType(result);
if(result instanceof Object){
console.log(`{apply|function:[${objName}], type:[${type}]}`);
}else if(typeof result === "symbol"){
console.log(`{apply|function:[${objName}], result:[${result.toString()}]}`);
}else{
console.log(`{apply|function:[${objName}], result:[${result}]}`);
}
}catch (e) {
console.log(`{apply|function:[${objName}],error:[${e.message}]}`);
}
return result;
},
construct:function (target, argArray, newTarget) { // 构造器,实例化的时候调用
// target: 函数对象
// argArray: 参数列表
// newTarget:代理对象
let result;
try{
result = Reflect.construct(target, argArray, newTarget);
let type = ld.getType(result);
console.log(`{construct|function:[${objName}], type:[${type}]}`);
}catch (e) {
console.log(`{construct|function:[${objName}],error:[${e.message}]}`);
}
return result;
},
deleteProperty:function (target, propKey){ //删除属性
let result = Reflect.deleteProperty(target, propKey);
console.log(`{deleteProperty|obj:[${objName}] -> prop:[${propKey.toString()}], result:[${result}]}`);
return result;
},
has:function (target, propKey){ // in 操作符
let result = Reflect.has(target, propKey);
console.log(`{has|obj:[${objName}] -> prop:[${propKey.toString()}], result:[${result}]}`);
return result;
},
ownKeys: function (target){ // 是否
let result = Reflect.ownKeys(target);
console.log(`{ownKeys|obj:[${objName}]}`);
return result
},
getPrototypeOf:function(target){ // 获取原型对象
let result = Reflect.getPrototypeOf(target);
console.log(`{getPrototypeOf|obj:[${objName}]}`);
return result;
},
setPrototypeOf:function(target, proto){ // 设置原型对象
let result = Reflect.setPrototypeOf(target, proto);
console.log(`{setPrototypeOf|obj:[${objName}]}`);
return result;
},
preventExtensions:function(target){ // 扩展
let result = Reflect.preventExtensions(target, proto);
console.log(`{preventExtensions|obj:[${objName}]}`);
return result;
},
// isExtensible:function(target){
// let result = Reflect.isExtensible(target, proto);
// console.log(`{isExtensible|obj:[${objName}]}`);
// return result;
// }
};
return new Proxy(obj, handler);
};