JS逆向基础之反调试

JS逆向基础之反调试

截至目前的话大家应该都知道我们在进行js逆向的时候需要打开浏览器开发者工具进行网页的调试,但是在有时候网站会阻止我们去调试它的代码,而其阻止我们的手段也是多种多样的。接下来我们就来简单了解一下逆向过程中常见的反调试手段。

一、无限debugger

在有的网站中,当我们想要打开开发者工具调试代码的时候,总是会被自动断点到一个debugger的代码处无限的执行debugger。如下方所示:

在这里插入图片描述

针对这种情况,我们可以有以下几种常用的手段。

1.1 单独禁用某处的断点

这里我们可以选择将此debugger处的断点直接禁用,只需要在该行代码行数那里点击鼠标右键然后选择Never pause here再刷新页面就不会在此处断下了。

在这里插入图片描述
在这里插入图片描述

1.2 添加条件断点

在debugger行数的位置单击鼠标右键,然后选择add conditional breakpoint,再添加false然后回车,也可以跳过无限debugger。但是要注意,有的无限debugger是经混淆之后通过定时器来实现的,这种情况下就需要修改js代码来解决。

1.3 本地js替换

我们可以将网站中的js文件保存到本地中进行修改,主要是将无限debugger相关的代码替换或者删除,这样来达到绕过无限debugger的目的。修改之后可以通过浏览器开发者工具或者其他的抓包工具如:fiddler、charles或者mitmproxy等来进行动态拦截并替换掉js文件。

1.4 注入代码替换掉js中的无限debugger

这里其实就是用到了hook技术,通过注入一段js代码去拦截debugger处的代码并将其进行替换。这个方案目前不太好找案例,但是大家可以简单通过下方描述来了解一下先。

// 定义 XMLHttpRequest 原型对象
const XHR = XMLHttpRequest.prototype;// 保存原始 send 方法
const originalSend = XHR.send;// 重写 send 方法
XHR.send = function() {// 将所有的 debugger 替换为 console.logconst args = Array.from(arguments).map(arg => arg.replace(/debugger;/g, 'console.log("debugger");'));// 调用原始 send 方法并返回结果return originalSend.apply(this, args);
};// 定义 fetch 函数
const originalFetch = window.fetch;// 重写 fetch 函数
window.fetch = function() {// 将所有的 debugger 替换为 console.logconst args = Array.from(arguments).map(arg => arg.replace(/debugger;/g, 'console.log("debugger");'));// 调用原始 fetch 方法并返回结果return originalFetch.apply(this, args);
};

这段代码其实就是通过Hook XMLHttpRequestfetch 函数,在请求发送前将无限 debugger 语句替换为普通语句,并在请求完成后恢复原来的代码。

二、开发者工具禁用

开发者工具禁用其实就是站点中禁用了F12或者鼠标右键或者其他能够打开开发者工具的快捷键,其中大多数是禁用了F12和鼠标右键。很少会出现禁用其他快捷键的站点,毕竟并不是所有的浏览器打开开发者工具的快捷键都是ctrl+shift+i。还有的站点在打开开发者工具的时候会自动关闭页面或者跳转到其他页面。遇到这些情况的时候我们的处理方式主要有以下几种:

1. 在禁用了其中某些快捷键的时候我们可以考虑使用其他的打开开发者工具的方式来打开开发者工具。例如禁用了F12那我们就选择使用鼠标右键再去打开。
2.更换浏览器,有的站点会根据浏览器来判断。
3.打开开发者工具页面自动关闭。可以通过HOOK来定位到参数然后在页面关闭之前进行断点。如果是没有找到参数位置的话可以先任意断点然后定位到页面关闭的位置先将关闭页面的js替换。
4.打开开发者工具之后页面发生跳转。这种情况一般是网站做了触发限制,我们可以使用页面中的事件监听断点event listener breakpoint。

三、控制台问题

在有的站点中,打开开发者工具之后,console会无限输出某些内容或者会无限执行清空操作,导致我们无法通过console来调试js代码中的部分逻辑。那么其实到这里大家也应该能够猜测到,这种情况就是通过js代码来实现的,所以我们只需要定位到这些无限清空或者无限输出的代码位置然后通过hook技术来将其进行替换或者删除即可。

四、蜜獾

