本帖最后由 heisezhitong 于 2023-09-23 11:20 编辑
1.小草影视1.6.1 2.HttpCanary 3.MT管理器 4.算法助手:https://www.dslt.tech/article-3816-1.html
一、抓包和算法助手定位
1.黄鸟开启抓包,发现可疑封包,invited是受邀的意思,可见这条封包便是我们邀请的关键封包,其中我们需要关注的是sign的算法 POST /api/public/init HTTP/1.1 log-header: I am the log request header. app_id: xiaocao channel_code: xc_ds30 cur_time: 1622713837238 device_id: c253b61fae991642 mob_mfr: huawei mobmodel: BRQ-AN00 package_name: com.xiaocao.p2p sign: F90E98C3DD93D851D6FD4A002DD58A60 sys_platform: 2 sysrelease: 7.1.2 token: version: 16100 Content-Type: application/x-www-form-urlencoded Content-Length: 11 Host: xcapp.cyb365.cn Connection: Keep-Alive Accept-Encoding: gzip User-Agent: okhttp/3.10.0
invited_by=
2.复制sign中的值到算法助手中搜索,由此可知sign的值是由36Q7tBqO3YqrMHf3c253b61fae9916421622713837238 进行md5加密得来的,在什么都不知道的情况下,盲猜1622713837238 是时间戳 二、MT管理器分析与注入验证
1.直接搜数据啥也搜不到,所以我们根据算法助手的堆栈调用,定位到com.xiaocao.p2p.util.AppUtils.md5 ,由方法名我们可以知道,这个方法是进行了一次md5运算,因此要得到加密前的数值必须查看方法调用 2.调用处有三个,前两个很明显不是,我们直接看第三个(因为被数字加固了,所以我们简单修复一下代码),第三个有getDeviceId (获取设备id)、System.currentTimeMillis (获取时间戳) public Response intercept(Interceptor.Chain chain) throws IOException { Request.Builder newBuilder = chain.request().newBuilder(); String lowerCase = Build.MANUFACTURER.toLowerCase(); String str = Build.MODEL; String str2 = Build.VERSION.RELEASE; String deviceId = AppUtils.getDeviceId(BaseApplication.getInstance()); String appMetaData = AppUtils.getAppMetaData(BaseApplication.getInstance()); String token = UserUtils.getToken(); String upperCase = AppUtils.md5(AppUtils.normalSign(System.currentTimeMillis() + "")).toUpperCase(); Response proceed = chain.proceed(newBuilder.build()); f.d(proceed.code()); return proceed; } }
3.这个方法中我们来看看这一句代码,获取时间戳并传入normalSign这个方法中,然后再进行md5加密
String upperCase =AppUtils.md5(AppUtils.normalSign(System.currentTimeMillis() + "")).toUpperCase(); 4.跟进一下normalSign方法,返回值是e.decode + 设备id + 时间戳(刚才传进来的),也验证了我们算法助手里找到的那个字符串36Q7tBqO3YqrMHf3c253b61fae9916421622713837238 ,1622713837238 是时间戳,设备id:c253b61fae991642 也就是我们的Android ID,也就是剩下一个36Q7tBqO3YqrMHf3 目前还不知道是什么 public class AppUtils { public static String normalSign(String str) { return e.decode(ConstantUtils.a) + getDeviceId(BaseApplication.getInstance()) + str; } }
5.再跟进decode方法,很明显这是一个DES算法,我们在算法助手中搜一下36Q7tBqO3YqrMHf3 ,没想到是这个居然不是加密结果,失算了 public class e { public static String decode(String str) { try { SecretKey generateSecret = SecretKeyFactory.getInstance(generateSecret(new DESedeKeySpec(getBytes())); Cipher instance = Cipher.getInstance(); instance.init(2, generateSecret, new IvParameterSpec(getBytes())); return new String(instance.doFinal(Base64.decode(str, 2))); } catch (Exception e) { e.printStackTrace(); return str; } } }
6.这时我们不妨大胆猜测一下,这是一个固定的字符串。接下来我们用MT的注入来验证一下我们的猜测 7.果不其然,这是一个固定的字符串,我又测试了不同的手机或者模拟器,都是这个,所以我们直接拿来用就可以了 三、协议编写
综上所述,我们知道了sign的值就是由36Q7tBqO3YqrMHf3 + 设备id + 时间戳,最后再md5加密。 那么设备id就可以由随机的16位字符串组成,时间戳直接调用就行。 协议代码如下: # -*- coding: utf-8 -*-
# @Author : 大神论坛
# @FileName: 小草影视邀请协议.py
# @Software: PyCharm
import requests import time import random import hashlib
def a(): #获取时间戳 t = str(int(round(time.time() * 1000))) print(t) # 随机生成16位数字 id = "".join(random.choice("123456789abcdef") for i in range(16)) #sign算法:固定字符串+16位随机数+时间戳再md5 md = "36Q7tBqO3YqrMHf3" + id + t print(md) #md5加密,并且转换为大写字母 m = hashlib.md5(md.encode(encoding='UTF-8')).hexdigest().upper() print(m) header = { 'log-header': 'I am the log request header.', 'app_id': 'xiaocao', 'channel_code': 'xc_tg18', 'cur_time': t, 'device_id': id, 'mob_mfr': 'xiaomi', 'mobmodel': 'Redmi K40 Pro', 'package_name': 'com.xiaocao.p2p', 'sign': m, 'sys_platform': '2', 'sysrelease': '9', 'token': '', 'version': '16100', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'okhttp/3.10.0' } datas='invited_by=123456' #填入你的邀请码 urls = 'https://xcapp.cyb365.cn/api/public/init' res = requests.post(url=urls,data=datas,headers=header) print(res) #返回200即邀请成功
if __name__ == '__main__': j=0 for i in range(50): #五十次即可永久去广告 time.sleep(random.randint(1, 15)) # 设置随机延时 a() print("已刷{}次".format(i)) j+=1 if j == 50: break
看一下效果: 四、尾声
虽然说这个协议能行,但是去的只是播放前的广告,还有一些轮播广告(还有点少儿不宜)。不过呢,建议你们慢慢刷,官方会封号的,且行且珍惜。至于其他广告其实也很好去,我这里就简单提一下,com.xiaocao.p2p.entity.AdInfoDetailEntry类中的getSdk_ad_id方法修改返回0即可。对了,这个方法是通用于小草六兄弟的,毕竟都是换壳app,但是完全不用去试,我发现六兄弟其实都可以一个账号去登陆的,而且效果都一样。
|