Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #29523 > unrolled thread

popaprany JS

Started byRoman Tyczka <noemail@because.no>
First post2017-03-27 19:02 +0200
Last post2017-03-28 16:56 +0200
Articles 8 — 3 participants

Back to article view | Back to pl.comp.programming


Contents

  popaprany JS Roman Tyczka <noemail@because.no> - 2017-03-27 19:02 +0200
    Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-27 20:42 +0200
      Re: popaprany JS Andyy <nie@spamowac.tego> - 2017-03-27 22:39 +0200
        Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-27 22:52 +0200
      Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-28 01:33 +0200
      Re: popaprany JS Roman Tyczka <noemail@because.no> - 2017-03-28 09:58 +0200
        Re: popaprany JS bartekltg <bartekltg@gmail.com> - 2017-03-28 12:04 +0200
          Re: popaprany JS Roman Tyczka <noemail@because.no> - 2017-03-28 16:56 +0200

#29523 — popaprany JS

FromRoman Tyczka <noemail@because.no>
Date2017-03-27 19:02 +0200
Subjectpopaprany JS
Message-ID<j6xj1vxv7su9$.dlg@tyczka.com>
Próbuję przekonwertować kawałek kodu z JS na delphi, ale poziom zakręcenia
mnie przerósł, proszę o pomoc w wyjaśnieniu ludzkim językiem co tu się
dzieje:


function(e, s, i) 
{
 var n, a, o = "",
 l = t.isArray(e),
 r = 0;
 for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
e.charAt(r++));
 return o
}

Jako, że JS ma typowanie między pośladkami to typy wejściowe odgaduje z
szerszego kontekstu, którego tu nie umieszczam by nie mącić, jako:

e - chyba tablica, w każdym razie wynik funkcji z jQuery
this.ui.maskedInput.serializeArray()

s - to string z maską złożoną ze znaków + i *
//  "mask": "+++*+*+***++++++++++++++++++++++"

i - to sól w łanćuchu tekstowym
//  "salt": "rDUrqpBMmlNGJQgk87uKCUGMlK4dU51R",


Całość to kawałek formularza logowania, a konkretnie wyliczania hasha z
hasła.

Proszę szczególnie o rozwikłanie tej pętli, czyli konkretnie tego:

"+" === s.charAt(n) ? o += i.charAt(n) : "*" === s.charAt(n) && (o += l ?
e[r++].value : e.charAt(r++));

To koszmarek jakiś :-)

-- 
pozdrawiam
Roman Tyczka

[toc] | [next] | [standalone]


#29524

Frombartekltg <bartekltg@gmail.com>
Date2017-03-27 20:42 +0200
Message-ID<obbmf2$5ps$1@node1.news.atman.pl>
In reply to#29523
On 27.03.2017 19:02, Roman Tyczka wrote:
>
> Próbuję przekonwertować kawałek kodu z JS na delphi, ale poziom zakręcenia
> mnie przerósł, proszę o pomoc w wyjaśnieniu ludzkim językiem co tu się
> dzieje:
>
>
> function(e, s, i)
> {
>  var n, a, o = "",
>  l = t.isArray(e),
>  r = 0;
>  for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
> i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
> e.charAt(r++));
>  return o
> }
>
> Jako, że JS ma typowanie między pośladkami to typy wejściowe odgaduje z
> szerszego kontekstu, którego tu nie umieszczam by nie mącić, jako:
>
> e - chyba tablica, w każdym razie wynik funkcji z jQuery
> this.ui.maskedInput.serializeArray()
>
> s - to string z maską złożoną ze znaków + i *
> //  "mask": "+++*+*+***++++++++++++++++++++++"
>
> i - to sól w łanćuchu tekstowym
> //  "salt": "rDUrqpBMmlNGJQgk87uKCUGMlK4dU51R",
>
>
> Całość to kawałek formularza logowania, a konkretnie wyliczania hasha z
> hasła.
>
> Proszę szczególnie o rozwikłanie tej pętli, czyli konkretnie tego:
>
> "+" === s.charAt(n) ? o += i.charAt(n) : "*" === s.charAt(n) && (o += l ?
> e[r++].value : e.charAt(r++));
>
> To koszmarek jakiś :-)

Jeśli to dobrze rozumiem, to genialny przykład "chackerstwa" (tak, ch;))



"+" === s.charAt(n) ? o += i.charAt(n)

Na razie prosto. Operator trójargumentowy ?: jak w c++.

Czy n-ta (kto normalny iteruje po n, czyję się zgorszony!:)
literaka s to "+"
(porównujemy ===, bo == jest miękkie :)
https://dorey.github.io/JavaScript-Equality-Table/ )

Jeśli tak, to dodajemy literkę na koniec o,
  o += i.charAt(n)