蜜獾也称为“蜜獾攻击”,其目标是欺骗黑客攻击虚假系统,以便安全人员能够监视和记录他们的活动,通常被用于保护真实系统免受攻击。

在JS逆向中,蜜獾通常指的是被嵌入到网站或者应用程序中的一些特殊代码(无用代码块和花指令)。这些代码可能并不会对底层逻辑有任何影响,而这些代码通常都是单独的一块或者多块,哪怕是将这些代码删除也不会影响到原页面的正常运行。除了无用代码之外,还会存在着一些花指令,例如一些调用、跳转等,这些指令通常将大家引导到一个错误的调用逻辑之中。

当然,由于JS是一门解释性的语言,所以从严格意义来讲并不存在花指令这种概念。花指令通常指汇编语言中的一些特殊指令,用于执行一些非常规操作或性能优化。

在JavaScript中,可以使用一些高级技术来实现类似于花指令的效果。例如:

  1. WebAssembly:WebAssembly是一种新型的二进制格式,它可以在浏览器中运行本地代码。通过使用WebAssembly,开发者可以直接使用C/C++等语言编写高效的算法,并且可以获得比JavaScript更好的性能。
  2. asm.js:asm.js是一种JavaScript子集,它专门为了提高性能而设计。asm.js代码经过特殊编译后可以达到近乎原生代码的速度。
  3. SIMD.js:SIMD(单指令多数据)是一种处理大量数据的技术,在JavaScript中可以通过使用SIMD.js库来实现。该库提供了一些类似于花指令的API,用于执行高效的向量计算和浮点数运算等操作。

需要注意的是,在JavaScript中使用这些技术需要具备较强的编程和计算机系统知识,并且需要考虑到跨平台和兼容性等问题。其核心就是添加一些毫无意义却能够混淆视听的代码,如下方将一个二项式转函数花指令。

function aaa(a, b){return a+b
}
function bbb(a,b){return aaa(a,b)
}
aaa(1, 2)	// 输出7

此处看到的是一个非常简单的例子,在实际的逆向过程中,代码可能是有成百上千乃至上万行,所以调用的函数与实际定义的函数可能会有很大的差别。一般能力足够的情况下会选择使用AST技术来还原掉花指令,当然并不是说只能去AST,不怕严重脱发的话选择硬扣也是完全可以的。

五、内存爆破

平时在调试js代码时,经常会出现浏览器卡死的情况,有时候是在调试js的过程中,有时候是在console中调试代码的过程中,有时候是在格式化代码之后,甚至有时候在打开开发者工具之后直接卡崩溃。这些情况其实就是因为在网站中存在着监测状态的代码,这些代码在监测到我们开始调试的一些状态之后就会执行一段占用内存或者能让浏览器内存溢出的代码,从而导致我们的调试没有办法继续进行。

而解决办法就是找到这段让浏览器发生崩溃的代码,然后将其进行替换或者删除。

六、代码混淆

6.1 eval混淆

eval是v8引擎中定义的一个方法,这个方法能够执行一段JS代码,该方法中传入的是字符串,该字符串是一串可执行的js代码。例如:

jscode = "(function(){return 3})()"
result = eval(jscode)
console.log(result)

进一步处理的话就可以将jscode进行base64编码,然后eval中解码后再进行还原。如下:

// jscode = btoa("(function(){return 3})()")
jscode = "KGZ1bmN0aW9uKCl7cmV0dXJuIDN9KSgp"
result = eval(atob(jscode))
console.log(result)
6.2 aa混淆

其主要是利用了unicode特性进行混淆,将js代码转变成了一些常用的网络表情,例如,将上方的三行代码进行aa混淆之后代码如下:

