吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2538|回复: 6
收起左侧

[Web逆向] csdn 去除csdn博客上传图片水印

[复制链接]
zl20110000 发表于 2021-8-14 18:34
本帖最后由 zl20110000 于 2021-8-14 22:51 编辑

1.分析

  • 1.1 关键词搜索定位js

Snipaste_2021-08-14_17-58-30.png
Snipaste_2021-08-14_17-56-30.png

  • 1.2 从这里就可以看出生成水印的url  (这里有一个.gif判断,这里先埋个伏笔,等会找到位置后,可以利用这个规则修改生成的url)

Snipaste_2021-08-14_17-57-41.png

  • 1.3 排查执行方法栈,发现函数onImageUpload,继续搜索,

Snipaste_2021-08-14_18-02-27.png

  • 1.4 注意这个暴露出来的全局方法window.csdn.uploadSource,定位这个函数的js文件,可以通过断点,或者直接搜索uploadSource,定位的js文件,源码表示这是一个立即执行的函数表达式,在里面对window.csdn.uploadSource赋值。其实看到这里,基本流程都已经很清晰了。

Snipaste_2021-08-14_18-11-10.png
Snipaste_2021-08-14_18-13-17.png

  • 1.5 生成水印分为两种,1.上传图片,通过参数决定上传图片是否加上水印,这里可以通过,将watermark参数置空 2.还一种就是之前旧版的生成url链接的形式,这种直接去掉后面的参数就可以了

  • 1.6 回到之前的流程中,有一个setWatermark方法,这里有判断加水印的规则

2.注入js

加条件断点

重新定义 window.csdn.uploadSource 方法

还记得上面说的.gif伏笔吗,这里可以修改返回的url值,就可以避免生成的url附加水印参数

Snipaste_2021-08-14_18-30-51.png

3.虽然来52很久了,但是没发过贴,不清楚可不可以贴写好的油猴脚本。如果有违规,我立马删掉

[Asm] 纯文本查看 复制代码
~~~js
// ==UserScript==
// @name         csdn去除水印
// @namespace    https://greasyfork.org/scripts/465212
// @version      0.1
// @description  csdn去除水印
// @author       zl20110000
// @match       ://editor.csdn.net/
// @icon         https://g.csdnimg.cn/static/logo/favicon32.ico
// ==/UserScript==

(function() { "use strict"; ! function (e, t) { function a(e) { return Object.prototype.toString.call(e).match(/[object (.*?)]/)[zxsq-anti-bbcode-1] }

function r(e) {
    function r(e) {
        return new Promise(function (a, r) {
            t.ajax({
                url: "https://imgservice.csdn.net/direct/v1.0/image/upload",
                type: "get",
                contentType: "application/json",
                dataType: "json",
                data: {
                    watermark: o,
                    type: l,
                    rtype: p
                },
                headers: {
                    "x-image-app": s,
                    "x-image-dir": c,
                    "x-image-suffix": e.name.split(".")[e.name.split(".").length - 1]
                },
                xhrFields: {
                    withCredentials: !0
                },
                success: function (t) {
                    if (200 === t.code && t.data) {
                        var i = t.data,
                            c = new FormData,
                            s = {
                                key: "" + i.filePath,
                                policy: i.policy,
                                OSSAccessKeyId: i.accessId,
                                success_action_status: 200,
                                signature: i.signature,
                                callback: i.callbackUrl,
                                file: e
                            };
                        for (var o in s) Object.hasOwnProperty.call(s, o) && c.set(o, s[zxsq-anti-bbcode-o]);
                        n(c, i.host, a, r)
                    } else r(t)
                },
                error: function (e) {
                    r(e)
                }
            })
        })
    }

    function n(e, a, r, n) {
        t.ajax({
            url: a,
            type: "post",
            contentType: !1,
            processData: !1,
            dataType: "json",
            mimeType: "multipart/form-data",
            data: e,
            xhrFields: {
                withCredentials: !0
            },
            success: function (e) {
                console.log(e);
                if (200 === e.code && e.data && e.data.imageUrl) {
                    e.data.imageUrl+="?_.gif"
                }
                console.log(e);
                r(e)
            },
            error: function (e) {
                n(e)
            }
        })
    }
    var i, c = e.dir,
        s = e.app,
        o = "",
        l = e.type,
        p = e.rtype;
    console.log(e);
    return i = "FileList" !== a(e.file) && "Array" !== a(e.file) ? [e.file] : Array.prototype.slice.call(e.file),
        function (e) {
            return Promise.all(e.map(function (e) {
                return r(e)
            }))
        }(i)
}
e.csdn = e.csdn || {}, e.csdn.uploadSource = r
console.log("替换完成",e.csdn.uploadSource);

}(window, jQuery); })(); ~~~

}(window, jQuery); })(); ~~~

