sawyershoemaker/omoggle-fluox

GitHub: sawyershoemaker/omoggle-fluox

该脚本通过在源代码层面修改人脸特征点几何结构来影响 Omoggle 颜值评分,避免了直接篡改分数值导致的数据不一致与检测风险。

Stars: 1 | Forks: 0

# omoggle-fluox 这是一款 tampermonkey 脚本,它通过从源头修改面部特征点几何结构来人为提高 [Omoggle](https://omoggle.com) 的得分,而不是在事后篡改分数值。目前流传的大多数脚本都是与不断变化的存储值进行交互,这导致脚本很容易失效,并且每次更新都会增加被检测到的风险。在本地直接修改特征点几何结构能将篡改程度降至最低,并且不会因更新而失效。 ## 1. 典型脚本 一款针对此目的的典型付费脚本会通过拦截 websocket 消息来篡改上报的分数。 例如拦截 `{"type":"score_update","payload":{"score":5.7}}` 并将其中的 5.7 改为 8.5 然而,在最新的更新中: - 可读的 `score_update` / `score_submit` 消息是次要的 - 客户端还会每 500 毫秒在一个二进制帧中向服务器流式传输原始的面部特征点数据 - ^ 服务器可以根据这些特征点重新计算分数,从而检查数据一致性并实施封禁 因此,如果你只提高了可读的数字而没有修改特征点,现在就会产生数据矛盾 我们只需要攻击唯一的真实数据源,即特征点本身。 :) ## 2. 架构 这是 omoggle 的(写得很糟糕的)逐帧循环去混淆后的样子: ``` m = faceLandmarker.detectForVideo(video, performance.now()); let j = m.faceLandmarks?.[0] ?? null; // the landmark array with about 478 points {x,y,z} if (j && j.length >= 468) { let e = computeMetrics(j, {videoWidth, videoHeight, ...}); // geometry to metrics to overall score // ^ this drives the on screen score, SCAN_STATE (data channel to opponent), and the binary ws frame } ``` 这意味着分数的每一个消费者:UI、p2p `SCAN_STATE` 以及二进制遥测数据,全都读取自同一个 `j`。如果我们能在 `detectForVideo` 返回后立即修改 `j`,那么下游的所有数据都将基于我们修改后的几何结构得出,从而确保所有数据保持相互一致。 因此,我们只需包装一个函数: ``` FaceLandmarker.prototype.detectForVideo ``` ## 3. 评分流水线 这个复杂的系统到底是如何给你的脸打分的呢? 嗯,它会根据给定的特征点计算出一个 0-10 的 `overall`(总体)分数。 从 bundle 中粗略还原的代码如下: ``` #normalization i = videoWidth / videoHeight # for aspect correction o(p) = { x: p.x * i, y: p.y } # stretch x into a square frame roll = angle(o[10], o[152]) - 90 # determine head roll from forehead(10) to chin(152) p(idx) = rotate(o[idx], around nose o[1], by -roll) # get non rotated and upright face # metrics canthalTilt (eyes) = -avg( angle(33,133), angle(362,263)) jawWidth = maxJawPairDist / faceHeight(10,152) symmetry = 100 * (1 - asymmetry / 0.09) midfaceRatio = |lip(0).y - eyeLineY| / faceHeight cheekboneWidth = cheekWidth(234,454) / jawWidth eyeAspectRatio = avg(eyeHeight/eyeWidth, left & right) eyeSpacing = dist(133,362) / faceWidth # 来自 band-mapping F() 与 加权和 的 subscores harmony J = .18*jaw + .24*midface + .18*cheek + .16*eyeAsp + .24*F(spacing) Z = .12*eyes + .14*jaw + .024*symmetry + .14*midface + .1*cheek + .08*eyeAsp + .18*J overall = round( 10 * clamp(Z * qualityMultiplier, 1.1, 10) ) / 10 ``` 两个*非常*受欢迎的辅助函数: ``` A = (a, b) => Math.hypot(a.x - b.x, a.y - b.y); // distance D = (a, b) => Math.atan2(b.y - a.y, b.x - a.x) * 180/pi; // angle in deg ``` 当各项指标落在其理想区间内时,`overall` 分数就会上升,因此我们只需移动特征点,使每项指标都位于其区间的中心! (`qualityMultiplier` 是一个独立的门控,它来源于姿态/居中程度/稳定度,用于限制最终得分。) ## 4. 变形算法 `morphLandmarks(lm, videoW, videoH, strength)` 会修改现有的特征点数组。不用担心,它的运行空间与应用所使用的空间相同,都是经过纵横比校正和去旋转处理的,因此每次调整都能直接映射到对应的指标上。 ### 个人的一小步,人类的一大步 1. 计算纵横比 `i`、头部偏角 `c`、鼻子中心 `d`,并使用 `p(idx)` 将*受影响的*索引投影到 p 空间中。 别忘了保存原始的纯坐标用于最终的混合! 此外,我们的参考点:(额头 `10`、下巴 `152`、鼻子 `1`)会被读取,但我们不会移动它们,因为它们为我们固定了缩放比例和方向。 2. 针对各项指标进行调整,每次调整都会将一项指标推向其区间中心(如前所述) - 对于眼睛纵横比,将每只眼睛(索引 159/145, 386/374)的眼睑垂直间距设为 `0.26 * eyeWidth`。 - 对于下颌宽度,围绕面部水平轴缩放下颌点 (172/397, 150/379, 171/396),使 `jawWidth/faceHeight` 趋向于 `0.68`。 - 对于颧骨宽度,缩放颧骨点 (234, 454),使 `cheekWidth/jawWidth` 趋向于 `1.14`。 - 对于中庭比例,垂直移动上唇点 (0),使 `|lip.y - eyeLine| / faceHeight` 趋向于 `0.305`。 - 对于对称性,必须使 19 对对称特征点中的每一对都达到平衡,使得每个点到垂直/水平中心的距离从不对称(0)变为对称(100)。 - 对于眦角倾斜,旋转每条眼角线(33 到 133,362 到 263),使其角度达到能够产生大约 4.25 倾斜度的值。 3. 通过将每个调整后的点投影回原始的归一化坐标来进行逆变换与混合 从方程式的角度来看,这看起来就像是加上 c,将 x 除以 i,然后通过 `strength`(强度)在真实位置和理想位置之间进行线性插值 ## 5. 控制键位 | 按键 | 效果 | | -------------------------------------- | ---------------------- | | `=` / `+` | 强度 +5% | | `-` / `_` | 强度 −5% | | `0` | 重置为默认值 (50%) | | (移动端)点击屏幕左/右边缘 | −/+ 强度 | 控制台用法 (`window.__fluox`): ``` __fluox.strength // strength value __fluox.setStrength(0.7) // unnecessary mutator (shoutout ap csa) __fluox.bump(+0.05) // increase __fluox.reset() // reset __fluox.ops // toggles: { tilt, eyeAspect, jaw, cheekbone, midface, symmetry } __fluox.targets // ideal band centers __fluox.diagnose() // { hooked, classLabel, framesMorphed, lastVideo, lastError, webpackReq, ... } (mostly for debugging) ```
标签:云资产清单, 人脸识别, 前端篡改, 数据可视化, 浏览器脚本, 游戏外挂, 策略控制器, 自定义脚本, 逆向工程