゚ω゚ノ = /`m´)ノ ~┻━┻   //*´∇`sojson.com*/ ['_'];
o = (゚ー゚) = _ = 3;
c = (゚Θ゚) = (゚ー゚) - (゚ー゚);
(゚Д゚) = (゚Θ゚) = (o ^ _ ^ o) / (o ^ _ ^ o);
(゚Д゚) = {゚Θ゚: '_',゚ω゚ノ: ((゚ω゚ノ == 3) + '_') [゚Θ゚],゚ー゚ノ: (゚ω゚ノ + '_')[o ^ _ ^ o - (゚Θ゚)],゚Д゚ノ: ((゚ー゚ == 3) + '_')[゚ー゚]
};
(゚Д゚) [゚Θ゚] = ((゚ω゚ノ == 3) + '_') [c ^ _ ^ o];
(゚Д゚) ['c'] = ((゚Д゚) + '_') [(゚ー゚) + (゚ー゚) - (゚Θ゚)];
(゚Д゚) ['o'] = ((゚Д゚) + '_') [゚Θ゚];
(゚o゚) = (゚Д゚) ['c'] + (゚Д゚) ['o'] + (゚ω゚ノ + '_')[゚Θ゚] + ((゚ω゚ノ == 3) + '_') [゚ー゚] + ((゚Д゚) + '_') [(゚ー゚) + (゚ー゚)] + ((゚ー゚ == 3) + '_') [゚Θ゚] + ((゚ー゚ == 3) + '_') [(゚ー゚) - (゚Θ゚)] + (゚Д゚) ['c'] + ((゚Д゚) + '_') [(゚ー゚) + (゚ー゚)] + (゚Д゚) ['o'] + ((゚ー゚ == 3) + '_') [゚Θ゚];
(゚Д゚) ['_'] = (o ^ _ ^ o) [゚o゚] [゚o゚];
(゚ε゚) = ((゚ー゚ == 3) + '_') [゚Θ゚] + (゚Д゚).゚Д゚ノ + ((゚Д゚) + '_') [(゚ー゚) + (゚ー゚)] + ((゚ー゚ == 3) + '_') [o ^ _ ^ o - ゚Θ゚] + ((゚ー゚ == 3) + '_') [゚Θ゚] + (゚ω゚ノ + '_') [゚Θ゚];
(゚ー゚) += (゚Θ゚);
(゚Д゚)[゚ε゚] = '\\';
(゚Д゚).゚Θ゚ノ = (゚Д゚ + ゚ー゚)[o ^ _ ^ o - (゚Θ゚)];
(o゚ー゚o) = (゚ω゚ノ + '_')[c ^ _ ^ o];
(゚Д゚) [゚o゚] = '\"';
(゚Д゚) ['_']((゚Д゚) ['_'](゚ε゚ + (゚Д゚)[゚o゚] + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚ー゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (o ^ _ ^ o)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚ー゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (c ^ _ ^ o) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (o ^ _ ^ o) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (o ^ _ ^ o)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (c ^ _ ^ o) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (o ^ _ ^ o) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (c ^ _ ^ o) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (o ^ _ ^ o)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚Θ゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚ー゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (o ^ _ ^ o)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚ー゚) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (o ^ _ ^ o)) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (c ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((o ^ _ ^ o) - (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + (゚ー゚) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (o ^ _ ^ o) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + ((゚ー゚) + (゚Θ゚)) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((゚ー゚) + (゚Θ゚)) + (゚ー゚) + (゚Д゚)[゚ε゚] + (゚Θ゚) + ((o ^ _ ^ o) + (o ^ _ ^ o)) + (゚ー゚) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚o゚])(゚Θ゚))((゚Θ゚) + (゚Д゚)[゚ε゚] + ((゚ー゚) + (゚Θ゚)) + (゚Θ゚) + (゚Д゚)[゚o゚]);

这串混淆后的代码在引擎中是完全可以正常运行的。

在这里插入图片描述

可以看出aa混淆的代码基本上已经完全不像是代码了,更像是女孩子们喜欢使用的表情,但是其也有缺点,就是压栈严重,所以并不适合代码量比较大的脚本加密。

压栈(Stack)是一种常见的数据结构,具有“后进先出”(Last-In-First-Out,LIFO)的特点。这种数据结构的特点是,只能在栈顶进行插入和删除操作。当一个元素被插入到栈中后,只有在这个元素被删除之后,才能插入下一个元素。

压栈的操作又称为入栈(Push),弹出栈的操作又称为出栈(Pop)。栈还具有许多其他的操作,比如获取栈顶元素(Top)、判断栈是否为空(IsEmpty)等等。

栈被广泛应用于计算机科学中。比如,编译器使用栈来管理函数的调用和返回,操作系统使用栈来存储函数调用的上下文信息等等。

6.3 jj混淆

jj混淆与aa混淆是差不多的,主要也是利用了unicode特性,将代码转换成有着大量符号的混淆文本。将3.1中的代码进行jj混淆后如下:

sojson=~[];/*sojson.com*/sojson={___:++sojson,/*sojson.com*/$$$$:(![]+"")[sojson],__$:++sojson,$_$_:(![]+"")[sojson],_$_:++sojson,$_$$:({}+"")[sojson],$$_$:(sojson[sojson]+"")[sojson],_$$:++sojson,$$$_:(!""+"")[sojson],$__:++sojson,$_$:++sojson,$$__:({}+"")[sojson],$$_:++sojson,$$$:++sojson,$___:++sojson,$__$:++sojson};sojson.$_=(sojson.$_=sojson+"")[sojson.$_$]+(sojson._$=sojson.$_[sojson.__$])+(sojson.$$/*sojson.com*/=(sojson.$+"")[sojson.__$])+((!sojson)+"")[sojson._$$]+(sojson.__=sojson.$_[sojson.$$_])+(sojson.$=(!""+"")[sojson.__$])+(sojson._=(!""+"")[sojson._$_])+sojson.$_[sojson.$_$]+sojson.__+sojson._$+sojson.$;/*sojson.com*/sojson.$$=sojson.$+(!""+"")[sojson._$$]+sojson.__+sojson._+sojson.$+sojson.$$/*sojson.com*/;sojson.$=(sojson.___)[sojson.$_][sojson.$_];sojson.$(sojson.$(sojson.$$+"\""+"\\"+sojson.__$+sojson.$_$+sojson._$_+"\\"+sojson.__$+sojson.$$_+sojson._$$+sojson.$$__+sojson._$+sojson.$$_$+sojson.$$$_+" \\"+sojson.$$$+sojson.$_$+" \\\"\\"+sojson.__$+sojson.__$+sojson._$$+"\\"+sojson.__$+sojson.___+sojson.$$$+"\\"+sojson.__$+sojson._$$+sojson._$_+sojson.__$+sojson.$_$$+"\\"+sojson.__$+sojson.$_$+sojson.$_$+"\\"+sojson.__$+sojson.__$+sojson.$$_+sojson.___+sojson.$_$_+"\\"+sojson.__$+sojson._$_+sojson.$$$+sojson.$__$+sojson._+"\\"+sojson.__$+sojson.__$+sojson._$$+"\\"+sojson.__$+sojson.___+sojson._$$+(![]+"")[sojson._$_]+sojson.$$$+sojson.$$__+"\\"+sojson.__$+sojson.$_$+sojson.$_$+"\\"+sojson.__$+sojson._$_+sojson.$$_+sojson.___+sojson.$$_$+"\\"+sojson.__$+sojson._$$+sojson.___+"\\"+sojson.__$+sojson.__$+sojson._$_+sojson._+"\\"+sojson.__$+sojson.__$+sojson.__$+"\\"+sojson.__$+sojson.___+sojson.$__+"\\"+sojson.__$+sojson.__$+sojson.$$_+sojson.$__$+"\\"+sojson.__$+sojson.__$+sojson._$$+"\\"+sojson.__$+sojson._$_+sojson._$$+"\\"+sojson.__$+sojson.$__+sojson.$$$+"\\"+sojson.__$+sojson.$$_+sojson.___+"\\\"\\"+sojson.__$+sojson._$_+"\\"+sojson.__$+sojson.$$_+sojson._$_+sojson.$$$_+"\\"+sojson.__$+sojson.$$_+sojson._$$+sojson._+(![]+"")[sojson._$_]+sojson.__+" \\"+sojson.$$$+sojson.$_$+" "+sojson.$$$_+"\\"+sojson.__$+sojson.$$_+sojson.$$_+sojson.$_$_+(![]+"")[sojson._$_]+"("+sojson.$_$_+sojson.__+sojson._$+sojson.$_$$+"(\\"+sojson.__$+sojson.$_$+sojson._$_+"\\"+sojson.__$+sojson.$$_+sojson._$$+sojson.$$__+sojson._$+sojson.$$_$+sojson.$$$_+"))\\"+sojson.__$+sojson._$_+sojson.$$__+sojson._$+"\\"+sojson.__$+sojson.$_$+sojson.$$_+"\\"+sojson.__$+sojson.$$_+sojson._$$+sojson._$+(![]+"")[sojson._$_]+sojson.$$$_+"."+(![]+"")[sojson._$_]+sojson._$+"\\"+sojson.__$+sojson.$__+sojson.$$$+"(\\"+sojson.__$+sojson.$$_+sojson._$_+sojson.$$$_+"\\"+sojson.__$+sojson.$$_+sojson._$$+sojson._+(![]+"")[sojson._$_]+sojson.__+")"+"\"")())(sojson={___:++sojson,$$$$:(![]+"")[sojson]});

