大佬们来试试我的前端加密强度

2023-08-23 19:31:31 +08:00
 tmtstudio

看到大家在讨论前端的加密问题,就把我现在用的加密方案做了个 demo ,大佬们看看能破掉吗,要是能给点建议就更好了。

http://34.16.118.34,怕被大手子 gank 没用 cdn 第一次打开有点慢

12778 次点击
所在节点    程序员
94 条回复
NoobNoob030
2023-08-25 09:20:00 +08:00
@Al0rid4l 感谢大佬指点,拿到 flag 了
NoobNoob030
2023-08-25 09:22:56 +08:00
[img][/img]
ebony0319
2023-08-25 09:31:13 +08:00
尝试了一下,不会,期望大哥们给我一个标准答案
dtboy
2023-08-25 09:59:56 +08:00
@DreamNya 很赞很牛

昨天通过也是通过此老哥的第一个回复的思路.
后面修改对象(不管是用什么 hook 方法,还是覆盖执行(比如 chrome override)) 都可以

这里回复下 DreamNya 的 window.setInterval = () => 1; 操作是因为屏蔽库内是靠 setInterval 去检测逻辑的,代码源在
https://github.com/theajack/disable-devtool/blob/master/src/utils/interval.ts#L26
dtboy
2023-08-25 10:03:32 +08:00
给 nodejs 栈同好的爆破建议是用 electron 的 preload 思路,搭配 source override(毕竟可以实时覆盖修改代码)
dtboy
2023-08-25 10:15:31 +08:00
op 的第一个 handShake 请求没看懂.(细心老哥可以继续追)
后来 DreamNya 发现的 getParams 里面的逻辑应该是
1.生成一组用于 aes 加密的 key 和 iv
2.用 RSA 加密这个 iv 和 key ,也就是{C: '', P: ''} 加密后得到的就是请求参数中的 code
3.请求中的 param 就是用 key 和 iv 加密的 JSON.stringify({ h5Version: '',private: '', public: 'unix 时间戳' })
总结就是,用 RSA 公钥加密了 AES 加密需要的 key 和 iv ,然后又用 key 和 ivAES 加密了真正传到服务器的内容.
服务端应该是用私钥解开 code 中的 iv 和 key ,之后再用 iv 和 key 解密请求正文.

- 靠纯技术是解决不了安全性问题的,二进制是死的,人是活的,只要是死的东西就会有问题。最终解决安全性得靠法律吧。。而不是技术,毕竟踩缝纫机要可怕的多。
zeroFans
2023-08-25 10:52:48 +08:00
@DreamNya #77 window.setInterval = () => 1;设置之后是可以关闭 disable-devtool 库吗,我试了下还是不能打开 F12
hsuehly
2023-08-25 12:02:38 +08:00
试试我这个 /t/968212
DreamNya
2023-08-25 12:12:22 +08:00
@zeroFans
这个代码只关闭检测。
网页屏蔽只能屏蔽按键,但无论如何都无法屏蔽控制台开启,因为这是浏览器权限。
可以通过浏览器右上角菜单强制开启控制台

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

另外前端加密混淆虽然无法做到 100%安全,总是能被绕过,但是我们可以加大绕过的难度,
换一个角度思考,只要减少被绕过的数量也算一种胜利。
比如:
油猴分发很容易,只要写成脚本形式发到脚本站,其他用户点一下安装一个脚本就能做到傻瓜式全自动绕过。
而 overrides 虽然是绝对无法避免的硬伤,但是操作难度大,光是开启 overrides 、定位代码、修改代码、保存代码就能筛选掉 90%的普通用户(可能还说少了,毫不避讳的说大多数普通用户都是傻子,文字都看不懂更别说操作了)。
根据上述情况就可以针对油猴,做一些针对性防御操作,比如核心函数完全不用对象方法让油猴无处 hook ,从而减少能破解的用户数量,来提高安全性。
当然这种针对性防御首先考验的是开发者代码水平,所有防御都是双刃剑。
dtboy
2023-08-25 12:48:19 +08:00
@DreamNya 感谢回复和讲解
请问针对
```
根据上述情况就可以针对油猴,做一些针对性防御操作,比如核心函数完全不用对象方法让油猴无处 hook ,从而减少能破解的用户数量,来提高安全性。
当然这种针对性防御首先考验的是开发者代码水平,所有防御都是双刃剑。
```
这一段可以给一些例子,或者伪代码吗,学习一下。要是没有你的那段 getParams ,我想大多人
dtboy
2023-08-25 12:51:36 +08:00
手抖了,ctrl+enter 发布了直接...
请问 getParam 是如何定位到这里的,像我昨天去 crack 的时候,只是想到了跳过屏蔽,但是还是看了你的回复后才有思路。也就是 getParam 这个函数的操作。

另外,你懒得处理的 hook 我是这么写的(但是也有例外吧,不过针对此项目,起码不会破坏其他定时器)
let sI = window.setInterval

function holder() { }

window.setInterval = function (...args) {
let fn = args[0]
let ms = args[1]
if (fn.toString().includes('ondevtoolclose')) {
return sI.call(this, holder, ms)
} else {
return sI.apply(this, args)
}
}
DreamNya
2023-08-25 13:14:17 +08:00
@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)
}
}
DreamNya
2023-08-25 13:49:35 +08:00
@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
dtboy
2023-08-25 14:05:07 +08:00
@DreamNya 感谢,学习了,最后对 webpack 的解释是附加题,哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967742

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX