如何在 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
我正在尝试监听来自我网站上第 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