Javascript устаревший кошмар - пытаясь разобраться в каком-то сжатом javscript - PullRequest
2 голосов
/ 08 февраля 2020

Случайно, ребята, но у меня есть несчастье забрать и старый унаследованный проект для процесса организации очередей наших систем, и сейчас я пытаюсь собрать все его части без документации - да, я сказал, что НЕТ ДОКУМЕНТАЦИИ!

Одна часть, с которой я действительно борюсь, это очень уродливый кусок javascript - я вижу, что это интервал, который продолжает отправлять форму с интервалом каждые 400 мс, но это все безумие в середине, я нахожусь пытаясь разобраться.

(function(){
var a = function() {try{return !!window.addEventListener} catch(e) {return !1} },
b = function(b, c) {a() ? document.addEventListener("DOMContentLoaded", b, c) : document.attachEvent("onreadystatechange", b)};
b(function(){
  var a = document.getElementById('cf-content');a.style.display = 'block';
  setTimeout(function(){
    var s,t,o,p,b,r,e,a,k,i,n,g,f, OBQXEnQ={"GMuEaNBC":+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(+[])+(!+[]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))};
    g = String.fromCharCode;
    o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    e = function(s) {
      s += "==".slice(2 - (s.length & 3));
      var bm, r = "", r1, r2, i = 0;
      for (; i < s.length;) {
          bm = o.indexOf(s.charAt(i++)) << 18 | o.indexOf(s.charAt(i++)) << 12
                  | (r1 = o.indexOf(s.charAt(i++))) << 6 | (r2 = o.indexOf(s.charAt(i++)));
          r += r1 === 64 ? g(bm >> 16 & 255)
                  : r2 === 64 ? g(bm >> 16 & 255, bm >> 8 & 255)
                  : g(bm >> 16 & 255, bm >> 8 & 255, bm & 255);
      }
      return r;
    };
    t = document.createElement('div');
    t.innerHTML="<a href='/'>x</a>";
    t = t.firstChild.href;r = t.match(/https?:\/\//)[0];
    t = t.substr(r.length); t = t.substr(0,t.length-1); 
    a = document.getElementById('jschl-answer');
    f = document.getElementById('challenge-form');
    ;OBQXEnQ.GMuEaNBC+=+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(+!![]))/+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));OBQXEnQ.GMuEaNBC-=+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((+!![]+[])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));OBQXEnQ.GMuEaNBC+=+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]));OBQXEnQ.GMuEaNBC+=+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))/+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]));a.value = (+OBQXEnQ.GMuEaNBC + t.length).toFixed(10); '; 121'
    f.action += location.hash;
    f.submit();
  }, 4000);
}, false);
})();

Вот разметка

  <form id="challenge-form" action="/Queue.aspx?__cf_chl_jschl_tk__=5f04d92efb1edb011edabc24cda3a235e06eb8ba-1581158560-0-AW-KwafTO7e0NxbCGPpzLlWrAU7w5hIso3jE7mgZFhCOvFb1g3xqglnwGhj6WL-2y_ECUZbobHbvPBykf59dve4xLS5aozksjkZkH12e8LOF1svbylQRNURkKmiILeAOhzeKXmzSH4ipu1OhgrKsjNfLgvcXIWz4a24GCSxxjNZKnLmsKLI3pPcN6SxeZASqynHvvZVf1n6Xa297FqIEu2a44P0_ztTkpIJodgatQyaXHrI4zYudSNdD_OGEmgCpyhuyHLjx8un4ILE2lcKwecKmWx2UZlzttaeQgsqJP3vd" method="POST" enctype="application/x-www-form-urlencoded">
<input type="hidden" name="r" value="10a1cf729542cb5335935dbd86df47dfd6e6c413-1581158560-0-AbUplhHDvPuYV2B2BYVsWPZBU73o1fTlVXNJ/9uyPNG3D37ODbaeVdeHe5X51WlC6rAwkqXWDPrLJUyVCBDMU+rvLP38yZycbr3c95pZiUAa1NGWDB8ebbDB2Rcyanw5UKxYCgSCMGtxNlypoWJprK4p2RNjI5fG/9r+7nY7es28+MQC2morY38wCjTpKbY0SREp2iCToPB0uq8nlQwkHTK8jjuNYK4ZK+zYKVffgT+U6s62z8sglX1YA83iSzCWgM3piWdTvtz6TKddEuHMmY6RsOcaog8DuuO5+RqT0Re9qaGUO9x/pCf6N4ho5Ms1byBnPYtzD1gnnlfKjtD29FEGcsz1U1x4aRe8D6SqvzTb/IEudytoLLWpL4Q9oSKv4t8DdwZs6I5w5LMBcltUOjm69ptN+qFg/m+0hzFzHXAOaLcu1UZU725QQofIPQw21ofFsDihHXYHiuSEZq1jZMAcOKtaq8pY4fyzxyccV6qvfz4p1U3RuWnplKt6OP33dquly4DlJOamOuAnrPz3oWOQLJ5tDz95mg8GdbzvX088pe1nh9dp1YTDup82zIv3Gebme2/pzPCKjcCxBOOJHEK1H0i5qZoNi6WROohbvPc0kGwxyJWsGD1sXY2QpAfw0Mt2IXujShOOtD94JY4Yc7cLx4H4YPbqKh+ouwf9FRWH6dWTz6hnIMmNtbduNrgDxfl0rlWSyyeIOzty9HXg4+K9mvw4E5irwxdXJ2mDfHsqbbiGvGlwkcq1bAioSGYh3sL3fqenRkVEdJIGKE29wg93v7ZgeD+lIaFmF6Zy0nv1MSY8KVkZrERoFSGlJJgbTG3rkHagIKa72rs4h0d07wkJNIqkKwrJtS8txO+KVpyalCbVrqhb1yocmaFysoV5P1IFPTNrzocZelCkqMMq4Mquxq0TpIwEWvxfMN6JwXuM+7hrp7rD7hJzCDqJUiitA3TIUybw6FSie/Bwdq3fPHhnwg8dpVn372hcK/l9UPcyR+b+TReMy6HxO+/qPiNiYpQ/vuYjTs5efIeJ4hULJl2JRNV6LkPAf2Ees4KvBBVp2FjBubxjYmfORygZIjCQUCP2WcgXD34zy4w8kwngxsKiQ8UhHsiehvAl//5J1tA5H6Me9RuReJ8kWmelnFP+mrV4RnMpjmFifmRY9pwYQb1AIkl7VGsi5eR6Vmeq2Bb/iRhyFxIIpxzHJV9GF/rrO37/vjlTFxNUQ72CTS38jtUBaQivCFx2+qb/kfI5nW4DP3LOTUz9D/zJGmWYHKkz3G2jX/UWDWm2CzbtfsLLfzercuWl3hPqkdwqg/QZz9G05Qayf+jKCC+mWYuSNL8MHXxZereb6jPMyAu8n9jtVjXAxgtGGZMuIqXK+HOCMMMfQL4zxuUBe4Z6lJ45XiL0Hn0fX9JPY5ahi0zzX7ZSLSL3E2iiDcHbFxvByBYNNh1uTaxKoJyxVCrYZFBbpUkriI01N5u//u3nc5RYcgTsbsuC/31cDqmTO0KNkbN0/BYN9gG0qP4q2Hf0CaIGgw/Ip7QwzmF491opP8iIysH8kEp4rMSjeL6XIVLjhGN9dXfWcklq9G9A0iaIj2b2O1ra0y6nCauN+8DTWPRbz4pmDUryfDkG35/kk8wzqG5Yp5+TTeX9+4MJGMm5wz5fa3K8vi7sn4wdneroVB2TIb6evQZ//eSWFgEw67MFOW86+ROj"></input>
<input type="hidden" name="jschl_vc" value="d308f58453fdc399f02de1819459f64d"/>
<input type="hidden" name="pass" value="1581158564.634-jWe4nK3hOC"/>
<input type="hidden" id="jschl-answer" name="jschl_answer"/>

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Давайте посмотрим, как мы можем разобраться в этом коде, topi c by topi c.

Выражения в скобках.

Они могут потенциально вызывать функции, поэтому давайте точно увидеть, что они делают. Они всегда появляются как числитель или знаменатель в одном делении. Итак, я перечислю здесь все используемые числители / знаменатели:

+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(+[])+(!+[]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((+!![]+[])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+!![])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(!+[]+!![]+!![]+!![])+(+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]))
+((!+[]+!![]+!![]+!![]+[])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]+!![]+!![])+(+[])+(+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![])+(!+[]+!![]+!![]+!![]))

Эти выражения работают только с несколькими различными компонентами:

!![]
!+[]
(+[])
[]

!![] и !+[] оценивают до true и так как все они появляются как операнды сложения или унарного плюса, они приводятся к 1. Замена этого дает:

+((1+1+1+1+1+1+1+[])+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(+[])+(+[])+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+1+[])+(+[])+(1+1+1+1)+(+[])+(1+1+1+1)+(+[])+(1+1+1+1+1+1)+(+[])+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+[])+(1+1+1)+(1+1+1+1+1+1+1+1)+(+[])+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(+1))
+((1+1+1+1+1+1+1+1+1+[])+(1+1+1+1)+(1+1)+(1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1)+(1+1)+(1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+[])+(1+1+1)+(1+1+1+1+1+1+1+1)+(+[])+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((+1+[])+(1+1)+(1+1+1+1+1+1+1)+(+1)+(1+1+1+1+1+1+1+1+1)+(+1)+(+[])+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+[])+(1+1+1)+(1+1+1+1+1+1+1+1)+(+[])+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+[])+(1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1))
+((1+1+1+1+1+1+1+[])+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(+[])+(+[])+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+[])+(1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1)+(+[])+(+[])+(1+1+1+1+1+1+1)+(1+1+1+1))

Компоненты (+[]) оцениваются в 0, а оставшиеся +[] запускают конкатенацию строк, что соответствует +"". Результат:

+((1+1+1+1+1+1+1+"")+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+0+0+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+1+"")+0+(1+1+1+1)+0+(1+1+1+1)+0+(1+1+1+1+1+1)+0+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+"")+(1+1+1)+(1+1+1+1+1+1+1+1)+0+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(+1))
+((1+1+1+1+1+1+1+1+1+"")+(1+1+1+1)+(1+1)+(1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1)+(1+1)+(1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+"")+(1+1+1)+(1+1+1+1+1+1+1+1)+0+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((+1+"")+(1+1)+(1+1+1+1+1+1+1)+(+1)+(1+1+1+1+1+1+1+1+1)+(+1)+0+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1+1))
+((1+1+1+1+1+1+1+1+"")+(1+1+1)+(1+1+1+1+1+1+1+1)+0+(1+1+1+1)+(+1)+(1+1+1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+1+1+"")+(1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1+1)+(1+1+1+1+1+1+1+1)+(1+1+1+1+1))
+((1+1+1+1+1+1+1+"")+(1+1+1+1+1+1+1+1+1)+(1+1+1+1+1+1+1)+0+0+(1+1+1)+(1+1+1+1)+(1+1+1)+(1+1+1+1+1+1+1))
+((1+1+1+1+"")+(1+1+1+1)+(1+1+1+1)+(1+1+1+1+1+1)+(1+1+1+1+1+1)+0+0+(1+1+1+1+1+1+1)+(1+1+1+1))

Теперь мы можем вычислить и заменить эти 1 + 1 + ... + 1 на то, что они оценивают (пока не работайте с круглыми скобками):

+((7+"")+(9)+(7)+0+0+(3)+(4)+(3)+(7))
+((9+"")+0+(4)+0+(4)+0+(6)+0+(9))
+((8+"")+(3)+(8)+0+(4)+(+1)+(6)+(4)+(+1))
+((9+"")+(4)+(2)+(3)+(8)+(7)+(5)+(2)+(8))
+((8+"")+(3)+(8)+0+(4)+(+1)+(6)+(4)+(7))
+((+1+"")+(2)+(7)+(+1)+(9)+(+1)+0+(9)+(9))
+((8+"")+(3)+(8)+0+(4)+(+1)+(6)+(4)+(7))
+((6+"")+(2)+(6)+(7)+(8)+(6)+(7)+(8)+(5))
+((7+"")+(9)+(7)+0+0+(3)+(4)+(3)+(7))
+((4+"")+(4)+(4)+(6)+(6)+0+0+(7)+(4))

