Search code examples
javascriptangulargoogle-chromegoogle-chrome-extensiongoogle-chrome-devtools

Determining which Google Chrome plugin adds code?


I built this documentation app:

https://help-service-parts.fireflysemantics.com/

When I open Chrome developer tooling console tab and click in the search field I see that it generates the error:

VM34 layout.js:1 Uncaught SyntaxError: Identifier 'API_PUBLIC_KEY' has already be en declared

If the error is clicked on it reveals the code pasted below. I tried searching for this in the code base, but I don't see it, so I think it's added by a Google Chrome plugin (I also don't see it in other browsers). How do I find the plugin that is adding this:

const API_PUBLIC_KEY = "0DM2OgjXxj";
const MEMBER_HASH = "UUITtSMj";
const PANEL_HASH = "iY5qPRe9QQ";
const PRIVATE_KEY = "nnCBmSM2JzNIbhY7k3bHrJghZnxhub32";

/** start MD5 **/

var MD5 = function(d) {
    d = unescape(encodeURIComponent(d));
    let result = M(V(Y(X(d), 8 * d.length)));
    return result.toLowerCase();
};

function M(d) {
    for (var _, m = "0123456789ABCDEF", f = "", r = 0; r < d.length; r++) _ = d.charCodeAt(r), f += m.charAt(_ >>> 4 & 15) + m.charAt(15 & _);
    return f
}

function X(d) {
    for (var _ = Array(d.length >> 2), m = 0; m < _.length; m++) _[m] = 0;
    for (m = 0; m < 8 * d.length; m += 8) _[m >> 5] |= (255 & d.charCodeAt(m / 8)) << m % 32;
    return _
}

function V(d) {
    for (var _ = "", m = 0; m < 32 * d.length; m += 8) _ += String.fromCharCode(d[m >> 5] >>> m % 32 & 255);
    return _
}

function Y(d, _) {
    d[_ >> 5] |= 128 << _ % 32, d[14 + (_ + 64 >>> 9 << 4)] = _;
    for (var m = 1732584193, f = -271733879, r = -1732584194, i = 271733878, n = 0; n < d.length; n += 16) {
        var h = m,
            t = f,
            g = r,
            e = i;
        f = md5_ii(f = md5_ii(f = md5_ii(f = md5_ii(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_hh(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_gg(f = md5_ff(f = md5_ff(f = md5_ff(f = md5_ff(f, r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 0], 7, -680876936), f, r, d[n + 1], 12, -389564586), m, f, d[n + 2], 17, 606105819), i, m, d[n + 3], 22, -1044525330), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 4], 7, -176418897), f, r, d[n + 5], 12, 1200080426), m, f, d[n + 6], 17, -1473231341), i, m, d[n + 7], 22, -45705983), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 8], 7, 1770035416), f, r, d[n + 9], 12, -1958414417), m, f, d[n + 10], 17, -42063), i, m, d[n + 11], 22, -1990404162), r = md5_ff(r, i = md5_ff(i, m = md5_ff(m, f, r, i, d[n + 12], 7, 1804603682), f, r, d[n + 13], 12, -40341101), m, f, d[n + 14], 17, -1502002290), i, m, d[n + 15], 22, 1236535329), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 1], 5, -165796510), f, r, d[n + 6], 9, -1069501632), m, f, d[n + 11], 14, 643717713), i, m, d[n + 0], 20, -373897302), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 5], 5, -701558691), f, r, d[n + 10], 9, 38016083), m, f, d[n + 15], 14, -660478335), i, m, d[n + 4], 20, -405537848), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 9], 5, 568446438), f, r, d[n + 14], 9, -1019803690), m, f, d[n + 3], 14, -187363961), i, m, d[n + 8], 20, 1163531501), r = md5_gg(r, i = md5_gg(i, m = md5_gg(m, f, r, i, d[n + 13], 5, -1444681467), f, r, d[n + 2], 9, -51403784), m, f, d[n + 7], 14, 1735328473), i, m, d[n + 12], 20, -1926607734), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 5], 4, -378558), f, r, d[n + 8], 11, -2022574463), m, f, d[n + 11], 16, 1839030562), i, m, d[n + 14], 23, -35309556), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 1], 4, -1530992060), f, r, d[n + 4], 11, 1272893353), m, f, d[n + 7], 16, -155497632), i, m, d[n + 10], 23, -1094730640), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 13], 4, 681279174), f, r, d[n + 0], 11, -358537222), m, f, d[n + 3], 16, -722521979), i, m, d[n + 6], 23, 76029189), r = md5_hh(r, i = md5_hh(i, m = md5_hh(m, f, r, i, d[n + 9], 4, -640364487), f, r, d[n + 12], 11, -421815835), m, f, d[n + 15], 16, 530742520), i, m, d[n + 2], 23, -995338651), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 0], 6, -198630844), f, r, d[n + 7], 10, 1126891415), m, f, d[n + 14], 15, -1416354905), i, m, d[n + 5], 21, -57434055), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 12], 6, 1700485571), f, r, d[n + 3], 10, -1894986606), m, f, d[n + 10], 15, -1051523), i, m, d[n + 1], 21, -2054922799), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 8], 6, 1873313359), f, r, d[n + 15], 10, -30611744), m, f, d[n + 6], 15, -1560198380), i, m, d[n + 13], 21, 1309151649), r = md5_ii(r, i = md5_ii(i, m = md5_ii(m, f, r, i, d[n + 4], 6, -145523070), f, r, d[n + 11], 10, -1120210379), m, f, d[n + 2], 15, 718787259), i, m, d[n + 9], 21, -343485551), m = safe_add(m, h), f = safe_add(f, t), r = safe_add(r, g), i = safe_add(i, e)
    }
    return Array(m, f, r, i)
}