可以看到,混淆后的代码有很多的$符号,可读性几乎是没有的,所以这种代码是必须去还原之后才能够进行逆向,一般可以通过一些解码工具进行解码,当然也可以将其复制到控制台中运行。如果整体执行失败的话可以按照;进行分割然后逐行进行分析调试。

除了上述混淆之外,代码混淆的方式还有许许多多,如jsfuck混淆OB混淆OLLVM混淆等等。如我们在马蜂窝案例中所见就是一个典型的OB混淆代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/124476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件下载漏洞, 漏洞原理, 测试方法, 漏洞防御, 常见敏感路径

文件下载漏洞 一, 文件下载漏洞原理 利用条件: 1. 读取文件的路径是用户可控, 且没有校验或检验不严. 2. 使用了读取文件的函数. 3. 输出了文件内容.漏洞场景一: 后端没有限制哪些路径的文件可以下载 后端代码: http://192.168.112.200/security/download.php $file_pat…

keealived安装配置启动

1.keepalived作用和原理图 keepalived作用:解决单点故障简单原理图1: 2.keepalived安装配置启动 地址: https://www.keepalived.org/download.html# 1)解压 tar -zxvf keepalived-2.0.18.tar.gz # 2)进入keepalived目录 cd keepalived-2.0.18/ # 3)安装libnl/libnl-3依赖…

chat gpt 在开发当中的应用

chatgpt 出来已经有一段时间了,本人在开发的过程中也是有去使用。 经常使用的是讯飞大模型和通义千问,在使用的过程中,个人感觉讯飞大模型在写代码方面会比较智能。 比如问一个 sqlser 单表 数据量 几个亿如何处理的问题,讯飞会给…

C/C++ 飞翔的小鸟

载入问题: 解决之后效果: 放在main函数里面进行封装: 效果展示: 实现下坠 放进while(1)里面不断进入循环,每次进入循环,鸟的y坐标值就会发生变化,以此实现下下坠效果 效果展示&#…

Vue 数据绑定 和 数据渲染

目录 一、Vue快速入门 1.简介 : 2.MVVM : 3.准备工作 : 二、数据绑定 1.实例 : 2.验证 : 三、数据渲染 1.单向渲染 : 2.双向渲染 : 一、Vue快速入门 1.简介 : (1) Vue[/vju/],是Vue.js的简称,是一个前端框架,常用于构建前端用户…

Hive客户端和Beeline命令行的基本使用

本专栏案例数据集链接: https://download.csdn.net/download/shangjg03/88478038 1.Hive CLI 1.1 命令帮助Help 使用 `hive -H` 或者 `hive --help` 命令可以查看所有命令的帮助,显示如下: usage: hive-d,--define <key=value> Variable subsitution to ap…

C#学习相关系列之多线程---TaskCompletionSource用法(八)

一、TaskCompletionSource类的作用 TaskCompletionSource类回调代码转换为可以等待的Task&#xff0c;TaskCompletionSource本身不是可等待的&#xff0c;它也不是有效的异步方法返回类型。一旦TaskCompletionSource给了你一个任务&#xff0c;你可以简单地返回那个任务&#x…

2023NOIP A层联测20-点餐

一家新的餐馆开业了&#xff0c;为了吸引更多的顾客&#xff0c;每样餐品都有打折的活动。特别的&#xff0c;餐馆内一共有&#x1d45b;样菜品&#xff0c;编号从 1 1 1 到 n n n&#xff0c;每样菜品每人最多只能点一次。对于第 i i i 种菜品&#xff0c;其包含两种价格&a…

Flutter FittedBox

&#x1f525; 英文单词FittedBox &#x1f525; Fitted 通过有道翻译如下 &#xff1a; Box 通过有道翻译如下 &#xff1a; 对 FittedBox 的理解 我们可以将 FittedBox 理解为合适的盒子&#xff0c;将其它布局放到FittedBox这样一个盒子中&#xff0c;从而实现 盒子里面的…