Snipaste_2021-08-14_18-20-46.png
Snipaste_2021-08-14_18-07-38.png

免费评分

参与人数 2吾爱币 +8 热心值 +2 收起 理由
涛之雨 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zhangzhixiang + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

xilidexiao 发表于 2021-8-14 21:58
随意csdn文章  已存在的水印图片 能逆回原图吗
星空下的流星 发表于 2021-8-14 22:21

以前无意中觉得   
.png不是图片了吗?
要不 “png 后面的东西删了,留个 ) 会怎么样”。结果,水印就没了,哈哈哈
 楼主| zl20110000 发表于 2021-8-14 22:45
xilidexiao 发表于 2021-8-14 21:58
随意csdn文章  已存在的水印图片 能逆回原图吗

看1.5说明。服务端就已经加上水印了,其实,你上传的这些图片都是处理后的图片,以前图片里面可以加入一些自己的信息,比如很早之前的种子图片。现在csdn都会去除掉,有些图片还会被压缩。所有基本不可能逆向原图
 楼主| zl20110000 发表于 2021-8-15 09:52


[JavaScript] 纯文本查看 复制代码
// ==UserScript==
// @name         csdn去除水印
// @namespace    https://greasyfork.org/scripts/465212
// @version      0.1
// @description  csdn去除水印
// @author       zl20110000
// @match       *://editor.csdn.net/*
// @icon         https://g.csdnimg.cn/static/logo/favicon32.ico
// ==/UserScript==



(function() {
"use strict";
! function (e, t) {
    function a(e) {
        return Object.prototype.toString.call(e).match(/\[object (.*?)\]/)[1]
    }

    function r(e) {
        function r(e) {
            return new Promise(function (a, r) {
                t.ajax({
                    url: "https://imgservice.csdn.net/direct/v1.0/image/upload",
                    type: "get",
                    contentType: "application/json",
                    dataType: "json",
                    data: {
                        watermark: o,
                        type: l,
                        rtype: p
                    },
                    headers: {
                        "x-image-app": s,
                        "x-image-dir": c,
                        "x-image-suffix": e.name.split(".")[e.name.split(".").length - 1]
                    },
                    xhrFields: {
                        withCredentials: !0
                    },
                    success: function (t) {
                        if (200 === t.code && t.data) {
                            var i = t.data,
                                c = new FormData,
                                s = {
                                    key: "" + i.filePath,
                                    policy: i.policy,
                                    OSSAccessKeyId: i.accessId,
                                    success_action_status: 200,
                                    signature: i.signature,
                                    callback: i.callbackUrl,
                                    file: e
                                };
                            for (var o in s) Object.hasOwnProperty.call(s, o) && c.set(o, s[o]);
                            n(c, i.host, a, r)
                        } else r(t)
                    },
                    error: function (e) {
                        r(e)
                    }
                })
            })
        }

        function n(e, a, r, n) {
            t.ajax({
                url: a,
                type: "post",
                contentType: !1,
                processData: !1,
                dataType: "json",
                mimeType: "multipart/form-data",
                data: e,
                xhrFields: {
                    withCredentials: !0
                },
                success: function (e) {
                    console.log(e);
                    if (200 === e.code && e.data && e.data.imageUrl) {
                        e.data.imageUrl+="?_.gif"
                    }
                    console.log(e);
                    r(e)
                },
                error: function (e) {
                    n(e)
                }
            })
        }
        var i, c = e.dir,
            s = e.app,
            o = "",
            l = e.type,
            p = e.rtype;
        console.log(e);
        return i = "FileList" !== a(e.file) && "Array" !== a(e.file) ? [e.file] : Array.prototype.slice.call(e.file),
            function (e) {
                return Promise.all(e.map(function (e) {
                    return r(e)
                }))
            }(i)
    }
    e.csdn = e.csdn || {}, e.csdn.uploadSource = r
    console.log("替换完成",e.csdn.uploadSource);
}(window, jQuery);
})();
涛之雨 发表于 2021-8-19 00:02
这怎么还md和bbcode混排的
图片因为bbs的特有属性(其实是bug)推荐通过附件或者图片功能上传,
然后其他用md的就可以了
libaogui2022 发表于 2022-12-7 20:11
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-6-12 02:34

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表