影刀应用分享后如何保护代码安全-应用加密
前言
程序写出来就是被使用的,我们作为影刀开发者,最希望的就是两点:
1. 程序稳定运行
2. 别人获取不到自己的代码
第一点需要提升自己的开发技巧,没什么捷径.
关于第二点,可以让影刀官方支持应用加密/应用授权,也可以自己为应用添加额外的授权/验证机制,咱们今天只讨论下怎么自己添加防破解机制.
有矛就有盾,数据安全不是100%的,仅做参考!!!,我们能做的只是增加代码泄露的破解工作量
添加授权
参考: 影刀RPA流程授权使用思路
原作者只贴了一张截图:
可以猜到大概的思路是调用机器码注册验证指令去验证是否授权,验证失败后就退出流程
自己模拟了一下,大概的指令长这样:
这样的好处是操作简单,只需要获取运行电脑的uuid然后向自己的后台服务发送网络请求,校验有效期即可(后台请求在后面说).
缺点就是容易被破解/替换.
别人通过你的分享链接或应用市场运行的还好,看不到源码.
可如果是源码交付的话,这种加密就没任何用处了.客户只需要删除一行,把使用的验证指令注释,就能跳过验证
发送心跳包
心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令,按照一定的时间间隔发送,用来判断对方是否正常运行。类似于心跳,所以叫做心跳包。
这种方式可以写一个指令,并行于主流程运行,大概思路和第一种方式类似.缺点也是容易被查到代码后删除.而且需要一点的编程基础
应用嵌套指令(推荐)
最简单的办法了
把自己的应用做成指令,然后主应用去调用这个指令就ok了.哪怕源码交付的话,对方也只能看到指令,无法继续深入查看.
这个的额外好处就是不受30行分享的限制
配置和代码分离(推荐)
观察前面两种加密方式,他们都有一个共同点:
加密部分易被找到
删除和跳过容易
加密模块采用指令或模块的方式使用,被找到后直接删除后也不影响后续的代码运行
所以我们就可以按照这两条方式来逆向思维:
应用中的配置文件/变量分布在多个地方,有时候自己改代码都找不到变量放哪了,更不用说让别人去找了.
我们可以把配置文件和添加授权的方式结合起来,通过网络去请求配置文件.
例子
这是一个朋友开发的小红书相关的应用,包括养号/评论/发布等功能.他使用的方式是自定义指令加网络获取配置
原作者:抖音自动养号程序 这个例子就是他开发的,佬中佬.
以小红书养号应用作为讲解:
应用一览:
详细步骤:
- 先去作者网站添加应用,配置相关参数后会生成appCode
- 运行影刀应用,输入appCode
- 影刀应用获取appCode并校验
这样操作后,别人拿到你的代码,第一步就被内嵌指令困住了
哪怕他获取了指令,你的应用参数都是通过网络请求获取的,别人对请求返回的数据是不了解的,删除或更改请求都会导致应用出错.
再用这个例子来说,选择配置和代码分离是因为影刀的自定义对话框满足不了需求,稍微截几张图就明白这个应用的配置有多强大了:
别人想在不知道返回内容的情况下搞明白运行方式是很难的.
好处
使用网络配置还有个好处就是方便用户管理和记录日志.同时有需求的话还能变成动态参数来运行.
想想一下,你在做小红书养号,突然要把收藏条件变成评论大于100的,有了网络配置后只需要设置条件,不用重启影刀应用就能生效.(现在还不支持)
还有就是日志手机和处理.有多个应用和手机同时运行,通过网页就能看到所有的操作日志,真的是太方便了
代码隐藏
隐藏应用的可视化代码,防止别复制时查看到源码
代码混淆
打乱可视化流程的逻辑,对方看到的≠实际运行的. 达到混淆的目的 同上,只能运行,不能编辑
整点花活
通过网络还可以实现代码的动态调用,类似云函数.
比如一个百度搜索的应用,关键词通过今日热榜来获取
如果我们以前做过今日热榜的数据爬取入库,就可以通过云函数来直接读数据库并返回数据
如果在影刀内直接调用数据库会有账号密码泄露的风险
这时如果有别人获取了应用,他没有关键词数据,也没办法运行应用,增加他的劳动量
其他
这几种方法都用到了服务器和云函数,对小白来说还是有点难度的.
如果自己有服务器和开发能力的话,可以自建一个后台服务(类似小红书养号这种)
对于小白呢我推荐使用云函数或BaaS(后端即服务)来实现功能
BaaS 或 mBaaS 或后端即服务是一种自动化后端开发和维护云基础设施的平台。使用 BaaS,您将把运行和维护服务器的责任外包给第三方,并将重点放在前端或客户端开发上。
国外:
Supabase,Appwrite
国内:
腾讯云,阿里云,飞布,memfiredb
第一种的网络验证我使用的就是memfiredb来完成的,具体的函数代码如下:
var getRawBody = require('raw-body');
var getFormBody = require('body/form');
var body = require('body');
var uuidMap = {
'你的uuid': 45
}
exports.handler = (req, resp, context) => {
console.log('hello world');
var params = {
remainDay: getByUuid(getUuidByUrl(req.url))
}
getRawBody(req, function(err, body) {
for (var key in req.queries) {
var value = req.queries[key];
resp.setHeader(key, value);
}
resp.setHeader('Content-Type', 'application/json');
params.body = body.toString();
resp.send(JSON.stringify(params, null, ' '));
});
}
function getUuidByUrl(url) {
// 获取请求参数
return url.split('?')[1].split('=')[1]
}
function getByUuid(reqUuid) {
return uuidMap[reqUuid] ? uuidMap[reqUuid] : '0'
}
这里并没有用到数据库,只作为演示
发布后的云函数都有一个访问地址,通过https://xxx/get_machine_expire?uuid=uuid调用就能返回数据了
结束
对于没有服务器/开发能力的小伙伴,还是内嵌指令来的更实在,有能力的可以自建后台或云函数走起.能提高影刀应用的使用上限
有问题的可以评论留言哈