还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
😝朋友们如果有需要的话,可以联系领取~
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
2️⃣视频配套工具&国内外网安书籍、文档
① 工具
② 视频
③ 书籍
资源较为敏感,未展示全面,需要的最下面获取
② 简历模板
因篇幅有限,资料较为敏感仅展示部分资料,添加上方即可获取👆
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
a[d] &= 255;
return r[t("0x16", "[wyj")](i, 255) ? [0, i][k](a) : [r[t("0xb7", "uDrd")](i, 8), r[t("0x36", "bWtw")](i, 255)][k](a)
},
es: function(e) {
var t = u;
e || (e = "");
var n = e[L](0, 255),
r = [],
a = W[t("0x6f", "pRbw")](n)[f](2);
return r[Y](a[g]), r[k](a)
},
en: function(e) {
var t = u,
n = {};
n[t("0xbc", "xY%o")] = function(e, t) {
return e(t)
}, n[t("0x66", "FVER")] = function(e, t) {
return e > t
}, n[t("0xe2", "wWU6")] = function(e, t) {
return e !== t
}, n[t("0xf7", "Dtn]")] = function(e, t) {
return e % t
}, n[t("0xcf", "zrWU")] = function(e, t) {
return e / t
}, n[t("0x3f", "&Wvj")] = function(e, t) {
return e < t
}, n[t("0x41", "w(Dq")] = function(e, t) {
return e \* t
}, n[t("0x10f", "xY%o")] = function(e, t) {
return e + t
}, n[t("0x63", "4j9@")] = function(e, t, n) {
return e(t, n)
};
var r = n;
e || (e = 0);
var a = r[t("0x23", "v7]k")](D, e),
i = [];
r[t("0xaf", "Dtn]")](a, 0) ? i[Y](0) : i[Y](1);
for (var s = Math[t("0x13", "D@GR")](a)[y](2)[_](""), o = 0; r[t("0xa6", "bWtw")](r[t("0x111", "pRbw")](s[g], 8), 0); o += 1)
s[p]("0");
s = s[l]("");
for (var d = Math[c](r[t("0xdf", "1YRP")](s[g], 8)), m = 0; r[t("0x145", "vqpk")](m, d); m += 1) {
var f = s[L](r[t("0xe1", "Zd5Z")](m, 8), r[t("0x49", "bNd#")](r[t("0x31", "VdBX")](m, 1), 8));
i[Y](r[t("0xf0", "Buip")](D, f, 2))
}
var h = i[g];
return i[p](h), i
},
sc: function(e) {
var t = u,
n = {};
n[t("0x101", "iF%V")] = function(e, t) {
return e > t
}, e || (e = "");
var r = n[t("0x25", "bWtw")](e[g], 255) ? e[L](0, 255) : e;
return W[t("0xe0", "D@GR")](r)[f](2)
},
nc: function(e) {
var t = u,
n = {};
n[t("0xf5", "Poq&")] = function(e, t) {
return e(t)
}, n[t("0x74", "wWU6")] = function(e, t) {
return e / t
}, n[t("0x8", "D@GR")] = function(e, t, n, r) {
return e(t, n, r)
}, n[t("0x24", "1YRP")] = function(e, t) {
return e \* t
}, n[t("0xb6", "T5dY")] = function(e, t) {
return e < t
}, n[t("0xc4", "YD9J")] = function(e, t) {
return e \* t
}, n[t("0x67", "uzab")] = function(e, t) {
return e + t
}, n[t("0x9a", "5W0R")] = function(e, t, n) {
return e(t, n)
};
var r = n;
e || (e = 0);
var a = Math[t("0x93", "tM!n")](r[t("0x11c", "EX&9")](D, e))[y](2),
s = Math[c](r[t("0xa3", "1YRP")](a[g], 8));
a = r[t("0x1b", "0I]C")](i, a, r[t("0x42", "tnRV")](s, 8), "0");
for (var o = [], d = 0; r[t("0x10c", "bNd#")](d, s); d += 1) {
var l = a[L](r[t("0xc1", "1YRP")](d, 8), r[t("0x4a", "D@GR")](r[t("0x114", "&Wvj")](d, 1), 8));
o[Y](r[t("0x12a", "uDrd")](D, l, 2))
}
return o
},
va: function(e) {
var t = u,
n = {};
n[t("0x95", "FVER")] = function(e, t) {
return e(t)
}, n[t("0x26", "5W0R")] = function(e, t, n, r) {
return e(t, n, r)
}, n[t("0x13a", "Naa&")] = function(e, t) {
return e \* t
}, n[t("0xa5", "rib%")] = function(e, t) {
return e / t
}, n[t("0x4e", "Zd5Z")] = function(e, t) {
return e >= t
}, n[t("0x9e", "&Wvj")] = function(e, t) {
return e - t
}, n[t("0xa2", "rib%")] = function(e, t) {
return e === t
}, n[t("0xeb", "EX&9")] = function(e, t) {
return e & t
}, n[t("0xf8", "Buip")] = function(e, t) {
return e + t
}, n[t("0x50", "&Wvj")] = function(e, t) {
return e >>> t
};
var r = n;
e || (e = 0);
for (var a = Math[t("0x94", "vqpk")](r[t("0x12b", "5W0R")](D, e)), s = a[y](2), o = [], d = (s = r[t("0x98", "bWtw")](i, s, r[t("0xe7", "T5dY")](Math[c](r[t("0xf9", "Buip")](s[g], 7)), 7), "0"))[g]; r[t("0xe4", "uzab")](d, 0); d -= 7) {
var l = s[L](r[t("0xf1", "49kG")](d, 7), d);
if (r[t("0xe8", "YD9J")](r[t("0x123", "wWU6")](a, -128), 0)) {
o[Y](r[t("0x103", "T5dY")]("0", l));
break
}
o[Y](r[t("0x11a", "Poq&")]("1", l)), a = r[t("0x92", "49kG")](a, 7)
}
return o[h](function(e) {
return D(e, 2)
})
},
ek: function(e) {
var t = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : "",
n = u,
r = {};
r[n("0x2", "w(Dq")] = function(e, t) {
return e !== t
}, r[n("0xca", "Zu]D")] = function(e, t) {
return e === t
}, r[n("0x57", "Naa&")] = n("0xf6", "w(Dq"), r[n("0x7e", "Zu]D")] = n("0x110", "YD9J"), r[n("0x7a", "T5dY")] = n("0x75", "Dtn]"), r[n("0x128", "vqpk")] = function(e, t) {
return e > t
}, r[n("0x4", "zrWU")] = function(e, t) {
return e <= t
}, r[n("0x56", "uzab")] = function(e, t) {
return e + t
}, r[n("0x141", "VdBX")] = function(e, t, n, r) {
return e(t, n, r)
}, r[n("0xd2", "FVER")] = n("0xda", "j&er"), r[n("0x17", "FVER")] = function(e, t, n) {
return e(t, n)
}, r[n("0x96", "vqpk")] = function(e, t) {
return e - t
}, r[n("0x11f", "VdBX")] = function(e, t) {
return e > t
};
var s = r;
if (!e) return [];
var o = [],
d = 0;
s[n("0x147", "WmWP")](t, "") && (s[n("0x125", "pRbw")](Object[n("0x109", "FlMG")][y][n("0xb0", "y@5u")](t), s[n("0xa4", "4j9@")]) && (d = t[g]), s[n("0x39", "tnRV")](void 0 === t ? "undefined" : a(t), s[n("0xf", "D@GR")]) && (d = (o = W.sc(t))[g]), s[n("0x39", "tnRV")](void 0 === t ? "undefined" : a(t), s[n("0x5f", "rib%")]) && (d = (o = W.nc(t))[g]));
var l = Math[n("0xe5", "pRbw")](e)[y](2),
c = "";
c = s[n("0x9d", "Hof]")](d, 0) && s[n("0x28", "D@GR")](d, 7) ? s[n("0x6", "bWtw")](l, s[n("0x104", "49kG")](i, d[y](2), 3, "0")) : s[n("0xd7", "iF%V")](l, s[n("0xab", "EX&9")]);
var _ = [s[n("0x97", "rib%")](D, c[f](Math[n("0x12c", "uDrd")](s[n("0x15", "w(Dq")](c[g], 8), 0)), 2)];
return s[n("0x82", "(k)G")](d, 7) ? _[k](W.va(d), o) : _[k](o)
},
ecl: function(e) {
var t = u,
n = {};
n[t("0x122", "bWtw")] = function(e, t) {
return e < t
}, n[t("0x131", "&Wvj")] = function(e, t, n) {
return e(t, n)
};
for (var r = n, a = [], i = e[y](2)[_](""), s = 0; r[t("0xd8", "tM!n")](i[g], 16); s += 1)
i[p](0);
return i = i[l](""), a[Y](r[t("0x19", "UcbW")](D, i[L](0, 8), 2), r[t("0xbe", "WmWP")](D, i[L](8, 16), 2)), a
},
pbc: function() {
var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : "",
t = u,
n = {};
n[t("0x7c", "0]JJ")] = function(e, t) {
return e(t)
}, n[t("0x20", "iF%V")] = function(e, t) {
return e < t
}, n[t("0xaa", "tnRV")] = function(e, t) {
return e - t
};
var r = n,
a = [],
i = W.nc(r[t("0x43", "[wyj")](s, e[m](/\\s/g, "")));
if (r[t("0xcd", "bWtw")](i[g], 4)) for (var o = 0; r[t("0x51", "zrWU")](o, r[t("0x3a", "HaX[")](4, i[g])); o++)
a[Y](0);
return a[k](i)
},
gos: function(e, t) {
var n = u,
r = {};
r[n("0x135", "EX&9")] = function(e, t) {
return e === t
}, r[n("0x8e", "wWU6")] = n("0x136", "w(Dq"), r[n("0x85", "CCDE")] = n("0x13f", "1YRP");
var a = r,
i = Object[a[n("0x86", "0I]C")]](e)[h](function(t) {
var r = n;
return a[r("0xef", "5W0R")](t, a[r("0x9c", "r6cx")]) || a[r("0xb2", "xY%o")](t, "c") ? "" : t + ":" + e[t][y]() + ","
})[l]("");
return n("0x12e", "zrWU") + t + "={" + i + "}"
},
budget: function(e, t) {
var n = u,
r = {};
r[n("0x133", "vqpk")] = function(e, t) {
return e === t
}, r[n("0xd0", "Buip")] = function(e, t) {
return e === t
}, r[n("0x48", "1YRP")] = function(e, t) {
return e >= t
}, r[n("0x13c", "HaX[")] = function(e, t) {
return e + t
};
var a = r;
return a[n("0xa", "iF%V")](e, 64) ? 64 : a[n("0xc2", "v7]k")](e, 63) ? t : a[n("0x46", "NZM&")](e, t) ? a[n("0x129", "Zd5Z")](e, 1) : e
},
encode: function(e, t) {
var n = u,
r = {};
r[n("0x3", "0I]C")] = function(e, t) {
return e < t
}, r[n("0x132", "r6cx")] = n("0x13d", "[wyj"), r[n("0x10e", "v7]k")] = function(e, t) {
return e < t
}, r[n("0x11b", "YD9J")] = n("0x71", "Zu]D"), r[n("0x4b", "uzab")] = function(e, t) {
return e !== t
}, r[n("0x7b", "v7]k")] = n("0x55", "j&er"), r[n("0x137", "Hof]")] = n("0x14", "uDrd"), r[n("0xc", "r6cx")] = function(e, t) {
return e \* t
}, r[n("0xdb", "86I$")] = n("0xd5", "1YRP"), r[n("0x45", "5W0R")] = n("0xec", "WmWP"), r[n("0xa9", "uzab")] = function(e, t) {
return e | t
}, r[n("0xcb", "1YRP")] = function(e, t) {
return e << t
}, r[n("0x1a", "Dtn]")] = function(e, t) {
return e & t
}, r[n("0x69", "T5dY")] = function(e, t) {
return e - t
}, r[n("0x5c", "[wyj")] = function(e, t) {
return e >> t
}, r[n("0x138", "Naa&")] = function(e, t) {
return e - t
}, r[n("0x40", "Hof]")] = function(e, t) {
return e & t
}, r[n("0x52", "FVER")] = function(e, t) {
return e >> t
}, r[n("0x100", "pRbw")] = function(e, t) {
return e - t
}, r[n("0x68", "w(Dq")] = function(e, t) {
return e(t)
}, r[n("0x54", "Buip")] = function(e, t, n) {
return e(t, n)
}, r[n("0x80", "0I]C")] = function(e, t, n) {
return e(t, n)
}, r[n("0x1c", "iF%V")] = function(e, t) {
return e | t
}, r[n("0xa1", "w(Dq")] = function(e, t) {
return e << t
}, r[n("0x9b", "YD9J")] = function(e, t) {
return e + t
}, r[n("0x72", "vqpk")] = function(e, t) {
return e + t
}, r[n("0x6d", "wWU6")] = function(e, t) {
return e + t
};
for (var i, s, o, d, l = r, c = {
"\_bÇ": e = e,
\_bK: 0,
\_bf: function() {
var t = n;
return e[v](c[t("0x8c", "bNd#")]++)
}
}, _ = {
"\_ê": [],
"\_bÌ": -1,
"\_á": function(e) {
var t = n;
_[t("0x7d", "T5dY")]++, _["\_ê"][_[t("0xc8", "vqpk")]] = e
},
"\_bÝ": function() {
var e = n;
return _bÝ [e("0x11e", "WmWP")]--, l[e("0x8d", "w(Dq")](_bÝ [e("0xcc", "Naa&")], 0) && (_bÝ [e("0x106", "tnRV")] = 0), _bÝ ["\_ê"][_bÝ [e("0xae", "bNd#")]]
}
}, f = "", h = l[n("0x7", "v7]k")], p = 0; l[n("0x142", "NZM&")](p, h[g]); p++)
_["\_á"](h[l[n("0xc5", "Hof]")]](p));
_["\_á"]("=");
var y = l[n("0x118", "WmWP")](void 0 === t ? "undefined" : a(t), l[n("0x6b", "86I$")]) ? Math[l[n("0xb5", "YD9J")]](l[n("0x8f", "Buip")](Math[l[n("0xbd", "tM!n")]](), 64)) : -1;
for (p = 0; l[n("0x11", "Hof]")](p, e[g]); p = c[n("0x70", "&NG^")])
for (var M = l[n("0x32", "r6cx")][n("0x37", "D@GR")]("|"), L = 0;;) {
switch (M[L++]) {
case "0":
s = l[n("0xde", "EX&9")](l[n("0x12f", "VdBX")](l[n("0x120", "NZM&")](_["\_ê"][l[n("0x5d", "4j9@")](_[n("0x7d", "T5dY")], 2)], 3), 4), l[n("0x139", "tnRV")](_["\_ê"][l[n("0x47", "Poq&")](_[n("0x87", "v7]k")], 1)], 4));
continue;
case "1":
d = l[n("0x89", "NZM&")](_["\_ê"][_[n("0x84", "4j9@")]], 63);
continue;
case "2":
_["\_á"](c[n("0x10", "5W0R")]());
continue;
case "3":
i = l[n("0x52", "FVER")](_["\_ê"][l[n("0xc9", "YD9J")](_[n("0xe9", "Zd5Z")], 2)], 2);
continue;
case "4":
l[n("0x3c", "UcbW")](isNaN, _["\_ê"][l[n("0x64", "v7]k")](_[n("0x12d", "HaX[")], 1)]) ? o = d = 64 : l[n("0x73", "T5dY")](isNaN, _["\_ê"][_[n("0x77", "y@5u")]]) && (d = 64);
continue;
case "5":
_["\_á"](c[n("0xc7", "pRbw")]());
continue;
case "6":
l[n("0x8a", "&Wvj")](void 0 === t ? "undefined" : a(t), l[n("0x60", "FVER")]) && (i = l[n("0xee", "rib%")](t, i, y), s = l[n("0x149", "y@5u")](t, s, y), o = l[n("0x9", "vqpk")](t, o, y), d = l[n("0xff", "r6cx")](t, d, y));
continue;
case "7":
o = l[n("0x144", "EX&9")](l[n("0xa7", "tM!n")](l[n("0x58", "xY%o")](_["\_ê"][l[n("0xb9", "Zd5Z")](_[n("0xe6", "D@GR")], 1)], 15), 2), l[n("0xfa", "UcbW")](_["\_ê"][_[n("0x7d", "T5dY")]], 6));
continue;
case "8":
f = l[n("0x134", "1YRP")](l[n("0x10a", "0JIq")](l[n("0x112", "bNd#")](l[n("0x3b", "4j9@")](f, _["\_ê"][i]), _["\_ê"][s]), _["\_ê"][o]), _["\_ê"][d]);
continue;
case "9":
_["\_á"](c[n("0x6c", "bNd#")]());
continue;
case "10":
_[n("0x87", "v7]k")] -= 3;
continue
}
break
}
return l[n("0x1e", "T5dY")](f[m](/=/g, ""), h[y] || "")
}
};
e[u("0x4d", "v7]k")] = W
}).call(this, n(1)(e))
}
接下来我们需要创建一个自执行函数,把上面用到的**loadCode**函数定义一下,并将它添加到**window**对象上,可以看到**t**是一个空对象,用来存储模块的导出结果!**n**函数用于加载模块,所以核心调试也就是需要在**commons.fff25be43f7d0482c30c.js**文件内把Webpack加载的模块代码全部扣出来,如下所示:
(function(moduleLoader) {
var modules = {};
function loadModule(moduleId) {
if (modules[moduleId]) return modules[moduleId].exports;
var module = modules[moduleId] = {
id: moduleId,
loaded: !1,
exports: {}
};
return moduleLoader[moduleId].call(module.exports, module, module.exports, loadModule), module.loaded = !0, module.exports
}
window.loadModule = loadModule;
loadModule.m = moduleLoader;
loadModule.c = modules;
loadModule.d = function(exports, name, getter) {
loadModule.o(exports, name) || Object.defineProperty(exports, name, {
enumerable: !0,
get: getter
})
};
loadModule.r = function(exports) {
"undefined" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(exports, Symbol.toStringTag, {
value: "Module"
}), Object.defineProperty(exports, "\_\_esModule", {
value: !0
})
};
loadModule.t = function(value, mode) {
if (1 & mode && (value = loadModule(value)), 8 & mode) return value;
if (4 & mode && "object" == typeof value && value && value.__esModule) return value;
var ns = Object.create(null);
if (loadModule.r(ns), Object.defineProperty(ns, "default", {
enumerable: !0,
value: value
}), 2 & mode && "string" != typeof value) for (var name in value) loadModule.d(ns, name, function(name) {
return value[name]
}.bind(null, name));
return ns
};
loadModule.n = function(module) {
var getter = module && module.__esModule ? function() {
return module.default
} : function() {
return module
};
return loadModule.d(getter, "a", getter), getter
};
loadModule.o = function(object, property) {
return Object.prototype.hasOwnProperty.call(object, property)
};
loadModule.p = "";
})(obj__);
var encrypt = window.loadModule(“3”);
上面重新实现的自执行函数主要功能则是创建了一个模块加载器!这个加载器允许通过给定模块的标识符来动态加载模块,并返回模块的导出内容。通过使用闭包和模块加载器模式,将模块的定义和加载逻辑封装在内部,并提供了一些工具函数来管理模块的加载和导出
>
> **简单一句话就是:简易的模块加载器,用于动态加载和管理模块!辅助管理模块的状态和导出**
>
>
>
继续往下调试,边调试边补代码,细节很多,直接贴关键部分的代码,如下所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/a7821edf9f3a4358974df7f5ff9a0534.png)
稍微改造一下!下面函数的作用主要是生成随机字符,然后从预定义的字符串中索引取值,直到字符串的长度达到指定的长度为止!这操作基本很多网站的加密都有的流程
function l(e) {
e = e || 21;
for (var t = “”; 0 < e–😉
t += “_~varfunctio0125634789bdegjhklmpqswxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”[64 * Math.random() | 0];
return t
}
继续上面函数往下调试,下面的这个方法作用是,将给定的字符串填充到指定长度,并且可以指定填充的字符!一个要填充的字符。如下所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b6c86ffa4c17408294a1423a3ea83893.png)
稍微改造一下!如下,函数会对参数进行检查,确保它们的类型正确。然后,它会计算需要填充的字符数量,并将填充的字符添加到原始字符串的末尾,直到字符串达到指定的长度为止,代码如下:
function d(e, t, n) {
if (“string” != typeof e)
throw new Error(“The string parameter must be a string.”);
if (e.length < 1)
throw new Error(“The string parameter must be 1 character or longer.”);
if (“number” != typeof t)
throw new Error(“The length parameter must be a number.”);
if (“string” != typeof n && n)
throw new Error(“The character parameter must be a string.”);
var r = -1;
for (t -= e.length,
n || 0 === n || (n = " "); ++r < t;)
e += n;
return e
}
就把这个Webpack的JS代码全部扣下来,不需要补环境!主打的就是扣JS还原算法,最后测试一下最终还原的算法效果,如下所示:
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1070cb6a776343e899d03a4d994bf76f.png)
接下来我们简单的编写一个Demo,调用算法进行一下测试,代码实现如下:
-*- coding: utf-8 -*-
import json
import execjs
import requests
def get_anti_content():
with open(“get_anti_content.js”, encoding=‘utf-8’) as f:
ctx = execjs.compile(f.read())
anti_content = ctx.call(
“get_anti_content”
)
return anti_content
def get_mms_pdd():
headers = {
"accept": "\*/\*",
"accept-language": "en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7",
"cache-control": "no-cache",
"content-type": "application/json",
"origin": "https://mms.pinduoduo.com",
还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!
王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。
对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!
【完整版领取方式在文末!!】
93道网络安全面试题
内容实在太多,不一一截图了
黑客学习资源推荐
最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
1️⃣零基础入门
① 学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
② 路线对应学习视频
同时每个成长路线对应的板块都有配套的视频提供:
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!