安卓逆向:x红书水印去除Frida脚本和Xposed模块
字数 1004 2025-09-23 19:27:46

小红书水印去除技术实现详解

一、技术背景

小红书作为流行的社交平台,会在用户分享的图片上添加水印(文字或Logo)。本文详细讲解如何通过Frida脚本和Xposed模块实现小红书水印的去除。

二、水印实现方式分析

通过逆向分析,小红书主要使用以下三种方式添加水印:

  1. Bitmap.compress - 用于保存图片到磁盘时添加水印
  2. Canvas.drawText - 添加文字水印(如"小红书"、"xhs"等)
  3. Canvas.drawBitmap - 添加图像Logo水印

三、Frida脚本实现

1. 去除文字水印

通过Hook Canvas.drawText方法,检测并替换包含特定关键词的文字内容:

Canvas.drawText.overload(
    "java.lang.String", 
    "float", 
    "float", 
    "android.graphics.Paint"
).implementation = function(text, x, y, paint) {
    if (text.toLowerCase().includes("小红书") || 
        text.toLowerCase().includes("xhs")) {
        return this.drawText('', x, y, paint);
    }
    return this.drawText(text, x, y, paint);
}

关键点:

  • 使用overload指定参数类型确保Hook正确方法
  • 检测文本内容是否包含"小红书"或"xhs"(不区分大小写)
  • 替换为空白字符串实现去水印效果

2. 去除图片Logo水印

通过Hook Canvas.drawBitmap方法,检测Bitmap尺寸判断是否为水印:

Canvas.drawBitmap.overload(
    "android.graphics.Bitmap", 
    "android.graphics.Rect", 
    "android.graphics.Rect", 
    "android.graphics.Paint"
).implementation = function(bitmap, src, dst, paint) {
    if (bitmap.getWidth() < 400 && bitmap.getHeight() < 150) {
        // 创建透明Bitmap替换水印
        var transparent = Bitmap.createBitmap(
            bitmap.getWidth(), 
            bitmap.getHeight(), 
            Bitmap.Config.ARGB_8888
        );
        return this.drawBitmap(transparent, src, dst, paint);
    }
    return this.drawBitmap(bitmap, src, dst, paint);
}

关键点:

  • 水印Logo通常尺寸较小(宽<400px,高<150px)
  • 创建透明Bitmap替换原水印Bitmap
  • 使用ARGB_8888配置确保透明效果

四、Xposed模块实现

将Frida脚本转换为持久化的Xposed模块:

1. 文字水印处理

private void hookCanvasDrawText() {
    for (Method method : Canvas.class.getDeclaredMethods()) {
        if (method.getName().equals("drawText") && 
            method.getParameterTypes().length == 4) {
            XposedBridge.hookMethod(method, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) {
                    String text = (String) param.args[0];
                    if (text != null && 
                        (text.toLowerCase().contains("小红书") || 
                         text.toLowerCase().contains("xhs"))) {
                        param.args[0] = "";
                    }
                }
            });
        }
    }
}

2. 图片水印处理

private void hookCanvasDrawBitmap() {
    for (Method method : Canvas.class.getDeclaredMethods()) {
        if (method.getName().equals("drawBitmap") && 
            method.getParameterTypes().length == 4) {
            XposedBridge.hookMethod(method, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) {
                    Bitmap bmp = (Bitmap) param.args[0];
                    if (bmp.getWidth() < 400 && bmp.getHeight() < 150) {
                        Bitmap transparent = Bitmap.createBitmap(
                            bmp.getWidth(), 
                            bmp.getHeight(), 
                            Bitmap.Config.ARGB_8888
                        );
                        param.args[0] = transparent;
                    }
                }
            });
        }
    }
}

Xposed模块关键点:

  • 通过反射获取Canvas类的所有方法
  • 根据方法名和参数数量筛选目标方法
  • beforeHookedMethod中修改参数实现水印去除
  • 模块需要声明Xposed相关配置(未在原文中展示)

五、实现注意事项

  1. 兼容性问题

    • 不同版本的小红书可能使用不同的水印实现方式
    • 需要根据实际情况调整尺寸判断阈值
  2. 性能考虑

    • Bitmap操作较耗资源,应避免频繁创建Bitmap
    • 精确判断条件减少不必要的Hook处理
  3. 检测规避

    • 小红书可能有反Hook机制,需考虑隐藏Xposed痕迹
    • 可结合其他技术(如Magisk Hide)增强隐蔽性

六、完整资源

完整代码和模块下载地址:
https://github.com/SimpsonGet/XhsWatermarkRemove

七、法律与道德提示

本技术文档仅用于学习Android逆向技术和安全研究目的。实际应用中请遵守相关法律法规和平台用户协议,尊重知识产权。

小红书水印去除技术实现详解 一、技术背景 小红书作为流行的社交平台,会在用户分享的图片上添加水印(文字或Logo)。本文详细讲解如何通过Frida脚本和Xposed模块实现小红书水印的去除。 二、水印实现方式分析 通过逆向分析,小红书主要使用以下三种方式添加水印: Bitmap.compress - 用于保存图片到磁盘时添加水印 Canvas.drawText - 添加文字水印(如"小红书"、"xhs"等) Canvas.drawBitmap - 添加图像Logo水印 三、Frida脚本实现 1. 去除文字水印 通过Hook Canvas.drawText 方法,检测并替换包含特定关键词的文字内容: 关键点: 使用 overload 指定参数类型确保Hook正确方法 检测文本内容是否包含"小红书"或"xhs"(不区分大小写) 替换为空白字符串实现去水印效果 2. 去除图片Logo水印 通过Hook Canvas.drawBitmap 方法,检测Bitmap尺寸判断是否为水印: 关键点: 水印Logo通常尺寸较小(宽<400px,高 <150px) 创建透明Bitmap替换原水印Bitmap 使用ARGB_ 8888配置确保透明效果 四、Xposed模块实现 将Frida脚本转换为持久化的Xposed模块: 1. 文字水印处理 2. 图片水印处理 Xposed模块关键点: 通过反射获取Canvas类的所有方法 根据方法名和参数数量筛选目标方法 在 beforeHookedMethod 中修改参数实现水印去除 模块需要声明Xposed相关配置(未在原文中展示) 五、实现注意事项 兼容性问题 : 不同版本的小红书可能使用不同的水印实现方式 需要根据实际情况调整尺寸判断阈值 性能考虑 : Bitmap操作较耗资源,应避免频繁创建Bitmap 精确判断条件减少不必要的Hook处理 检测规避 : 小红书可能有反Hook机制,需考虑隐藏Xposed痕迹 可结合其他技术(如Magisk Hide)增强隐蔽性 六、完整资源 完整代码和模块下载地址: https://github.com/SimpsonGet/XhsWatermarkRemove 七、法律与道德提示 本技术文档仅用于学习Android逆向技术和安全研究目的。实际应用中请遵守相关法律法规和平台用户协议,尊重知识产权。