|
|
本帖最后由 Mtawei 于 2026-9-14 11:55 编辑
sg输入法剪贴板字数限制:完整复盘
一起点:解除搜狗输入法剪贴板 5000 字的复制
二逆向定位:用 MT 的 APK 工作区打开,workspaceId 拿到 9k2l6a8v。第一步搜 clipboard 类名,捞出一大串 com.sogou.clipboard.*。核心几个类:
限制点确认:manager.a;->b()I,读 mmkv 键 clipboard_max_copy_length,默认值 0x1388 即 5000。函数里还有个现成后门——- sget-boolean v0, Lcom/sogou/core/input/chinese/inputsession/utils/a;->l:Z
复制代码 ,为 true 时直接 return 0x7fffffff。截断点确认:interceptor.a;->d(String),substring(0, b()) 直接砍。调用方 interceptor.f;->a(ClipData) 在 if-le v1, v3 判断后决定是否走截断分支。
三、三次改包尝试
开了编辑会话 c503d194,逐个改。
v1:b() 恒返 INT_MAX
把 b() 里的 sget 判断整段删掉,改成无条件 const v0, 0x7fffffff; return v0。 搜狗输入法_20.15.1_clipboard_unlock.apk,V1/V2/V3 全签。
结果:装上去复制长文本可,但剪贴板面板空白了。
中途插曲:改 if-le 为 if-ge
想过直接把 f->a 的 if-le 反转成 if-ge,让长串跳过截断分支。改完立刻回滚了——这个改法有副作用,短文本会掉进截断块误弹 toast,而且没解决根本问题。
v2:b() 恒返 0xf4240
把上限从 INT_MAX 降到 100 万,保留有限上界。 搜狗输入法_20.15.1_clipboard_v2.apk。
结果:依然无剪贴板内容。
四、总结为什么失败
v1、v2 症状一模一样,说明问题不在数值大小。深挖落库链路:
- f->a → a.d 截断 → Wf 异步穿透 → j->z → c.callable → j->b insertOrReplace
复制代码
- :catchall_63
- invoke-virtual {p0, v1}, ClipboardBeacon;->setStatus(Z)
- move-object v3, v0 # v0 = null
- :goto_6b
- ...
- invoke-virtual {p2, v0}, rx/g;->i(Object) # 回调传 null
复制代码
任何一步抛异常都被静默吞掉,v3 置 null,回调传空对象,面板自然什么都不显示。
可疑爆点两个:
一是 j->q() 调的 Lcom/sogou/textmgmt/core/util/d;->a(String) 文本分析,超长或含特殊字符(URL、数字串)最容易炸。
二是 insertOrReplace 写 GreenDAO,内容列有字段长度约束。
把上限从 5000 拉到 100 万,等于把原本会被截断的长串放行成完整串,正好踩中这两个雷。v1、v2 结果相同,根源在此。
五、目前正在转向方案
与其继续跟搜狗这套黑盒链路死磕,不如我准备写一个悬浮窗剪贴板 Xposed 模块,挂在搜狗进程里直接接管。核心思路:
Xposed 在搜狗进程 hook InputMethodService.onWindowShown,键盘弹出时挂悬浮球
自己用 MMKV 存剪贴板历史,不碰 GreenDAO
点击条目直接 ClipboardManager.setPrimaryClip + commitText 上屏,绕开搜狗落库链路
搜狗是输入法进程,有剪贴板读取豁免。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|