(nie wynika nic z tego, co jest po :)
jeśli nie, to (co innego, o tym poźniej).

Zawsze używałem ?: w formie
x = b?a:b;
a tu jety użyte po prostu jako if(b) a() : b();
Poza zmyleniem przeciwnika chyba nie ma nic w tym złego:)

Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
wykona się to:

"*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))

Nieco rozszerzając:

"*" === s.charAt(n)
&&
(o += l ? e[r++].value : e.charAt(r++))

Sztuczka polega na tym, że to wyrażenie wylicza
się do boola. Jeśli s[n] to '*', zadziała
leniwa ewaluacja i nawias się nie wykona.
Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
nawiasowanie):

o += ( l ? e[r++].value : e.charAt(r++))

l oznaczało  "e jest tablicą" (od typu 't'?).
tutaj wołaczamy wiec do o to, co ejst pod 'e'
na r-tym miejscu, tylko w zalezności od tego
jakiego typu jest e, różnie się to tej literki
dobieramy. Ot, takie bieda templejty ;-)

Nawet w JS nalezałoby tu raczej zrobić tego ifa
na poczatku lub jakoś inaczej opokować to wyciąganie.


Ostatecznie strzelałbym, że to znaczy(to nie JS:)

if ("+"== s.charAt(n))
	o += i.charAt(n);
else if ('*' ~= a.charAt(n) )
    o+ = (l ? e[r++].value : e.charAt(r++) );


A, drobna uwaga, nie znam JS ;-)


pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#29525

FromAndyy <nie@spamowac.tego>
Date2017-03-27 22:39 +0200
Message-ID<obbt9c$crr$1@node1.news.atman.pl>
In reply to#29524
W dniu 27.03.2017 o 20:42, bartekltg pisze:
> if ("+"== s.charAt(n))

Ja preferuję styl
if (s.charAt(n) == "+")

podobnie "x jest większy od 5", "x równa się 5" a nie "5 mniejsze od x", 
"5 równa się x"

[toc] | [prev] | [next] | [standalone]


#29526

Frombartekltg <bartekltg@gmail.com>
Date2017-03-27 22:52 +0200
Message-ID<obbu24$dnp$1@node1.news.atman.pl>
In reply to#29525
On 27.03.2017 22:39, Andyy wrote:
> W dniu 27.03.2017 o 20:42, bartekltg pisze:
>> if ("+"== s.charAt(n))
>
> Ja preferuję styl
> if (s.charAt(n) == "+")

Ja też:)


> podobnie "x jest większy od 5", "x równa się 5" a nie "5 mniejsze od x",
> "5 równa się x"

Wertsja odwrotna jest mniej czytelna, ale automatycznie wyłapuje
zamianę == na =.
W C czy c++ ma to jakiś sens. Dlaczego użył tego w JS, gdzie
można by sie spodziewać pomyłki pomiędzy === a == ("słabsze"
porównanie), której to ta zamiana nie wychwyci, cięzko powiedzieć ;-)

pzdr
bartekltg




[toc] | [prev] | [next] | [standalone]


#29527

Frombartekltg <bartekltg@gmail.com>
Date2017-03-28 01:33 +0200
Message-ID<obc7h2$naj$1@node1.news.atman.pl>
In reply to#29524
On 27.03.2017 20:42, bartekltg wrote:

> Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
> wykona się to:
>
> "*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))
>
> Nieco rozszerzając:
>
> "*" === s.charAt(n)
> &&
> (o += l ? e[r++].value : e.charAt(r++))
>
> Sztuczka polega na tym, że to wyrażenie wylicza
> się do boola. Jeśli s[n] to '*', zadziała
> leniwa ewaluacja i nawias się nie wykona.


Wyciagnę samą sztuczkę, bo piękna ;-)

r=0;
for (n = 0, a = s.length; n < a; n += 1)
    "+" === s[n] ? o += i.[n]   :  "*" === s[n] && o += e[r++];


pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#29528

FromRoman Tyczka <noemail@because.no>
Date2017-03-28 09:58 +0200
Message-ID<1wyqjrjy0hoxc$.dlg@tyczka.com>
In reply to#29524
On Mon, 27 Mar 2017 20:42:41 +0200, bartekltg wrote:

>> function(e, s, i)
>> {
>>  var n, a, o = "",
>>  l = t.isArray(e),
>>  r = 0;
>>  for (n = 0, a = s.length; n < a; n += 1) "+" === s.charAt(n) ? o +=
>> i.charAt(n) : "*" === s.charAt(n) && (o += l ? e[r++].value :
>> e.charAt(r++));
>>  return o
>> }

> Jeśli to dobrze rozumiem, to genialny przykład "chackerstwa" (tak, ch;))
 
Być może to wynik pracy jakiegoś obfuscatora, udany wynik jak widać.
 