Остальные, внутренние унарные операторы плюс, в (+1, могут быть удалены, и все, кроме внешних скобок, также могут быть удалены:

+(7+""+9+7+0+0+3+4+3+7)
+(9+""+0+4+0+4+0+6+0+9)
+(8+""+3+8+0+4+1+6+4+1)
+(9+""+4+2+3+8+7+5+2+8)
+(8+""+3+8+0+4+1+6+4+7)
+(1+""+2+7+1+9+1+0+9+9)
+(8+""+3+8+0+4+1+6+4+7)
+(6+""+2+6+7+8+6+7+8+5)
+(7+""+9+7+0+0+3+4+3+7)
+(4+""+4+4+6+6+0+0+7+4)

Все внутренние операторы плюс теперь являются конкатенациями строк, так что оценивает:

+("797003437")
+("904040609")
+("838041641")
+("942387528")
+("838041647")
+("127191099")
+("838041647")
+("626786785")
+("797003437")
+("444660074")

Оставшийся унарный оператор выполняет окончательную оценку:

797003437
904040609
838041641
942387528
838041647
127191099
838041647
626786785
797003437
444660074

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

Значение OBQXEnQ.GMuEaNBC

С приведенными выше выражениями, приведенными к их числовым значениям, мы получим следующее:

var OBQXEnQ = {
    "GMuEaNBC": 797003437 / 904040609;
};
OBQXEnQ.GMuEaNBC += 838041641 / 942387528;
OBQXEnQ.GMuEaNBC -= 838041647 / 127191099;
OBQXEnQ.GMuEaNBC += 838041647 / 626786785;
OBQXEnQ.GMuEaNBC += 797003437 / 444660074;

... так что это можно упростить до:

var OBQXEnQ.GMuEaNBC = 797003437 / 904040609 + 838041641 / 942387528 - 838041647 / 127191099 + 838041647 / 626786785 + 797003437 / 444660074;

... что составляет:

var OBQXEnQ.GMuEaNBC = -1.6885301087751048;

Переменные s,t,o,p,b,r,e,a,k,i,n,g

Мы игнорируем подсказку: -)

Теперь, когда мы расшифровали обфуск Из выражений становится ясно, что e никогда не вызывается. Таким образом, мы можем удалить эту функцию из кода.

Переменные o и g использовались только в e, поэтому их также можно удалить из кода.

Of переменные s,t,o,p,b,r,e,a,k,i,n,g, нам нужно только сохранить (на данный момент) t, r и a. Другие не используются.

Свободное выражение '; 121' также не играет роли.

Значение t.length

В коде есть эта часть:

