首页 > 编程语言 >JavaScript加密代码反调试

JavaScript加密代码反调试

时间:2023-02-24 11:07:57浏览次数:33  
标签:25 加密 函数 0xag 代码 JavaScript key 调试

JavaScript奇技淫巧:加密JS代码反调试

JS代码混淆加密,已被很多人使用,因为它真的很有用、很实用,可以用于保护代码、防护分析、复制、盗用,还可以用于小游戏过审、APP加固等方面。

混淆加密后的JS代码,可能被他人分析,为了对抗分析调试,本文分享一种反调试技术。

功能效果

使函数名不可修改,修改则代码无法运行

技术原理

将JS代码用可逆算法进行加密。公开或发布的代码时,只提供这部分“密文”。

运行代码中包含解密函数,但密钥是隐式传递,难被发现。而且还可对解密函数再加密,使分析难上加难。

实例演示

示例代码:

JavaScript加密代码反调试_js加密

先用JShaman进行简单的混淆,仅启用函数名加密,为的是得到随机的函数名,得到代码如下:

JavaScript加密代码反调试_小游戏_02

函数名从原始的get_copyright变成了_0xag。

在分析调试时,分析者经常会将无意义的函数名改成有含义的名字,使便于理解。

本文我们要做的,就是禁止改名,如果修改函数名,函数就无法执行。

继续操作,处理以下几行,即函数中包含的代码:

JavaScript加密代码反调试_反调试_03

采用xor算法,将其变成加密字符:

JavaScript加密代码反调试_小游戏_04

注意,加密时传入的参数是“_0xag”,即代码所在的函数名,此值在解密时是不会显式出现的。

之前的代码,改造为以下形式:

JavaScript加密代码反调试_小游戏_05

运行:

JavaScript加密代码反调试_js加密_06

输出结果与修改代码前相同。

这段代码的含意是:解密、并用eval执行。这就达到了跟原始代码一样的功能效果。

精妙之处在于:解密时,并未传入加密时的参数:“_0xag”!

而如果对函数进行改名,比如改为abc,执行将会出错:

JavaScript加密代码反调试_小游戏_07

这是由于:解密时隐式的使用了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 = "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());


标签:25,加密,函数,0xag,代码,JavaScript,key,调试
From: https://blog.51cto.com/jsjiami/6077383

相关文章

  • 【Javascript】el-upload 上传图片转 base64 (使用 FileReader)
    e.target.result结果......
  • JAVA 【SM2】加密解密
    JAVA【SM2】加密解密前言:最近项目中必须用到SM2的加密解密引入的Maven依赖<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId>......
  • 【调试】netconsole的使用
    开发环境客户端开发板:FireFly-RK3399Linux4.4IP:192.168.137.110服务端VMwareWorkstationPro16,ubuntu18.04IP:192.168.137.100MAC:00:0c:29:c1:9c:ednetconso......
  • JavaScript 如何验证 URL
    前言当开发者需要为不同目的以不同形式处理URL时,比如说浏览器历史导航,锚点目标,查询参数等等,我们经常会借助于JavaScript。然而,它的频繁使用促使攻击者利用其漏洞。这种被......
  • JavaScript 中 Object,Map,Set 及数组遍历方法
    Object(对象)forin遍历出对象可枚举的"属性",包含继承的可枚举属性varperson={name:'小明',birth:1990,height:1.70};for(varxinperson){consol......
  • JavaScript 一元运算符
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> /* *一元运算符,只需要一个操作数 * +......
  • JavaScript 自增和自减
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> /* *自增++ * -通过自增可以使变......
  • JavaScript Null和Undefined
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> /* *Null(空值)类型的值只有一个,就是null ......
  • JavaScript 强制类型转换
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> /* *强制类型转换 * -指将一个数据......
  • JavaScript 转换为Number
    <!DOCTYPEhtml><html> <head> <metacharset="UTF-8"> <title></title> <scripttype="text/javascript"> /* *将其他的数据类型转换为Number * ......