为了我的二级,水一篇,蓝奏云单文件直链解析分析

蓝奏云,大家肯定都用过,如果搞到直链的话,相信你们聪明的脑袋瓜,已经知道可以搞什么了,话不多说开始分析,先从最基本的单文件解析开始。

打开bp开始抓包,点击代理打开拦截,打开内置浏览器

然后在浏览器里面进行着正常的输入密码下载操作,记得在bp里面放行,然后就可以开始分析了,点击http历史记录

点击第一个链接

在右侧响应中我们可以看见这段js代码


function down_p(){
		var pwd =document.getElementById('pwd').value;
		if (pwd == '' || pwd == undefined || pwd == null) {
			$(".passwdinput").focus();
			return false;
		}
		var skdklds = 'VzFXaV5vAjNRWAI9BDQHO1c8DjxfMVdsUmBXZVc6BzdVZQV0DCVXPgluUDEDZlxvB28BPVY6UGdRYQY3';
		$.ajax({
			type : 'post',
			url : '/ajaxm.php?file=171954110',
			//data : 'action=downprocess&sign=VTMAPgs6UG&p='+pwd,
			//data : '&p='+pwd,
			//data : 'action=downprocess&sign=c20230818&p='+pwd,
			data : { 'action':'downprocess','sign':skdklds,'p':pwd },
			//data : 'p='+pwd+'&',
			
			dataType : 'json',
			success:function(msg){
				var date = msg;
				if(date.zt == '1'){
					$("#downajax").html("<a href="+date.dom+"/file/"+ date.url +" target=_blank rel=noreferrer>下载</a>");
					$("#passwddiv").hide();
					$("#filenajax").text(date.inf);
					document.title = date.inf;
					$(".n_box_des").show();
					$("#file").removeClass("filter");
				}else{
					$("#info").text(date.inf);
				};
				
			},
			error:function(){
				$("#info").html("失败,请刷新");
			}
	
		});
}

回到bp,可以看见我们第二个链接就是从这段代码中构造的

现在我们可以看见其构造参数和响应内容

注意这里有个坑

其直链构造方式中间有**/file/**字段是在前端拼接的

还有几个坑我一次性说完,蓝奏所有请求必须全部携带User-Agent,以及Referer,cookie不需要携带传入

接下来就可以开始写代码了,这里我用Java来写

先引入依赖

<dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.1</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>2.0.47</version>
        </dependency>

我是springboot项目,我就写一个Controller,请求方式为get,参数自主拼接,获取用户传入的url和password

@RequestMapping("/LanZou")
    public String LanZou(@RequestParam String url,@RequestParam String PassWord) throws IOException {

return null;
}

接下来就是去匹配参数,这里我采用最朴素的正则表达式,有更好的方法的话欢迎补充。

 @RequestMapping("/LanZou")
    public String LanZou(@RequestParam String url,@RequestParam String PassWord) throws IOException {
        String html=requests.GetWebPage(url);
        String SignPattern = "var skdklds = '(.*)';";
        String FilePattern = "/ajaxm\\.php\\?file=(\\d+)";
        String UrlPattern = "(https?://[^/]+)";
        String sign = characterTools.getCharacter(html, SignPattern, 1);//获取sign
        String FileCode =characterTools.getCharacter(html, FilePattern, 1);//获取urls
        String url_1 = characterTools.getCharacter(url, UrlPattern, 0);
        String MessageUrl =url_1+ "/ajaxm.php?file=" + FileCode;
        String Params = "action=downprocess&sign=" + sign + "&p="+PassWord;
        String responseData = requests.PostWithData(MessageUrl, Params, url_1);
        JSONObject jsonObject = JSONObject.parseObject(responseData);
        String dom = (String) jsonObject.get("dom");
        String lat = (String) jsonObject.get("url");
        String inf = (String) jsonObject.get("inf");
        JSONObject json = new JSONObject();
        json.put("code", 200);
        json.put("msg", "success");
        JSONObject data = new JSONObject();
        data.put("info", inf);
        data.put("url", dom + "/file/" + lat);
        json.put("data", data);
        return json.toJSONString();
    }

给出我用到的方法

 /**
     * 获取字符
     * @param Text 文本
     * @param Patter 正则
     * @param code 代码
     * @return 字符
     */
    public String getCharacter(String Text,String Patter,int code) {
        Pattern r = Pattern.compile(Patter);
        Matcher m = r.matcher(Text);
        if (m.find()){
            return m.group(code);
        }
        return null;
    }


 private final OkHttpClient client = new OkHttpClient();


    /**
     * 发起 POST 请求
     * @param url 请求地址
     * @param Params 请求体
     * @return 返回请求结果
     * @throws IOException 请求异常
     */
    public  String PostWithData(String url,String Params,String Referer) {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(url)
                .addHeader("Referer", Referer)
                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36")
                .post(RequestBody.create(Params, MediaType.parse("application/x-www-form-urlencoded")))
                .build();

        // 发送请求并获取响应
        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                return response.body().string();

            } else {
                System.out.println("Request failed");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 下载网页
     * @param url 网页地址
     * @return 返回网页内容
     */
    public String GetWebPage(String url) {
        Request request = new Request.Builder()
                .url(url)
                .addHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36")
                .build();

        try {
            Response response = client.newCall(request).execute();
            if (response.isSuccessful()) {
                return response.body().string();
            } else {
                // 请求失败
                System.out.println("请求失败: " + response.code() + " " + response.message());
            }
        } catch (IOException e) {
            // 异常处理
            e.printStackTrace();
        }

        return null;
    }

其实走到这步这并不是最终的链接,最终的链接在请求这个链接后的响应头里面

我们需要获取到这个Location响应头,这个才是最终直链,至于怎么获取,应该不必我说了吧,对于单文件解析是比较简单的,新手可以去练练,在文件夹解析中,蓝奏云,连变量名都是随机的,具有有效期,下一篇我会讲到。

37 个赞

顶一顶

1 个赞

捧个场

1 个赞

666

1 个赞

牛,学习了

1 个赞

学习到了

666

1 个赞

太牛了

感谢分享,论坛越来越精彩了

1 个赞

太牛逼了我的佬

点击开发者注册呗,另一个也注册不了啊 :joy:

这怎么能叫水呢?

妥妥的技术贴 :+1:

好帖

赞!

话说这软件哪里下呀

在线网站,不用下载啊

又学到东西了

技术贴也能叫水的话,我这段话才是妥妥的水

晚点我回去试试:grin::grin: