Обход "Honeypots" при соскабливании - PullRequest
0 голосов
/ 19 мая 2019

Я пытался извлечь некоторые данные с веб-страницы, и он использует некоторые специфические методы обнаружения ботов, которые мне нужно обойти. Сначала я должен был обойти раздражающий CAPTCHA, но теперь возникла другая проблема.

На веб-странице используется (как кажется) генератор случайных ссылок для предоставления мне нужных мне данных. В браузере видна только одна кнопка, но, просматривая источник, я вижу несколько случайно сгенерированных кнопок в одной и той же области, например:

...
<div id='BA405352A9' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=A230134'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='075A1762B3' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=7294A7B'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='453A2A0469' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=9646432'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='302B375583' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=933A29B'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='08171153B4' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=3447182'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='20813B7B10' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=6B96496'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='6661917AB6' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=9AA8604'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div><div id='1646980B02' style='display:none;'><button type="button" value="Upgrade level" class="build" onclick="window.location.href = 'dorf2.php?a=20&c=5841731'; return false;">
<div class="button-container"><div class="button-position"><div class="btl"><div class="btr"><div class="btc"></div></div></div>
<div class="bml"><div class="bmr"><div class="bmc"></div></div></div><div class="bbl"><div class="bbr"><div class="bbc"></div></div></div>
</div><div class="button-contents">Enter</div></div></button></div></div><script language="javascript">
...

По словам источника, первоначальный запрос HTTP GET содержит только невидимые кнопки, и как-то после загрузки CSS "правильная" кнопка становится видимой?

Я не настолько опытен в таких проектах (или в разработке веб-сайтов в целом). Как они работают? И как я могу имитировать поведение браузера, чтобы, надеюсь, обойти их?

1 Ответ

0 голосов
/ 20 мая 2019

Я наконец-то смог получить доступ к данным. Оказывается, тег CSS устанавливался каким-то Javascript при загрузке страницы.Взглянув на сценарии, я обнаружил, что было сгенерировано много данных (вероятно, на стороне сервера), которые мне нужно было извлечь в первую очередь.
После нескольких часов поиска я наконец смог отследить функции, которыми был Javascript.используя для редактирования данных.их было несколько, и сервер рандомизировал порядок их использования для дальнейшего запутывания любых попыток взломать алгоритм:

function showbt(sid) {
            return (dM(aM(bM(fM(gM(cM(sid)))))))
        }

Здесь порядок был сгенерирован случайным образом, и 2 функции были введенывнутри источника веб-страницы и должен был каждый раз заменяться.

Мне удалось полностью перевести Javascript на Python, а также извлечь и обновить функции и порядок их использования, используя re и requestsзатем, используя сгенерированный код Python, наконец взломать шифрование.(Пример перевода:)

var _0x7052 = ["", "\x6C\x65\x6E\x67\x74\x68", "\x73\x75\x62\x73\x74\x72", "\x69\x6E\x64\x65\x78\x4F\x66"];

function aarf(_0xb5a3x2) {
    var _0xb5a3x3 = 0;
    var _0xb5a3x4 = 0;
    var _0xb5a3x5 = _0x7052[0];
    for (i = 0; i < _0xb5a3x2[_0x7052[1]]; i += 1) {
        _0xb5a3x3 = stream[_0x7052[3]](_0xb5a3x2[_0x7052[2]](i, 1));
        _0xb5a3x3 = _0xb5a3x3 * _0xb5a3x3 + 6 * _0xb5a3x3 + 6246;
        _0xb5a3x3 = _0xb5a3x3 % stream[_0x7052[1]];
        _0xb5a3x5 += stream[_0x7052[2]](_0xb5a3x3, 1);
    };
    return _0xb5a3x5;
};

переведенный UTF-8 в текст (здесь он использовался для запутывания кода):

var _0x7052 = ["", "length", "substr", "indexOf"];

function aarf(_0xb5a3x2) {
    var _0xb5a3x3 = 0;
    var _0xb5a3x4 = 0;
    var _0xb5a3x5 = _0x7052[0];
    for (i = 0; i < _0xb5a3x2[_0x7052[1]]; i += 1) {
        _0xb5a3x3 = stream[_0x7052[3]](_0xb5a3x2[_0x7052[2]](i, 1));
        _0xb5a3x3 = _0xb5a3x3 * _0xb5a3x3 + 6 * _0xb5a3x3 + 6246;
        _0xb5a3x3 = _0xb5a3x3 % stream[_0x7052[1]];
        _0xb5a3x5 += stream[_0x7052[2]](_0xb5a3x3, 1);
    };
    return _0xb5a3x5;
};

и, наконец, после замены функций массиваиз JS и переписывания в Python мы получаем:

def aarf(_0xb5a3x2) :
    _0xb5a3x3 = 0
    _0xb5a3x4 = 0
    _0xb5a3x5 = ""
    for i in range(0, len(_0xb5a3x2), 1): 
        _0xb5a3x3 = stream.index(_0xb5a3x2[i:i+1])
        _0xb5a3x3 = _0xb5a3x3 * _0xb5a3x3 +6 * _0xb5a3x3 +6246 #REPNUM2
        _0xb5a3x3 = _0xb5a3x3 % len(stream)
        _0xb5a3x5 += stream[math.ceil(_0xb5a3x3):math.ceil(_0xb5a3x3)+1]
    return _0xb5a3x5
#note that the REPNUM comment indicates there are 2 randomly generated numbers in this line, and they'll have to be extracted from the webpage and injected into this code.

Но пока нет ...

Сами кнопки были сгенерированы с веб-страницей, и идентификаторы в них также были зашифрованы,поэтому мне пришлось пройти те же шаги, что и выше, чтобы также расшифровать идентификаторы кнопок.

Тогда все, что осталось, - это сопоставить идентификатор дешифрованной кнопки с выводом дешифрованного кода Javascript и найти правильную кнопку для использования!


Любому, кто хочет сделать что-то подобное, помните, чтоJavascript, используемый для расшифровки правой кнопки, ВСЕГДА включается в веб-страницу каким-либо образом (иначе ваш браузер также не может найти нужную!), поэтому все, что вам нужно сделать, это проанализировать веб-страницу и ее работу очень тщательно, а затем попробоватьперепроектировать его поведение, чтобы использовать шифрование.

Я смог сделать это с небольшим опытом работы с javascript или HTML, поэтому, если я смогу это сделать, то вы тоже можете!Другой обходной путь - использовать Selenium, но он не имеет доли мощности и скорости использования старого доброго requests!

...