t = document.createElement('div');
t.innerHTML="<a href='/'>x</a>";
t = t.firstChild.href;
r = t.match(/https?:\/\//)[0];
t = t.substr(r.length); 
t = t.substr(0,t.length-1); 

Это сложный способ сделать t = location.host. Единственное использование t - это length в более позднем выражении.

То есть t.length становится location.host.length. Но ясно, что это зависит от того, где этот javascript работает. В комментариях ниже вы упоминаете веб-адрес этой страницы, и поэтому t оценивается как "queue-tickets.liverpoolf c .com", и, таким образом, t.length равно 29.

При таком упрощении мы больше не нужны переменные t и r.

Значение, присвоенное a.value

Мы сократили присвоение до a.value до:

a.value = (-1.6885301087751048 + location.host.length).toFixed(10);

Как указано выше location.host.length это 29 в вашем случае. Следовательно, вышесказанное эквивалентно:

a.value = "27.3114698912";

функциям для прослушивания события DOMContentLoaded

Две функции a и b предназначены для выполнения кода, когда документ загружен, с обратной совместимостью до IE9.

Переменная параметра c получает значение false при фактическом вызове b, но это значение по умолчанию для addEventListener; мы можем опустить это.

Таким образом, игнорируя проблему совместимости IE8, вызов b эквивалентен:

document.addEventListener("DOMContentLoaded", callback);

Таким образом, мы можем также пропустить определение этих двух функций. И поскольку это были единственные переменные, определенные непосредственно во внешней области действия IIFE, мы можем также исключить этот IIFE.

Результат:

Вышеуказанные сокращения приводят к следующему коду:

document.addEventListener("DOMContentLoaded", function () {
    document.getElementById('cf-content').style.display = 'block';
    setTimeout(function () {
        document.getElementById('jschl-answer').value = "27.3114698912";
        var f = document.getElementById('challenge-form');
        f.action += location.hash;
        f.submit();
    }, 4000);
});

Клиент / Сервер

Этот код клиента отправляет форму на страницу сервера Queue.aspx. Он передает информацию через URL и через полезную нагрузку POST.

URL содержит два бита информации:

  • __cf_chl_jschl_tk__=: жестко закодированное значение
  • #: так называемый "ха sh", который является просто повторением того, что было в текущем URL ха sh (после символа #).

Полезная нагрузка POST имеет следующее значение:

  • r=: значение с жестким кодом
  • jschl_vc=: значение с жестким кодом
  • pass=: значение с жестким кодом
  • jschl-answer=: значение, которое предоставляет код JavaScript, т. Е. "27.3114698912" при запуске на вашем действующем сайте.

Этот HTTP-запрос отправлен на Queue.aspx Через 4 секунды после загрузки текущей страницы.

Поскольку ваш вопрос не содержит информации о том, что Queue.aspx делает с этой информацией, мой анализ на этом заканчивается.

Если вы контролируете Queue.aspx, тогда весь этот анализ на самом деле не имеет никакого значения, так как вы могли бы просто поместить некоторые записи в код ASP (. NET) Queue.aspx и увидеть:

  • что именно в Переменная POST jschl-answer, которую отправляет клиент, и
  • что отправляется обратно клиенту: какое перенаправление URL (если есть) и какое tent.

Приложение

При самостоятельном использовании живого URL-адреса я отмечаю, что он записывает код повара ie, поэтому при следующем посещении этого же URL-адреса перенаправление будет незамедлительной.

Первая 4-секундная задержка (с setTimeout), по-видимому, служит только защитой от массовых атак на веб-сайт (DOS-атаки). Однако это очень простая мера, и ее легко можно обойти.

2 голосов
/ 08 февраля 2020
const g = String.fromCharCode;
const o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
const e = function(s) {
    s += "==".slice(2 - (s.length & 3));
    var bm, r = "", r1, r2, i = 0;
    for (; i < s.length;) {
        bm = o.indexOf(s.charAt(i++)) << 18 | o.indexOf(s.charAt(i++)) << 12
                | (r1 = o.indexOf(s.charAt(i++))) << 6 | (r2 = o.indexOf(s.charAt(i++)));
        r += r1 === 64 ? g(bm >> 16 & 255)
                : r2 === 64 ? g(bm >> 16 & 255, bm >> 8 & 255)
                : g(bm >> 16 & 255, bm >> 8 & 255, bm & 255);
    }
    return r;
};

вы можете сказать, что это как-то связано с base64, особенно если заданы все допустимые символы в строках с кодировкой base64 и принудительное заполнение (==) в зависимости от длины ввода.

эффективно, просто декодирование base64:

const g = String.fromCharCode;
const o = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
const e = function(s) {
    s += "==".slice(2 - (s.length & 3));
    var bm, r = "", r1, r2, i = 0;
    for (; i < s.length;) {
        bm = o.indexOf(s.charAt(i++)) << 18 | o.indexOf(s.charAt(i++)) << 12
                | (r1 = o.indexOf(s.charAt(i++))) << 6 | (r2 = o.indexOf(s.charAt(i++)));
        r += r1 === 64 ? g(bm >> 16 & 255)
                : r2 === 64 ? g(bm >> 16 & 255, bm >> 8 & 255)
                : g(bm >> 16 & 255, bm >> 8 & 255, bm & 255);
    }
    return r;
};

const input = 'some input';
const base64 = window.btoa(input); // Buffer.from(input).toString('base64');

console.log(e(input))
console.log(base64)
console.log(e(base64))

Это не создает интервал, а один тайм-аут 400 мс. Вероятно, чтобы "гарантировать", что весь дом загружен. Я предлагаю вам пропустить эту реализацию и написать свою собственную в соответствии с требованиями вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...