如何在 3rd 方应用程序中基于 API 调用和回调触发功能

How to trigger function based on API call and callback in 3rd party app

我正在尝试监听来自我网站上第 3 方应用程序的 javascript 回调。该应用程序已缩小,因此很难进行逆向工程。但是,使用 Chrome 调试器后,我想捕获的回调在下面,有什么办法可以在触发 'CollectEvent' 回调时触发一个函数,并访问 'email' 多变的?您可以在控制台中看到,正在 window 上创建回调,当然,每次代码运行时它们的名称都不同。

认识到我无法直接编辑该代码,因为它是第 3 方库的一部分。

!function() {
    var _0x14bdc8 = {
        'CollectEvent': function(_0x4a9e64, _0x3ac5b7) {
            if (_0x4a9e64) {
                _0x14bdc8[_0x304d('0xa7')] && (_0x30053a('COUPON_CODE_COOKIE_NAME', _0x4a9e64[_0x304d('0xd7')], 0x1),
                _0x14bdc8[_0x304d('0x6a')]());
                var _0x562cf7 = {
                    'shopId': _0x14bdc8[_0x304d('0xc2')],
                    'campaignId': _0x14bdc8[_0x304d('0x79')],
                    'email': encodeURIComponent(_0x4a9e64[_0x304d('0x23')]),
                    'code': _0x4a9e64['code'],
                    'customFields': encodeURIComponent(JSON[_0x304d('0x3')](_0x3ac5b7)),
                    'domain': window[_0x304d('0x73')][_0x304d('0x4a')],
                    'currentUrl': window[_0x304d('0x73')][_0x304d('0x6b')]
                };
                _0x14bdc8[_0x304d('0xa0')](_0x986b46 + '/api/wheelioapp/collectemail', _0x562cf7, function(_0xea4ea9) {
                    _0xea4ea9[_0x304d('0x89')] && _0x14bdc8[_0x304d('0x8f')](!0x1, !0x1, !0x0, !0x1);
                });
            } else
                alert(_0x304d('0x80'));
        },
    ...
    }
}

您可以在此处看到控制台中的 Wheelio 应用程序对象和已创建的回调(尽管它们在每个会话中的名称不同)。

I just need to log it

嗯,好的。我们无法更改已创建的函数 on-the-fly,但我们可以更改其他 window 个函数。

例如我们可以使用encodeURIComponent。看到这一行:

'email': encodeURIComponent(_0x4a9e64[_0x304d('0x23')]),

这意味着电子邮件将以某种方式进入 encodeURIComponent。很好,因为我们可以在那里阅读它:

/* At the beginning */
// This is helper function, detects correct email:
function validateEmail(email) {
    const re = /^(([^<>()\[\]\.,;:\s@"]+(\.[^<>()\[\]\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    return re.test(String(email).toLowerCase());
}
// Keep old function
let oldEncodeURIComponent = window.encodeURIComponent;
// Crete new one
window.encodeURIComponent = (data) => {
  if (validateEmail(data)) {
    // Gotcha!
    console.log('[encodeURIComponent]', data);
  }
  return oldEncodeURIComponent(data);
}

/* Here program works as normal, but creates lots of logs... */

/* In the end */
// If we can understand when we need to stop looking for email,
//   we will disconnect our function:
window.encodeURIComponent = oldEncodeURIComponent;

所以我的想法是读取所有通过 encodeURIComponent 的数据。

P.S。电子邮件验证器 is here