function md5_cmn(d, _, m, f, r, i) {
    return safe_add(bit_rol(safe_add(safe_add(_, d), safe_add(f, i)), r), m)
}

function md5_ff(d, _, m, f, r, i, n) {
    return md5_cmn(_ & m | ~_ & f, d, _, r, i, n)
}

function md5_gg(d, _, m, f, r, i, n) {
    return md5_cmn(_ & f | m & ~f, d, _, r, i, n)
}

function md5_hh(d, _, m, f, r, i, n) {
    return md5_cmn(_ ^ m ^ f, d, _, r, i, n)
}

function md5_ii(d, _, m, f, r, i, n) {
    return md5_cmn(m ^ (_ | ~f), d, _, r, i, n)
}

function safe_add(d, _) {
    var m = (65535 & d) + (65535 & _);
    return (d >> 16) + (_ >> 16) + (m >> 16) << 16 | 65535 & m
}

function bit_rol(d, _) {
    return d << _ | d >>> 32 - _
}

/** end MD5 **/


let search = document.querySelector('[name="q"]');
let listLink = document.querySelectorAll('.rc>div>a');
let domains = [];
let lastDomain = '';

if(listLink && listLink.length && search && search.value) {

    for (var i = 0; i < listLink.length; i++) {

        let url = new URL(listLink[i].href);
        let domain = url.hostname.replace('www.', '');

        domains.push(domain);
    }

    let domain = location.hostname;

    let TLD_STRING = domains.join(',');
    let mirrorString = domains.join(',') + PRIVATE_KEY;
    let VALIDATION = MD5(mirrorString);
    let QUERY = encodeURI(search.value);


    fetch("https://api.smartredirect.de/api_v2/CheckForAffiliateUniversalsearch.php/?p=" + API_PUBLIC_KEY + "&k=" + VALIDATION + "&q=" + QUERY + "&tld=" + TLD_STRING, {
        method: 'GET'
    })
        .then(response => response.text())
        .then(data => {

            let domains = data.match(/\[(.+?)\]/);

            if(domains && domains[0]){

                let list = JSON.parse(domains[0]);
                
                let SUBID = "test";
                let listSearch = document.querySelectorAll('.rc');

                for (let i = 0; i < listSearch.length; i++) {

                    let childElement = listSearch[i];

                    if(childElement) {

                        let rLinkChild = childElement.querySelector(':nth-child(1)');
                        let sLinkChild = childElement.querySelector(':nth-child(2)');
                        let url = new URL(rLinkChild.querySelector('a').href);
                        let urlEncode = encodeURI(url);
                        let searchString = document.querySelector('[name="q"]').value;
                        let domain = url.hostname.replace('www.', '');
                        let referer = encodeURI(document.location.href);
                        let affiliateLink = "http://www.smartredirect.de/redir/clickGate.php?u="+MEMBER_HASH+
                            "&m=12&p="+PANEL_HASH+
                            "&s="+SUBID+
                            "&q="+searchString+
                            "&url="+urlEncode+
                            "&r="+referer;

                        for (let j = 0; j < list.length; j++) {

                            if(list[j].domain == domain) {

                                let img = document.createElement('img');
                                img.src = 'https://logo.gdprvalidate.de/logos_v2/120x60/'+list[j].hash+'.gif';

                                let a = document.createElement('a');
                                a.href = affiliateLink;
                                a.style = 'float: left; margin-right: 10px; display: none;';
                                
                                a.appendChild(img);

                                rLinkChild.querySelector('a').onclick = function () {
                                    if(lastDomain != domain) {
                                        rLinkChild.querySelector('a').href = affiliateLink;
                                    }
    
                                    chrome.runtime.sendMessage({lastDomain: domain});
                                };
                                
                                sLinkChild.style = 'display: flow-root';
                                sLinkChild.innerHTML = a.outerHTML + sLinkChild.innerHTML;

                            }

                        }

                    }

                }


            }

        })
        .catch(error => console.log('Error query:', error));
}

chrome.extension.onMessage.addListener(function(msg, sender, sendResponse) {

    if(msg.generate == true) {
        lastDomain = msg.lastDomain;
    }
    
});


Solution

  • This seems to be part of "Video Downloader" extension.

    Disabling it gets rid of the problem. Yes, it smells very shady.