JavaScript奇技淫巧:加密JS代码反调试
JavaScript奇技淫巧:加密JS代码反调试
JS代码混淆加密,已被很多人使用,因为它真的很有用、很实用,可以用于保护代码、防护分析、复制、盗用,还可以用于小游戏过审、APP加固等方面。
混淆加密后的JS代码,可能被他人分析,为了对抗分析调试,本文分享一种反调试技术。
功能效果
使函数名不可修改,修改则代码无法运行
技术原理
将JS代码用可逆算法进行加密。公开或发布的代码时,只提供这部分“密文”。
运行代码中包含解密函数,但密钥是隐式传递,难被发现。而且还可对解密函数再加密,使分析难上加难。
实例演示
示例代码:
先用JShaman进行简单的混淆,仅启用函数名加密,为的是得到随机的函数名,得到代码如下:
函数名从原始的get_copyright变成了_0xag。
在分析调试时,分析者经常会将无意义的函数名改成有含义的名字,使便于理解。
本文我们要做的,就是禁止改名,如果修改函数名,函数就无法执行。
继续操作,处理以下几行,即函数中包含的代码:
采用xor算法,将其变成加密字符:
注意,加密时传入的参数是“_0xag”,即代码所在的函数名,此值在解密时是不会显式出现的。
之前的代码,改造为以下形式:
运行:
输出结果与修改代码前相同。
这段代码的含意是:解密、并用eval执行。这就达到了跟原始代码一样的功能效果。
精妙之处在于:解密时,并未传入加密时的参数:“_0xag”!
而如果对函数进行改名,比如改为abc,执行将会出错:
这是由于:解密时隐式的使用了arguments.callee.name,即调用者函数名。
当函数名是_0xag时,与加密时传入的密钥参数一至,那么可以解出正确的代码字符,也就可以被eval执行,而函数名改为abc时,相当于传入的字符就变成了abc,自然无法解密出正确的原始代码,也就无法用eval执行。
完整代码
function random_key(key, i) {
return key.charCodeAt( Math.floor(i % key.length) );
}
function enxor(data, key) {
return data.split("").map(function(c,i,a){
return data.charCodeAt(i)^random_key(key,i);
}).join(",");
}
function dexor(data, key) {
return data.split(",").map(function(c,i,a){
return String.fromCharCode(c^random_key(key,i));
}).join("");
}
var js_code=`
var _0xbc99c = " http://jshaman.com";
var from_year = 523898 ^ 522651;
var _0x7d68de = "(c)" + from_year + "-" + new Date().getFullYear() + "," + _0xbc99c;
console.log(_0x7d68de);
`
function _0xag(){
var decode_js_code = dexor("85,70,25,19,71,0,0,0,3,4,102,9,27,65,90,127,18,18,18,15,62,93,25,15,73,60,95,21,67,92,85,70,25,19,71,57,66,23,12,56,38,85,25,19,71,98,16,77,83,84,103,9,64,65,57,127,5,74,83,81,106,1,67,107,17,62,66,88,62,87,39,7,28,87,95,59,85,88,92,71,125,24,27,72,69,127,27,88,7,21,48,93,39,24,2,62,66,88,74,71,125,29,90,65,76,127,94,29,22,71,27,81,12,4,79,118,30,31,4,19,25,69,20,13,62,58,81,10,73,78,127,27,88,67,75,125,16,83,65,56,111,72,26,2,94,102,83,67,107,4,48,94,11,14,11,58,30,20,14,0,119,111,72,25,80,59,6,64,5,2,118,11,114",arguments.callee.name);
eval(decode_js_code);
}
console.log(_0xag());
JavaScript奇技淫巧:加密JS代码反调试相关推荐
- JavaScript奇淫技巧:反调试
JavaScript奇淫技巧:反调试 本文,将分享几种JS代码反调试技巧,目标是:实现防止他人调试.动态分析自己的代码. 检测调试,方法一:用console.log检测 代码: var c = new ...
- 国内两个JS加密平台,加密JS代码效果对比
国内两个JS加密平台,加密JS代码效果对比 如题,对比国内两家JS加密平台,加密JS的效果 一.JShaman,JS加密平台 测试用JS代码: function get_copyright(){ va ...
- Node.JS中调用JShaman,加密JS代码
在Node.JS环境中,调用JShaman的WebAPI接口,对JS代码进行混淆加密. 效果如下: 代码: //js代码 var js_code = `function NewObject(prefi ...
- 格式化JS代码,调试JS代码
1,格式化混淆后的代码 2,调试JS代码 在chrome 浏览器的地址栏中输入:chrome://inspect/#devices
- JavaScript 技术篇-使用js代码获取浏览器窗口标题名,js获取页面URL地址
用 Google 页面来举例子,Google 是它的窗口标题名,https://www.google.com是它的页面 url 地址. document.title 可以用来获取窗口标题名. loca ...
- js经验分享 JavaScript反调试技巧
在此之前,我一直都在研究JavaScript相关的反调试技巧.但是当我在网上搜索相关资料时,我发现网上并没有多少关于这方面的文章,而且就算有也是非常不完整的那种.所以在这篇文章中,我打算跟大家总结一下 ...
- 在线JS代码调试网站简介 JSFiddle JSBin JSRUN
1.JSFiddle 官网:https://jsfiddle.net 简介:在线JS代码调试工具是一个老牌的支持javascript.css.html代码可视化在线调试工具,支持多种应用多种主流框架, ...
- JavaScript 反调试技巧
(点击上方公众号,可快速关注) 英文: x-c3ll 译文:FreeBuf.COM www.freebuf.com/articles/system/163579.html 写在前面的话 在此之前, ...
- JavaScript反调试技巧
一.函数重定义 这是一种最基本也是最常用的代码反调试技术了.在JavaScript中,我们可以对用于收集信息的函数进行重定义.比如说,console.log()函数可以用来收集函数和变量等信息,并将其 ...
最新文章
- Elastic Search 上市了,Slack上市了,我也要写个软件,走上人生巅峰
- C# 简单的XML读取修改写入
- HDU 1875 畅通工程再续
- Scala中的嵌套循环
- ue4如何恢复初始状态_如何解决三菱伺服电机上常见报警代码
- iOS开发UI调试神器----Reveal
- 计算机信息管理是学什么课程设计,毕业论文计算机专业学生信息管理系统(数据库课程设计)...
- HyperLogLog设计和实战
- Unity基础-图形渲染
- 鸡兔同笼的两种求解(C语言)
- 2020年1024程序员节,成为CSDN博客专家
- vue动态修改网页标题(也可用于vx里的网页标题)
- Windows7保护眼睛颜色设置方法
- c语言生成exe文件,打开exe文件闪退怎么办
- Android9.0源代码中替换默认静态壁纸
- keras实现注意力机制
- 【计算机基础04】Excel知识
- [PPT]用PPT来做2019苹果发布会演示文稿【附源文件下载】
- Verilog HDL错误总结
- 跟踪`极点`五笔变半行.顺便学习Process Monitor的使用
热门文章
- 青岛职业技术学院计算机专业录取分数线,2017年青岛市中职技校录取分数线公布...
- 想要精通算法和SQL的成长之路 - 两两交换链表中的节点
- 【力扣算法简单五十题】35.反转链表
- Delphi 10.3 Web应用开发B/S框架介绍(一):uniGUI
- 边学边记(七) lucene索引结构详解四(_N.fdx,_N.fdt)
- 【Hexo博客搭建】将其部署到GitHub Pages(二):如何初始化并部署?
- (八)unity shader基础之——————渲染平台差异问题
- 程序设计基石与实践之C语言指针和数组基础
- OpenWrt 软路由 IPV6 配置 DDNS
- 1 uboot学习前传