DreamNya 最近的时间轴更新
DreamNya

DreamNya

V2EX 第 557183 号会员,加入于 2021-09-28 20:51:58 +08:00
DreamNya 最近回复了
250 天前
回复了 tmtstudio 创建的主题 程序员 大佬们来试试我的前端加密强度
@dtboy
JS 最大特点就是对象和方法的引用可以被改写即使是 JS 原生对象,这就给 hook 带来极大便利了。
针对 hook ,基本上就是不用 JS 原生对象方法,改用一些操作符之类的。

比如
a=Object.assign({b:1},{c:2})可以改写成 a={...b,...c}
a=new Array()可以改写成 a=[]
因为 Object.assign 和 Array 都是全局对象方法能直接访问到并改写,而{}、[]和...都是无法改写的

fuc.call(null,arg)也可以改写成 fuc(arg)



这类几乎无法 hook ,只能通过 override 或者断点的形式去针对了,webpack5 编译出来的源码就用的这种方法然后无处 hook ,而 webpack4 随便 hook
@hsuehliuyang 把你调用加密函数的函数 hook 掉置空,然后等我来调用,伪装成网页正常的调用…… 类似于破解禁止重放攻击
250 天前
回复了 tmtstudio 创建的主题 程序员 大佬们来试试我的前端加密强度
@dtboy getParam 是逆向发请求的堆栈一步步找到的,没啥诀窍……就是硬破……
Devtools 网络选项卡里面能看到所有请求还有堆栈,在里面打个断点就能调试

所有请求的参数不可能是凭空出现的,一定有一个源头,无论是静态定义还是通过函数动态计算又或者是通过请求响应返回,总有一个出处,通过堆栈一步步找到源头出处就行了,然后针对这个出处进行一些 hook


setInterval 没啥作用域这些花样,this 一般都指向 window ,可以不用 call 或者 apply ,我习惯写的简单一点
const realInterval=window.setInterval;
window.setInterval=(...args)=>{
if(args[0].toString().includes('ondevtoolclose')){
return 99999999 //尽量大 防止被 clearInterval 误伤;或者不写,这种检测定时器一般不会停止
}else{
return realInterval(...args)
}
}
a='test'
b=window.encrypt(a)
c=window.decrypt(b)
a==c

前端破解加密方式和 key 其实没啥用,我直接调用你的接口达成目的就行了,不需要知道你具体是怎么保证正常运行的。
可能一些后端程序缺少环境才需要破你的加密方式(比如自动签到、自动爬虫)。
250 天前
回复了 tmtstudio 创建的主题 程序员 大佬们来试试我的前端加密强度
@zeroFans
这个代码只关闭检测。
网页屏蔽只能屏蔽按键,但无论如何都无法屏蔽控制台开启,因为这是浏览器权限。
可以通过浏览器右上角菜单强制开启控制台

@dtboy
因为检测控制台都是通过定时器循环去检测的,定时器循环一共就那么几种方式,所以从源头直接把定时器掐断了,就完全不用管具体检测的逻辑了。
如果不通过定时器那检测更容易被绕过了,这是没法克服的硬伤。
偷鸡是因为摆烂了没有判断检测函数特征,一股脑全掐断了,真正网页上线的时候这种方式可能会把其他定时器也误伤。

另外前端加密混淆虽然无法做到 100%安全,总是能被绕过,但是我们可以加大绕过的难度,
换一个角度思考,只要减少被绕过的数量也算一种胜利。
比如:
油猴分发很容易,只要写成脚本形式发到脚本站,其他用户点一下安装一个脚本就能做到傻瓜式全自动绕过。
而 overrides 虽然是绝对无法避免的硬伤,但是操作难度大,光是开启 overrides 、定位代码、修改代码、保存代码就能筛选掉 90%的普通用户(可能还说少了,毫不避讳的说大多数普通用户都是傻子,文字都看不懂更别说操作了)。
根据上述情况就可以针对油猴,做一些针对性防御操作,比如核心函数完全不用对象方法让油猴无处 hook ,从而减少能破解的用户数量,来提高安全性。
当然这种针对性防御首先考验的是开发者代码水平,所有防御都是双刃剑。
250 天前
回复了 tmtstudio 创建的主题 程序员 大佬们来试试我的前端加密强度
还是油猴脚本 还是全自动牛逼
换一个地方 hook ,比之前代码还要简洁……

```

// ==UserScript==
// @name 全自动牛逼
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.2.0
// @description try to take over the world!
// @author DreamNya
// @match http://34.16.118.34/*
// @grant none
// @run-at document-start
// ==/UserScript==

window.setInterval = () => 1; //偷鸡?
const realAssign = window.Object.assign;
window.Object.assign = function (...args) {
if (args[0].h5Version) {
args[0].text = 'v2ex'
}
return realAssign.call(this, ...args)
};

```

对策就是不要用任何对象方法。
前端就是这样,你防住了一下,不一定能防住下一个,总有地方有机可趁,而且有些漏洞是难以修复的,除非重构整个函数,伤人先伤己。
前端代码都在本地运行,只能通过加密混淆增加难度,从防 50%的人提升到防 90 、95 、99%的人,做不到 100%安全。
增加难度的同时也在考验自己的代码水平,相当于七伤拳了
有没有必要加密混淆填补漏洞,主要看成本与收益
251 天前
回复了 tmtstudio 创建的主题 程序员 大佬们来试试我的前端加密强度
@DreamNya 漏写了一行 // @grant none
251 天前
回复了 tmtstudio 创建的主题 程序员 大佬们来试试我的前端加密强度
写了个油猴脚本 全自动牛逼 [


// ==UserScript==
// @name New Userscript
// @namespace https://bbs.tampermonkey.net.cn/
// @version 0.1.0
// @description try to take over the world!
// @author DreamNya
// @match http://34.16.118.34/*
// @run-at document-start
// ==/UserScript==

window.setInterval = () => 1; //偷鸡?
//window.Math.max=()=>10000000000000;
localStorage.setItem = new Proxy(localStorage.setItem, {
apply: function (target, thisArg, argumentsList) {
console.log(argumentsList)
//debugger
return Reflect.apply(target, thisArg, argumentsList)
},
});
const realSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function (...args) {
const realGet = document.querySelector("body > uni-app").__vue__.$children[0].$children[0].$children[0].$children[1].$children[0].getParams;
document.querySelector("body > uni-app").__vue__.$children[0].$children[0].$children[0].$children[1].$children[0].getParams = function (...args_) {
args_[0].text = 'v2ex'
return realGet.call(this, ...args_)
}
XMLHttpRequest.prototype.send = realSend
return realSend.call(this, ...args)
}
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2258 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 07:53 · PVG 15:53 · LAX 00:53 · JFK 03:53
Developed with CodeLauncher
♥ Do have faith in what you're doing.