Obfuscator pro javascript

Re:Obfuscator pro javascript
« Odpověď #30 kdy: 04. 11. 2016, 14:09:22 »
V (de)obfuscaci se moc nevyznam, ale neni neco podobneho pro JS, jako v oblasti her? Tj. ze ochrana si v podstate provozuje vlastni VM, ktere se nahodne modifikuje a ze servru ziskava kusy kodu, ktery desifruje, zakomponuje a pousti na tom virtualnim stroji?

Vetsinou se jenom vygeneruji absurdni jmena promennych, neco se prehazi, neco inlinuje, pokazi se formatovani...


noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Obfuscator pro javascript
« Odpověď #31 kdy: 04. 11. 2016, 14:22:30 »
V (de)obfuscaci se moc nevyznam, ale neni neco podobneho pro JS, jako v oblasti her? Tj. ze ochrana si v podstate provozuje vlastni VM, ktere se nahodne modifikuje a ze servru ziskava kusy kodu, ktery desifruje, zakomponuje a pousti na tom virtualnim stroji?

Vetsinou se jenom vygeneruji absurdni jmena promennych, neco se prehazi, neco inlinuje, pokazi se formatovani...

Jn, jasne. To je bezna minifikace, ktera se pouziva tedy spise kvuli rychlosti. To se snad ani neda povazovat za "obfuskaci", kdyz kazdy deobfuscator/beatufier nebo i hloupy dev tool v Chrome to zvladne celkem solidne narovnat do citelne podoby. Je to skoro jako kompilace zdrojaku v C++ ci Jave, kterou take nenazyvame obfuskaci, prestoze technicky asi take je.

Jsem prave mel na mysli neco pokrocilejsiho, kde je napr. primo v JavaScriptu naimplementovana vlastni virtualni masina s vlastnim siforvanym kodem, ktery se pri provadeni modifikuje a presifrovava a zadne spusteni neni stejne, prestoze vysledek to vyplivne stejny. V tom Denuvu se navic nejak pouziva unikatni desifrovaci klic generavoany podle seriovych cisel komponent v pc (klic je vytvoreny serverem) a zdrojak hry je prosety pastmi, kdy hra sice nespadne, ale zamerne se nejak lehce polame (napr. nedoplnovani hp, zamceni dveri, 5x vetsi damage od nepratel, pridani pasti, ktera instatne hrace zabije atp.).

brendan

Re:Obfuscator pro javascript
« Odpověď #32 kdy: 04. 11. 2016, 15:39:44 »
Jsem prave mel na mysli neco pokrocilejsiho, kde je napr. primo v JavaScriptu naimplementovana vlastni virtualni masina s vlastnim siforvanym kodem, ktery se pri provadeni modifikuje a presifrovava a zadne spusteni neni stejne, prestoze vysledek to vyplivne stejny.

To by vyzadovalo "zamcenou" cast pameti co v browseru neni. Proste i dynamicky generovany JS kod se musi nasledne executnout a ty mas moznost videt co se prave provadi i pamet vsech objektu. Proste jakakoli obfuskace kodu nic neresi, protoze ty ho mas moznost videt jak bezi. I kdyby to cele bylo zasifrovane 4kilovym blowfishem tak se to nekde musi desifrovat a neschovas to.

noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Obfuscator pro javascript
« Odpověď #33 kdy: 04. 11. 2016, 16:09:37 »
Jsem prave mel na mysli neco pokrocilejsiho, kde je napr. primo v JavaScriptu naimplementovana vlastni virtualni masina s vlastnim siforvanym kodem, ktery se pri provadeni modifikuje a presifrovava a zadne spusteni neni stejne, prestoze vysledek to vyplivne stejny.

To by vyzadovalo "zamcenou" cast pameti co v browseru neni. Proste i dynamicky generovany JS kod se musi nasledne executnout a ty mas moznost videt co se prave provadi i pamet vsech objektu. Proste jakakoli obfuskace kodu nic neresi, protoze ty ho mas moznost videt jak bezi. I kdyby to cele bylo zasifrovane 4kilovym blowfishem tak se to nekde musi desifrovat a neschovas to.

A pri spusteni hry na pc snad muzes jadru nebo jinym ovladacum efektivne zakazat pristup do sve pameti? (Tak nizko OS jsem nikdy nedelal, takze fakt netusim.)

To, o cem pisu neni trapne "desifruj -> eval". Ale zjisti od servru (po overeni napr. auth tokenu a "unikatniho" fingerprintu prohlizece) unikatni klic a dalsi casti kodu, ktere nasledne vzdy chvili vykonavas a pak desifrujes dalsi cast kodu ve VM, nebo dostanes dalsi klic nebo kod. Nic nelze 100% zabezpecit, ale treba ten SecuRom nebo Denuvo to muze zatracene zpomalit (napr. mesice po vyjiti ocekavane AAA hry necracknute) a pokud je to unikatni ochrana, tak si kazdy dvakrat rozmysli, jestli se to bude snazit prolamovat, kdyz by bylo levnejsi si treba 10x zaplatit predplatne a napsat bota.

