4. 对象调用还原
目标:
4.1 先拿到对象的定义
从代码中可以看出来,拿到了遍历的对象的名字,对象的绑定以及对象里存放的(key,value)数组。
4.2 遍历对象中的数组
代码:
4.3 如果value是函数定义
代码:
已经拿到了调用对象的属性名和值(key和value)以及调用的参数,接下来就是函数调用的还原
而函数的调用又分成了三种情况:
- 二元运算
- 函数调用
- 逻辑运算
4.4 如果value是字符串
字符串就不再赘述了,里面的一些具体操作需要自己在ast解析网站中去具体分析才行
4.5 收尾
如何判断遍历的定义对象是否应该被删除?
只有绑定对象的引用数组的个数与已经进行处理过的次数相等,只有符合条件才能将定义数组的对象位置删除,代码如下:
到此,对象调用还原结束!!
4.6 验证测试
参考: https://jia666666.blog.csdn.net/article/details/120287559v
//测试代码: 参考上面的网站
var _0xb28de8 = {
"abcd": function (_0x22293f, _0x5a165e) {
return _0x22293f == _0x5a165e;
},
"dbca": function (_0xfbac1e, _0x23462f, _0x556555) {
return _0xfbac1e(_0x23462f, _0x556555);
},
"aaa": function (_0x57e640) {
return _0x57e640();
},
"bbb": "eee"
};
//由于后面kk函数体传参数使用该字典对象,参数未知,保留该字典对象
var aa = 123 == 456;
var bb = bcd(11, 22);
var cc = dcb();
function dd() {
var dd = "eee45475";
}
var ddf = "eee"; //局部变量与全局变量同名验证
function dd() {
//全局变量在函数体是否可用验证
var dd = "eee";
}
function kk(a) {
//传值验证
var ss = _0xb28de8[a];
}
验证成功!!