kubernetes实验挑战二(troubleshoot pv pvc )

This 2-Node Kubernetes cluster is broken! Troubleshoot, fix the cluster issues and then deploy the objects according to the given architecture diagram to unlock our Image Gallery!! 1、 kubeconfig /root/.kube/config, User ‘kubernetes-admin’ Cluster: S…

SpringCloud(一) 服务架构的演变及注册RestTemplate实现服务的远程调用

目录 一, 服务架构的演变 1.1 单体架构 1.2 分布式架构 1.3 微服务 1.4 SpringCloud 二, 服务拆分和远程调用 2,1 服务拆分原则 2.2 服务拆分示例 2.3 创建相应数据库 2.4 实现远程调用示例 1, 更改需求 2, 注册RestTemplate实现远程调用 2.5 服务消费者和提供者 一…

D-Bus:数据类型

D-Bus中描述接口的属性和方法,有其自己定义的一套签名描述方式: 数据类型描述符号对应C++数据类型avector/array数组, ai表示的是vector<int32_t>bboolddouble双精度浮点数iint32_t,32位有符号整数nint16_t,16位有符号整数oobject_path对象路径quint16_t,16位无符号…

【数据分析】上市公司半年报数据分析

前言 前文介绍过使用网络技术获取上市公司半年报数据的方法&#xff0c;本文将对获取到的数据进行简要的数据分析。 获取数据的代码介绍在下面的两篇文章中 【java爬虫】使用selenium获取某交易所公司半年报数据-CSDN博客 【java爬虫】公司半年报数据展示-CSDN博客 全量数…

Flutter笔记:完全基于Flutter绘图技术绘制一个精美的Dash图标(中)

Flutter笔记 完全基于Flutter绘图技术绘制一个精美的Dart语言吉祥物Dash&#xff08;中&#xff09; 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://…

微服务框架Consul--新手入门

Consul Consul 是由 HashiCorp 开发的一款软件工具&#xff0c;提供了一组功能&#xff0c;用于服务发现、配置管理和网络基础设施自动化。它旨在帮助组织管理现代分布式和微服务架构系统的复杂性。以下是Consul的一些关键方面和功能&#xff1a; 服务发现&#xff1a;Consul …

【Qt之QString】去除“字符“或替换“字符“小技巧

去除字符 在Qt中&#xff0c;可以使用以下函数来去除字符串中的字符。 QString &remove(int i, int len)&#xff1a;删除字符串中从索引位置i开始长度为len的字符。QString &remove(QChar c, Qt::CaseSensitivity cs Qt::CaseSensitive)&#xff1a;删除字符串中所…

SQL Wildcards 通配符

SQL Wildcards 通配符 通配符用于替换字符串中的任何其他字符。 通配符与 SQL LIKE 运算符一起使用。在 WHERE 子句中使用LIKE运算符来搜索列中的指定模式。 有两个通配符与 LIKE 运算符一起使用&#xff1a; &#xff05; - 百分号表示零个&#xff0c;一个或多个字符_ - 下…

【Linux】centOS7安装配置及Linux的常用命令---超详细

一&#xff0c;centOS 1.1 centOS的概念 CentOS&#xff08;Community Enterprise Operating System&#xff09;是一个由社区支持的企业级操作系统&#xff0c;它是以Red Hat Enterprise Linux&#xff08;RHEL&#xff09;源代码为基础构建的。CentOS提供了一个稳定、可靠且…

软件测试面试高频30道面试题

如果哪个测试经理在看我的文章&#xff0c;希望对面试者要微笑&#xff0c;不然面试结束&#xff0c;出门之后就一万个草泥马奔腾而过&#xff0c;其实面试者并不是希望你给他们什么&#xff0c;而是一种尊重&#xff0c;平等的谈话&#xff0c;不要高高在上感觉自己超牛逼一样…

js数组深拷贝汇总

1.for 循环实现数组的深拷贝 通过对数组的for循环&#xff0c;即可实现对数组的深拷贝了。 var arr [1,2,3,4,5] var arr2 copyArr(arr) function copyArr(arr) {let res []for (let i 0; i < arr.length; i) {res.push(arr[i])}return res }2.slice 方法实现数组的深…