核心判断
Photo Sherlock 的主方案是拍照/相册/分享图片,裁剪后上传得到
image_url,再由 Flutter 调 search-image 远端接口返回 same_results / similar_results。结果页用缩略图、站点来源、文本结果和直链包装,免费用户受额度/广告约束,Pro 解锁无限搜索、无广告和直链。
本包没有恢复出本地人脸识别模型:未发现 .tflite、.onnx、.pb,也未见 ML Kit/TensorFlow/OpenCV 人脸识别依赖。静态上更应判定为远端搜索和外部搜索引擎包装,而不是纯本地 face search。
敏感值处理:资源中出现 Google/Firebase key/app id/sender id 等配置项和值,本报告只记录变量名和 host;AdMob unit id 用 ca-app-pub-.../... redacted。
证据入口
| 证据 | 路径 / 关键词 | 用途 |
|---|---|---|
| APK 静态报告 | research/app-package-forensics/photo-sherlock/apk-pure-latest/analysis.json | XAPK、Flutter、AdMob/Firebase、Billing、权限和组件 |
| blutter AOT | .../deep-tools/flutter-aot/arm64-v8a/apk_contents__config.arm64_v8a.apk/pp.txt | Dart 服务、URL、搜索 schema、IAP、method channel |
| 对象池 | objs.txt | SearchTabType、BackendErrorType、_ProItem |
| Frida class map | blutter_frida.js | 确认 SearchService、HTTPClient、IAPService 等类 |
| 资源字符串 | apk_contents/hippeis.com.photochecker.apk/resources.arsc | 用户文案、法务、Bing、Pro、分享教程、审核提示 |
| 原生 layout/xml | res/layout/*、res/xml/* | 相机、选图、导入、裁剪、详情、FileProvider 和广告位 |
产品链路
select_photo_layout、camera_fragment、share_image_tutorial_layoutUCropActivity、Crop image、无结果时提示裁掉无关区域UPLOADED_IMAGE_URL、uploadedImageUrlReceivedSearchService::searchImage、image_url、search-imagesame_results、similar_results、text_results、imagessearch_locked、rewarded ad、Pro direct link页面和 Route
未恢复到 Flutter 命名 route 表;能恢复 root widget、Flutter 页面类和原生 layout。
| 层 | 页面 / 组件 | 作用 |
|---|---|---|
| 原生 | MainActivity | 主入口 |
| 原生 | camera_fragment.xml、select_photo_layout.xml、import_image_layout.xml | 拍照、相册、分享导入 |
| 原生 | UCropActivity、ucrop_* layout | 裁剪图片 |
| 原生 | photo_details_web_layout、photo_details_flutter_layout、photo_details_other_layout | 详情页/WebView/广告承载 |
| Flutter | SearchScreen、SearchWidget、SearchTabWidget | 搜索结果主体验和 tabs |
| Flutter | IAPScreen、LegalInfoWidget、NoImagesFoundWidget | 订阅、法务、空结果 |
| Bridge | MethodChannelManager | 上传 URL、广告、购买、UI 可见性回调 |
Image to search Select a photo Take a photo to search Search in Bing No search data Open Photo Sherlock website
搜索 Schema
SearchService::searchImage调远端。- 入参/字段:
image_url、pass、result。 - 响应:
SearchResult->tabs->SearchTab。 - tab 类型:
same_results/similar_results。 - 结果字段:
text_results、images、entity、page_url、host_name。
本地 vs 远端
- 本地确认:拍照、选图、分享导入、裁剪、FileProvider、缓存、展示。
- 远端确认:
photosherlock.com/api、search-image、should-load-rewarded。 - 未证实:上传 host、headers、auth、服务端搜索引擎、排序算法。
- 未发现:本地 ML 模型或本地 face embedding 实现。
Host / Endpoint / Remote Config
| 类别 | 线索 | 判断 |
|---|---|---|
| 业务 API | https://photosherlock.com/api、search-image | Flutter 侧硬编码搜索 base 与 endpoint |
| 激励广告 | should-load-rewarded | 后端决定是否加载 rewarded ad |
| 官网/跳转 | photosherlock.com、/redirect | 直链/官网搜索/跳转包装 |
| Bing | www.bing.com、Search in Bing、Bing disclaimer | 明确包装 Bing 搜索体验,但不证明唯一 provider |
| Firebase | firebase_database_url、google_storage_bucket、photo-sherlock.firebaseio.com、photo-sherlock.appspot.com | 确认配置/host,不能证明 Firestore 业务读写 |
| Remote Config | FirebaseRemoteConfig、SHOW_PHOTO_DETAILS_BANNER_ON_BING | 至少有远程开关控制详情页 Bing banner |
| 法务 | S3 privacy/terms host | 隐私/条款托管,不代表业务搜索 |
订阅、广告、埋点
| 类别 | 证据 | 含义 |
|---|---|---|
| IAP 商品 | com.appsmotor.PhotoSherlock.disableAds、ps.pro.sub | 一次性去广告/Pro subscription 线索 |
| Pro 权益 | unlimitedSearches、noAds、openDirectSearchResult | 额度、广告、直链是核心付费点 |
| 购买动作 | restorePurchases、manageSubscriptions、Google Play subscription URL | 标准 Google Billing 流程 |
| 广告 | AdMob Activity/Service、AdView layout、rewarded/interstitial/native strings | 多位置广告,ad unit 已 redacted |
| 埋点/归因 | Firebase Analytics、Crashlytics、Install Referrer、AdServices AD_ID/ATTRIBUTION/TOPICS | 基础广告归因和稳定性监控 |
| 未命中 | AppsFlyer / Adjust / Branch / OneSignal | 未看到明确 SDK 线索 |
复刻低垂果实
| 机会 | 做法 | 证据来源 |
|---|---|---|
| 首次价值 | 开屏即选图/拍照/分享,返回 same/similar 两 tab | Select a photo、SearchResult.tabs |
| 结果包装 | 缩略图宫格、host badge、文本结果、来源直链 | page_url、host_name、text_results |
| 免费额度 | 每日免费次数 + reward ad 补一次 | search_locked、rewardReceived |
| 订阅权益 | 无限搜索、无广告、打开直链 | _ProItem 三项 |
| 分享入口 | 从 dating/social app 截图分享到 App 搜索 | 分享教程文案直接命中 dating/fake 场景 |
| 合规信任 | 不承诺身份识别;强调来源检查、删除策略和敏感图处理 | Bing disclaimer、隐私/条款、内容审核提示 |
MVP 方案
- Android 或 Web PWA:选择/拍照/分享图片 -> 裁剪 -> 上传对象存储 -> 后端
POST /search-image。 - 后端统一 schema:
same_results[]、similar_results[]、text_results[]、images[]。 - 免费策略:首次 3 次免费;之后 rewarded ad 或订阅;订阅只承诺额度/无广告/直链/历史,不承诺找人准确率。
- 搜索供应商 adapter 化,避免前端绑定到 Bing/Yandex/Google Lens/自研任一实现。
- 上传前明确告知用途、保留时间和删除方式;敏感/未成年人/成人图像硬拦截。
合规风险
人脸/人物搜索高风险。产品文案应定位为图片来源/相似图片检查,不应暗示身份识别、真人定位或跟踪能力。
- 上传用户照片到远端需要明确用途、第三方处理、保留时间和删除机制。
- dating/fake profile 是强需求,但容易演变为骚扰、跟踪和未成年人风险。
- 外部搜索结果涉及供应商 ToS、缓存缩略图版权和结果页跳转合规。
- AdMob、Firebase Analytics、AdServices、Install Referrer、UMP 均需隐私披露。
静态 Stop Point
当前静态证据不能证明真实运行路径。必须用真机/MITM/Frida/账号/购买沙盒补证。
- 不能证明首次打开是否有 onboarding、同意弹窗、远程 paywall 或广告弹窗。
- 不能证明图片上传真实 host、method、headers、auth、签名和保留策略。
- 不能证明
search-image服务端调用哪家搜索引擎或是否做人脸 embedding。 - 不能证明
same_results/similar_results的算法含义和排序逻辑。 - 不能证明免费额度、广告频率、Pro 价格和 trial。
- 不能证明搜索历史是否持久化、是否上传账号侧、是否可删除。
动态补证计划
- 真机新装录屏:选图、裁剪、搜索、结果、打开结果,记录权限、同意、paywall 和广告。
- MITM/HAR:抓
photosherlock.com/api/search-image、should-load-rewarded、上传 URL、Remote Config fetch;保存 redacted manifest。 - Frida:hook
SearchService::searchImage、HTTPRequest::url、MethodChannelManager.uploadedImageUrlReceived、showRewardedAd、buyPro。 - 购买沙盒:验证
ps.pro.sub、disableAds、restore、manage subscription 和直链权益。 - 负样本:成人、儿童、非人像、无结果图,确认审核提示来自本地还是服务端。