Ale stejne jako ve vlaknu o zabezpecovani mapy v JS - osobne silne pochybuju, ze OP ma tak ceny algoritmus, ktery musi bezet na klientovi a zaroven se vyplati jej takto chranit.

brendan

Re:Obfuscator pro javascript
« Odpověď #34 kdy: 04. 11. 2016, 16:24:09 »
To, o cem pisu neni trapne "desifruj -> eval". Ale zjisti od servru (po overeni napr. auth tokenu a "unikatniho" fingerprintu prohlizece) unikatni klic a dalsi casti kodu, ktere nasledne vzdy chvili vykonavas a pak desifrujes dalsi cast kodu ve VM, nebo dostanes dalsi klic nebo kod.

Jenze browser nic jineho nez JS neumi spustit. I kdyz si tam implementujes proprietarni jazyk ci celou VM tak se to musi decodnout do JS a ten spustit. A to neschovas, jenom udelas zlozitejsi. V podstate tve definici vyhovuje treba takovej React ale na konci je porad plain JS, ktrery se spousti.


noef

  • *****
  • 897
    • Zobrazit profil
    • E-mail
Re:Obfuscator pro javascript
« Odpověď #35 kdy: 04. 11. 2016, 16:59:43 »
To, o cem pisu neni trapne "desifruj -> eval". Ale zjisti od servru (po overeni napr. auth tokenu a "unikatniho" fingerprintu prohlizece) unikatni klic a dalsi casti kodu, ktere nasledne vzdy chvili vykonavas a pak desifrujes dalsi cast kodu ve VM, nebo dostanes dalsi klic nebo kod.

Jenze browser nic jineho nez JS neumi spustit. I kdyz si tam implementujes proprietarni jazyk ci celou VM tak se to musi decodnout do JS a ten spustit. A to neschovas, jenom udelas zlozitejsi. V podstate tve definici vyhovuje treba takovej React ale na konci je porad plain JS, ktrery se spousti.

To ja nikdy nepopiral. Stejne tak SecuRom nebo Denuvo je porad spousteny na realnem procesoru, kde snad take lze trackovat instrukce, a presto je to ucinna ochrana (relativne receno - nebyla prolomena mesice, coz na pomery hernich ochran je neuveritelne dobre skore). Jde o to, ze tam pridavate dalsi vrstvu - sebemodifikujici se dynamicky spousteny kod, ktery staticky nemuzete cely ziskat - jednoduse proto, protoze nemate vsechny casti a ruzne casti jsou sifrovany ruznymi klici (generovani casti i klice se ziskavaji ze servru kdyz je potreba, nelze si vyzadat vsechny; navic dane casti funguji jen pro dany klic prohlizece, jinde spusti pasti).

Mate pravdu, splnuje to asi i ten React (detailne neznam) i Angular. Asi stejne tak, jako ze sifrovaci algoritmus je Caesarova sifra. Rozdil je v tom, ze v pripade Angular aplikace si muzete hromadne stahnout vsechny sablony (casto jsou predkompilovane primo v js) a casto je cela aplikace jeden bundle, takze mate cely zdrojak v cistem JS, staci najit funckci, ktera dela vypocet. V pripade te hypoteticke ochrany mate kusy sifrovaneho kodu, ktery je vam na nic, protoze potrebujete vsechny kusy a klice pro vsechny kusy (rozkouskovani i klice mohou byt dynamicke, takze pokud vam v polovine grabovani server zasle nove vm, tak jste v haji a muzete zacit od znova). Navic kdyz je to sebemodifikujici se, tak musite i simulovat ten VM a prolomit generovani toho "unikatniho" klice pro prohlizec, jinak to bude nahodne davat spatne vysledky na jinych prohlizecich/strojich. Je rozdil dekodovat par kilobajtu minifikovaneho JS, kde vim, ze tam nekde asi bude ta "zlata" funkce versus dekodovat par megabajtu kodu VM, kde casti jsou obsluzne veci VM, casti samotny zasifrovany kod vevnitr a dalsi casti data toho VM (pripadne oboje zaraz). Pokud jsou napr. nektere veci pouzivane ve vice formach (rozsiforvane i zasifrovane), tak napsat nastroj, ktery to automaticky deobfuskuje nebude trivialni snapshot ast v prohlizeci. Bude se muset celkem dlouho sbirat klice a kusy kodu, zjistovat, jak je davat dohromady (vm muze server zaslat nove, ktere nebude mit stejnou podobu provadeneho VM kodu, klidne muze byt ten jeden algoritmus implementovany nekolika zpusoby, coz razantne prodlouzi prolamovani). Dalsi vec je, ze musite take identifikovat vsechny trapy (coz je vetsinou nerealne) nebo rozlousknout, jak se generuje ten prohlizecovy klic.

Chapu, proc nikdo takoveto slozite ochrany v prohlizeci neresi. Proc to resit na strane klienta, kdyz to bude neuveritelne drahe, pomale (na mobilech nepouzitelne) a nikdy ne 100%, kdyz to lze trivialne resit na strane servru za zlomek ceny a bude to rychle jako blesk.

Jako uznavam, ze je zajimave se nad tim zamyslet, ale zodpovezeno to bylo uz na zacatku vlakna.
@OP presun ten vypocet na server a neres kraviny.