Ну, у меня 2 новости, хорошая и плохая:
Хорошая: я разобрался в их коде и как они шифруют все это
Плохая:
написал это на питоне и не буду переписывать после
Пример:
Python
def _ph_dec(g, r, k):
from base64 import b64decode
decode_base64 = b64decode(g).decode('utf-8')
import re
g = re.sub(r'%([a-fA-F0-9]{2})', lambda m: chr(int(m.group(1), 16)), decode_base64)
n = len(r)
d = len(g)
c = ''
f = 0
while f < d:
q = g[f: f + 1]
p = r[f % n: f % n + 1]
if k == 1:
q = ord(q[0]) - ord(p[0])
else:
if k == 2:
q = ord(q[0]) - ord(p[0]) + 14
else:
q = ord(q[0]) ^ ord(p[0])
c = c + chr(q)
f += 1
return c
def gpzd(data, key):
key = int(key)
key = key * 6 - 47289 + 517
return _ph_dec(data, str(key), 2)
def get_phone(cmd):
cmd = cmd.split('\t')
for i in cmd:
data = i.split('|')
b = gpzd(data[1], data[2])
phone = _ph_dec(b, 'K0dbVwzGrpLa-wRs2', 2)
print(phone)
print()
cmd = '1|JTg0JTkxbyU5NnVqJTdDJThGc2drWnR6JTkxWA==|22481814 2|JTg1JTk3cCU5NHZscyU5NHloeVlyJTdCJTk0aXIlN0UlOEUlNjAlODQlOTElN0MlNUR1aWclNjA=|31950540 3|JTg1JTk0cCU5NnVmJTg0JTk2dWhuJTVCdHolOEQlNjA=|44314626'
get_phone(cmd)
cmd = '1|JTg3JTkyJTdDJTk2dmZxJTk2c2hwWHQlN0IlOEVmdHglOEUlNUIlODQlN0QlN0NXciVBMWElNjA=|23649509 2|JThBJTk1JTdEJTk0dGtvJTk3cWx3WnJ6bCU5QnV2JTkyJTVFJTg2a3olNUN0bF9k|95446977 3|JTg1JTkybyU5N3pvJTgzJTkycWhsWnUlN0YlOTZf|40841102'
get_phone(cmd)
Консоль:
-00-00
11-822-14
-00-00
94-711-03
54-829-39
-00-00
А теперь как так вышло:
Самое интересное на сайте находится по ссылке:
https://i.doska.ru/w_inc/js/main.mobile.ru.doska.js?v=400 (или
https://i.doska.ru/w_inc/js/main.ru.doska.js?v=400)
Там куча обфусцированного кода (ссылка на читаемый код
https://pastebin.com/0HAYPHzT)
Для обработки строк вида "JTg3JTkyJTdDJTk2dmZxJTk2c2hwWHQlN0IlOEVmdHglOEUlNUIlODQlN0QlN0NXciVBMWElNjA=|23649509" вам нужно будет найти там функцию
gpzd, но эта функция спрятана в этом куске кода:
Javascript
eval(function (n, b, r, f, g, q) {
g = function (d) {
return d.toString(36)
};
if (!''.replace(/^/, String)) {
while (r--) {
q[r.toString(b)] = f[r] || r.toString(b)
}
f = [
function (c) {
return q[c]
}
];
g = function () {
return '\\w+'
};
r = 1
}
while (r--) {
if (f[r]) {
n = n.replace(new RegExp('\\b' + g(r) + '\\b', 'g'), f[r])
}
}
return n
}('4 7(1,0){0=0*6-3+5;9 8(1,b a(0),2)}', 12, 12, 'key|data||47289|function|517||gpzd|_ph_dec|return|String|new'.split('|'), 0, {
}));
Я понял что тут ее спрятали и пытался понять что же здесь творится, в итоге открыл инспектора браузера и выполнил в консоли эту функцию, добавив перед "return n" команду "console.log(n)" и получил строку "function gpzd(data,key){key=key*6-47289+517;return _ph_dec(data,new String(key),2)}"
После в том же файле нашел функцию _ph_dec и переписал ее
В моем варианте код внутри функции get_phone это в js функция_send_phone_ajax, в которой было:
Javascript
cmd = b.responseText;
if (cmd) {
cmd = cmd.split('\t');
if (cmd[0] == 'w' && cmd[1]) {
_alert(JS_GLOBAL_DATA['w' + cmd[1]]);
return
} else {
if (cmd[0] == 'phone_code') {
show_phone_code_form(0, cmd[1]);
return
} else {
if (cmd[0] == 'show_phone_code_form') {
show_phone_code_form(1, cmd[1])
}
}
}
for (i in cmd) {
data = cmd[i].split('|');
print_phone(gpzd(data[1], data[2]), data[0], MOBILE)
}
_show_phone(2)
}
Видно знакомые split'ы?
После нашел функцию print_phone:
Javascript
function print_phone(c, g) {
var f;
if (!c || !(f = el('ph_td_' + g))) {
return
}
var d = p2 = _js_decode(c);
if (MOBILE) {
var b = el('ptd2_' + g);
if (b) {
b = b.innerHTML;
b = b.split('>');
b = b[1];
b = b.split('<');
b = b[0];
b = b.replace('(', '');
b = b.replace(')', '');
p2 = d.replace('-', '');
p2 = p2.replace('-', '');
p2 = p2.replace('-', '');
p2 = b + '' + p2
}
f.innerHTML = '<a href="tel:' + p2 + '">' + d + '</a>'
} else {
f.innerHTML = d
}
f.style.visibility = 'visible'
}
В ней больше всего заинтересовала функция _js_decode, кст, второй параметр print_phone это числа от 1, 2, 3 в тех закодированных кусках
Javascript
function _js_decode(b) {
return _ph_dec(b, 'K0dbVwzGrpLa-wRs2', 2)
}
Кст, если заинтересовало как после расшифровки того куска текста и получении 3 телефонов скрипт узнает какой номер заполнить.
Когда внутри _send_phone_ajax скрипт получает команды, прогоняет их через gpzd и начинает вызывать print_phone, то в print_phone передаются номера, которое в el('ph_td_' + g) используются для поиска элементов с id=ph_td_1, id=ph_td_2, id=ph_td_2. И если какой-то из элементов нашелся, то в него через f.innerHTML прописывается номер.
Еще заметил что для объявлений с одним телефоном почему-то обычно вторая команда имеет номер телефона, а также что на странице элементы с номером имеют следующее отношение:
#ph_td_1 -> "Телефон"
#ph_td_2 -> "Тел. моб."
А т.к. обычно указывают номер в "Тел. моб.", то и получаются команды вида ["-00-00", "11-822-14", "-00-00"]
Немного сумбурно написал, т.к. после работы сразу засел за это и порядком устал и заколебался
doska.ru хорошо защитили номера, во-первых, запутали их очень хорошо, во вторых нужно капчу отправить чтобы их получить
Если будут вопросы, задавайте, только не просите код за вас написать