> "+" === s.charAt(n) ? o += i.charAt(n)
> 
> Na razie prosto. Operator trójargumentowy ?: jak w c++.
> 
> Czy n-ta (kto normalny iteruje po n, czyję się zgorszony!:)
> literaka s to "+"
> (porównujemy ===, bo == jest miękkie :)
> 
> Jeśli tak, to dodajemy literkę na koniec o,
>   o += i.charAt(n)
> (nie wynika nic z tego, co jest po :)
> jeśli nie, to (co innego, o tym poźniej).
> 
> Teraz zaczynają się schody, jeśli s[n] nie ejst plusem,
> wykona się to:
> 
> "*" === s.charAt(n) && (o += l ? e[r++].value : e.charAt(r++))
> 
> Nieco rozszerzając:
> 
> "*" === s.charAt(n)
> &&
> (o += l ? e[r++].value : e.charAt(r++))
> 
> Sztuczka polega na tym, że to wyrażenie wylicza
> się do boola. Jeśli s[n] to '*', zadziała
> leniwa ewaluacja i nawias się nie wykona.
> Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
> nawiasowanie):

Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?

[...]
 
> Ostatecznie strzelałbym, że to znaczy(to nie JS:)
> 
> if ("+"== s.charAt(n))
> 	o += i.charAt(n);
> else if ('*' ~= a.charAt(n) )
>     o+ = (l ? e[r++].value : e.charAt(r++) );

~= oznacza różny? 
Jeśli tak to warunek byłby dziwny:
 jeśli n-ty znak jest + to zrób to, 
 w przeciwnym wypadku, jeśli n-ty znak jest różny od * (czyli znów równy +)
to zrób tamto.

I chyba literówka, nie a.charAt(n) tylko s.charAt(n).

> A, drobna uwaga, nie znam JS ;-)

Tak czy owak wielkie dzięki za pochylenie się nad tym ścierwem, dużo mi
pomogłeś :-)
 
-- 
pozdrawiam
Roman Tyczka

[toc] | [prev] | [next] | [standalone]


#29529

Frombartekltg <bartekltg@gmail.com>
Date2017-03-28 12:04 +0200
Message-ID<obdcep$l87$1@node2.news.atman.pl>
In reply to#29528
On 28.03.2017 09:58, Roman Tyczka wrote:
>> "*" === s.charAt(n)
>> &&
>> (o += l ? e[r++].value : e.charAt(r++))
>>
>> Sztuczka polega na tym, że to wyrażenie wylicza
>> się do boola. Jeśli s[n] to '*', zadziała
>> leniwa ewaluacja i nawias się nie wykona.
>> Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
>> nawiasowanie):
> Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?

Rzeczywisćei, odwrotnie.
Jak jest czym inym, to iloczyn musi być fałszywy
i nie odpala drugiego nawiasu.



> [...]
>
>> Ostatecznie strzelałbym, że to znaczy(to nie JS:)
>>
>> if ("+"== s.charAt(n))
>> 	o += i.charAt(n);
>> else if ('*' ~= a.charAt(n) )
>>     o+ = (l ? e[r++].value : e.charAt(r++) );
> ~= oznacza różny?

!=


pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#29530

FromRoman Tyczka <noemail@because.no>
Date2017-03-28 16:56 +0200
Message-ID<znqct9l32j9u.dlg@tyczka.com>
In reply to#29529
On Tue, 28 Mar 2017 12:04:08 +0200, bartekltg wrote:

>>> "*" === s.charAt(n)
>>> &&
>>> (o += l ? e[r++].value : e.charAt(r++))
>>>
>>> Sztuczka polega na tym, że to wyrażenie wylicza
>>> się do boola. Jeśli s[n] to '*', zadziała
>>> leniwa ewaluacja i nawias się nie wykona.
>>> Jeśli jest czym innym niż *, mamy (strzelam dodatkowe
>>> nawiasowanie):
>> Jeśli jest cymś innym? Czy raczej jeśli jest * właśnie?
> 
> Rzeczywisćei, odwrotnie.
> Jak jest czym inym, to iloczyn musi być fałszywy
> i nie odpala drugiego nawiasu.

No właśnie, a ma odpalać.

>> [...]
>>
>>> Ostatecznie strzelałbym, że to znaczy(to nie JS:)
>>>
>>> if ("+"== s.charAt(n))
>>> 	o += i.charAt(n);
>>> else if ('*' ~= a.charAt(n) )
>>>     o+ = (l ? e[r++].value : e.charAt(r++) );
>> ~= oznacza różny?
> 
> !=

I to jest błąd, powinno być = :-)
 
W każdym razie przebrnąłem i poszło, dzięki za wsparcie!
 

-- 
pozdrawiam
Roman Tyczka

[toc] | [prev] | [standalone]


Back to top | Article view | pl.comp.programming


csiph-web