2023-02-10
H羊毛
00

目录

讲讲脚本的原理
对于新手的一些经验:
说说JavaScript吧
为什么要用js呢?
以下是js常用的一些依赖:
写脚本的基本逻辑,和一些技巧
脚本运行分四个阶段。
ppo会员中心来说一下脚本的实现
常见的加密

所谓脚本,就是一段事先写好的剧本(代码),以一定的逻辑触发(最简单的就是无脑按顺序触发)。

讲讲脚本的原理

介绍

大佬对脚本的一些理解吧,先从简单的事情出发,假如我们想完成一个app的自动签到,我们就可以考虑使用脚本。 一般来说,大多数app的事件(签到,评论等)都是用http请求-响应的方式完成的。 以广汽传祺app签到为例,先配置好捉包工具(配置方法自己百度),然后点击签到的话,可以看到我们发送了一个/gateway/app-api/sign/submit 的get请求,然后服务器给了我们一个响应告诉我们签到的结果。这就是一个典型的签到请求-响应过程。 搞明白了签到完成的过程后,我们就可以利用脚本去模拟这个过程完成自动签到。以JavaScript脚本为例,我们可以使用got或者axios依赖来进行http请求,给服务器发送一个同样的签到get请求包。服务器一般会返回一个json格式的响应,我们可以解析这个json数据包看看签到操作成功了没有。每个app签到的请求不一样,成功的响应也不一样,所以需要具体app具体去模拟请求和解析响应。

示例图抓包图抓包图
image.pngimage.png
image.pngimage.pngimage.png

一些签到和捉包的图,配合上面文字看吧

关于签到请求需要什么参数的问题,最简单保险的方法,是自己用发包工具(apipost等),用一模一样的请求参数去发送,然后再逐步删除/修改里面的参数,直到服务器响应返回签到错误为止。这样就可以知道哪些参数是必要的了。

对于新手的一些经验:

不要动请求里面看不懂的参数

只修改里面代表账号的参数(如cookie, auth, token等) 遇到有sign之类的字样的,先修改看响应会不会报错,如果报错了代表服务器会验证签名,对sign算法没有研究的可以先放弃了

只会最简单的算法助手hook java层加密算法,时间多的可以去反编译apk看他源码找加密方法

小程序和网页类的加密算法一般都在js里面,捉包能看到他加载的js,慢慢搜就是了

说说JavaScript吧

刚开始我也是看大佬们都用js写脚本,于是就边看边学。最开始试着修大佬们失效的脚本,再试着增加自己想要的功能,再然后就开始自己写一个脚本。

还记得我第一个写的是腾讯自选股,当时是花了半个月才算是完善了这个重写的脚本。

为什么要用js呢?

首选我们要清楚js是什么。他是一个解释性语言,是不需要经过编译就可以运行。再加上我们有一个强大的node.js,可以很方便地提供js运行环境。因此他的特点就是开发方便,写脚本修脚本不需要编译就可以直接运行去调试。跟另外一门热门脚本语言python相比,优点是速度较快(优化好的话估计可以比py快几倍到10倍),对json结构的操作方便,跨平台运行方便。缺点是第三方库比较少(py没有你找不到的依赖)。对比其他编译型的语言如c++等,缺点是速度慢,难以加密源码。

现在热门的脚本平台如青龙都自带了nodejs环境,圈x也有js运行环境,因此js脚本是一个很好的选择。

以下是js常用的一些依赖:

fs 文件读写操作,nodejs自带 path 解析和生成路径的,nodejs自带,做框架和大项目的时候最好用上 got http发包依赖,第三方库,青龙自带 tough-cookie cookie管理依赖 crypto-js 加解密依赖,第三方库,常用的md5,sha256,aes/des都可以用它 node-rsa rsa加解密依赖,第三方库

写脚本的基本逻辑,和一些技巧

脚本运行分四个阶段。

  1. 首先读取ck等环境变量,然后查询ck是否有效,接着做任务,最后推送运行结果。 一般的模板步骤可以这样写:

