'use strict'; function emit(row) { try { send(row); } catch (e) {} } // dfpReport 链 Java hook: 找 dfp/udbdf 类 -> hook 请求方法 -> 抓 tReq blob + 调用栈 function bx() { try { return Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()).split("\n").slice(0, 14).join(" | "); } catch (e) { return ''; } } setTimeout(() => { try { Java.perform(() => { const hits = []; Java.enumerateLoadedClasses({ onMatch(name) { if (/dfp|Dfp|DFP|udbdf|Udbdf/.test(name)) hits.push(name); }, onComplete() { emit({ event: 'dfp-classes', list: hits.slice(0, 60), total: hits.length }); for (const cn of hits.slice(0, 40)) { try { const K = Java.use(cn); const methods = K.class.getDeclaredMethods(); for (const m of methods) { const mn = m.getName(); if (/post|report|send|build|req|encrypt|get|init/i.test(mn) && m.getParameterTypes().length <= 6) { try { K[mn].overloads.forEach(ov => { ov.implementation = function () { const args = Array.from(arguments).map(a => { try { if (a === null || a === undefined) return String(a); if (a instanceof Java.use("byte[]")) { const arr = Java.array('byte', a); return 'byte[' + arr.length + ']:' + Array.from(arr.slice(0, 48)).map(b => (b & 0xff).toString(16).padStart(2, '0')).join(''); } const s = String(a); if (s.length > 200) return s.slice(0, 80) + ('…len' + s.length); if (s.indexOf('dfp') >= 0 || s.indexOf('udbdf') >= 0 || s.indexOf('571882cf') >= 0) return s; return s.slice(0, 60); } catch (e2) { return ''; } }); emit({ event: 'dfp-call', cls: cn, method: mn, args: args.slice(0, 6), stack: bx() }); return ov.apply(this, arguments); }; }); } catch (e3) {} } } } catch (e4) {} } }, }); }); } catch (e) { emit({ event: 'dfp-err', msg: String(e) }); } }, 4000);