|
|
发表于
2026-5-17 12:54:46
|
显示全部楼层
来自 浙江
【替换照片本身 思路三选一】
你时间和高德经纬度都搞定了 说明hook能力没问题 替换图片卡住八成是 hook错位置
今日水印相机的拍照流程通常是:
- CameraX/Camera2 取帧 → ImageAnalyzer/Surface → 业务层拿到Bitmap → 加水印 → 编码JPEG → 落盘
复制代码
路1 hook ImageProxy/ImageReader 的onImageAvailable
这是相机帧的入口 拦下来直接换Bitmap
- XposedHelpers.findAndHookMethod(
- "androidx.camera.core.ImageAnalysis", lpparam.classLoader,
- "analyze", ImageProxy.class,
- new XC_MethodHook() {
- @Override
- protected void beforeHookedMethod(MethodHookParam p) {
- ImageProxy proxy = (ImageProxy) p.args[0];
- // 这里可以直接拿到 YUV/Bitmap 篡改
- }
- });
复制代码
但CameraX有时候被混淆 找不到类名 用方法2更稳
路2 hook BitmapFactory.decodeFile/decodeByteArray (推荐)
业务层加水印之前 一般会先把帧解码成Bitmap 这是最稳的截胡点
- XposedHelpers.findAndHookMethod(
- "android.graphics.BitmapFactory", null,
- "decodeByteArray", byte[].class, int.class, int.class,
- new XC_MethodHook() {
- @Override
- protected void afterHookedMethod(MethodHookParam p) {
- // 判断是不是相机来的(看长度/调用栈)
- // 是的话 把 p.setResult() 替换成你自己的Bitmap
- Bitmap fake = BitmapFactory.decodeFile("/sdcard/Pictures/fake.jpg");
- p.setResult(fake);
- }
- });
复制代码
路3 hook 文件保存接口
如果上面两条都被VMP吃了 退而求其次
hook FileOutputStream.write 在落盘瞬间替换byte[]
- 但要注意JPEG编码已经把水印烧进去了 你换图等于丢了水印
- 所以这条 = 路2失败的兜底
复制代码
【调用栈追踪推荐】
- 先hook BitmapFactory.decodeByteArray 不改 只打 Thread.currentThread().getStackTrace()
- 看相机这条业务调用了哪几层 → 锁定真实入口
复制代码
这比闷头试快多了
【注意点】
今日水印相机用的是 TencentCamera + 自家滤镜 不是纯CameraX 类名会偏
可能要看 com.kuaishou / com.lebo / com.intsig 这种第三方拍照引擎包名
你截下今日的lib目录 看看用的什么相机SDK 我能帮你定位更准
说实话最稳的其实是 让相机直接取/sdcard下你预存的图 完全跳过真实拍摄 |
|