0 读取变量(读环境变量,读文件,或者干脆写死在脚本里) 1 登录或请求某个接口,去验证ck是否有效,如果失效了就把ck失效信息加入推送,并跳过以下步骤。简单粗暴点也可以跳过这一步,但如果ck失效了下面任务又继续跑会显得很呆。 2 请求签到信息和任务列表 3 如果还没签到,去签到 4 遍历任务列表,如果任务A还没完成,去做任务A 5 查询一下账户信息,推送账户状态(金币,积分之类的) 6 请求提现,兑换之类的(如果有) 最后调用一下推送方法,青龙自带了sendNotify.js文件,引用一下就行。

  1. 然后是每次请求之间的等待时间。想要模仿真人操作,减少账号或IP黑的风险的话,最好在每个操作之间增加对应的有意义的延迟。 比如一个任务需要我们浏览15秒,我们就别那么死板只等15秒,可以随机一个15到20秒之间的等待时间,然后再请求完成任务/领取奖励。

  2. 号太多,也可以去掉延迟,或者干脆进行多账户并发请求。这样可以大大加快运行速度,代价是容易黑号黑ip。

  3. 部分人使用的脚本里都有Env()方法,其实Env就是一个封装了一些常用方法(http请求方法等)并做了多平台兼容(青龙,圈X等)的类。

js
我们在脚本的开头会声明一个let $ = new Env(), 这个$是一个内置了常用方法的变量。后面我们在脚本里就可以方便地使用各种方法了。 如: 等待1500毫秒: await $.wait(1500); 获取当前时间的格式化字符串: $.time('yyyy-MM-dd hh:mm:ss'); 由于$是一个类的实例, 如果你想存一个全局变量, 也可以直接赋值$.xxx = abc, 下次就能直接调用$.xxx了(注意别跟Env里面的内置方法和变量重名了)

image.png

ppo会员中心来说一下脚本的实现

首先第一步是捉包,我们注册完之后,点击首页的每日签到,会跳出来一个请求 https://membercenter.zippo.com.cn/s2/interface/data.aspx?action=ininttask 这里面的返回包含了签到列表和任务列表,我们先看签到列表

image.png

我们先把返回命名为result 从key的字面意思和返回的具体内容来看,result.data.sign.list是一个显示每日是否已签到的列表, result.data.sign.continue显示连续签到天数信息 result.data.task还会显示今天是否已完成签到 对比一下签到前后的result.data.task返回变化,结合字面意思,我们猜测:

iseveryday代表是否每日任务或者一次性任务 score代表任务分数 task_status表示任务完成进度(0:未完成,1:已完成未领取,2:已领取) taskid就是任务的id type的意义未明 url不用管他,多半是跳转到哪个页面

image.png

image.png

image.png

然后是签到的请求,点击完每日签到会立刻自动完成签到,看请求是这个包 https://membercenter.zippo.com.cn/s2/interface/data.aspx?action=signin 再次对比第一次签到的返回和重放签到请求的返回,可以得出结论:

errcode=0表示签到成功,errcode=其他表示失败 errmsg会给出出错信息

image.png

image.png

做任务,同样捉包,看到以下的请求出现了两次,那么我们对比一下 可以猜测: 做任务分两个阶段,第一是领取/完成任务,第二是领取任务奖励 参数里的taskid很容易理解对应刚才的result.data.task里面每个任务的id acttype猜测1代表完成任务,2代表领取任务

常见的加密

32位的十六进制字符串,一般是MD5算法,常见加密模式是将多个请求里的参数串在一起(大部分是按字母顺序排序),然后加上一串固定字符串(每个app不一样,又叫盐 salt),最后md5一下

40位的十六进制字符串,一般是sha1算法,模式跟md5一样

64位的十六进制字符串,首先考虑sha256,跟上面的加密模式相同

其他不定长度的,末尾有一个或两个等号的,首先考虑是base64编码。如果base64解码出来是乱码,可能是其他算法算出来二进制结果之后,转成的base64。常见的有aes,des,rsa。aes和des是对称加密,特点是加解密共用一个key和iv。rsa是不对称算法,加解密用分开的key,rsa私钥一般在服务器里,因此rsa基本不可能被我们解密出来,只能扒出来公钥进行加密,把加密后的请求发给服务器。

这些公开的算法,如果是调用java层实现,一般可以直接用软件如算法助手hook出来参数。一些其他的自定义算法或者自己代码实现的加密就需要看源码了。

如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:seek

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!