安卓逆向:x红书水印去除Frida脚本和Xposed模块
字数 1004 2025-09-23 19:27:46
小红书水印去除技术实现详解
一、技术背景
小红书作为流行的社交平台,会在用户分享的图片上添加水印(文字或Logo)。本文详细讲解如何通过Frida脚本和Xposed模块实现小红书水印的去除。
二、水印实现方式分析
通过逆向分析,小红书主要使用以下三种方式添加水印:
- Bitmap.compress - 用于保存图片到磁盘时添加水印
- Canvas.drawText - 添加文字水印(如"小红书"、"xhs"等)
- 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相关配置(未在原文中展示)
五、实现注意事项
-
兼容性问题:
- 不同版本的小红书可能使用不同的水印实现方式
- 需要根据实际情况调整尺寸判断阈值
-
性能考虑:
- Bitmap操作较耗资源,应避免频繁创建Bitmap
- 精确判断条件减少不必要的Hook处理
-
检测规避:
- 小红书可能有反Hook机制,需考虑隐藏Xposed痕迹
- 可结合其他技术(如Magisk Hide)增强隐蔽性
六、完整资源
完整代码和模块下载地址:
https://github.com/SimpsonGet/XhsWatermarkRemove
七、法律与道德提示
本技术文档仅用于学习Android逆向技术和安全研究目的。实际应用中请遵守相关法律法规和平台用户协议,尊重知识产权。