Je me suis amusé a décoder un site Web pour m'amuser.
J'ai développé une petite application dont voici une copie écran de l'interface:
Les sources et les exécutables sont téléchargeables ici
Menus gauche/Mes projets purebasic/zone privée 2
Login: pure / basic
Mais ce qui m’amène ce soir, c'est un petit challenge pour décoder du Javasript contenu dans les pages Web et codé avec une fonction eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};....
Voici ce a quoi je suis arrivé, et je me demandai si cela vous amuserez de tenter de décoder la dite fonction et de partager vos solution.
Code : Tout sélectionner
EnableExplicit
Global urlHomePage$ = "https://"+"www"+".arconaitv"+".us"
Global html.s, page.s
Procedure.s obtenir_page_html(page.s)
; page.s doit contenir l'url complète de la page
; html.s contiendra le contenu complet de la page (index, guide, ...)
Protected URL$ = page.s ;;: Debug ">>>>> URL="+URL$
Protected HTML.s = #Null$
If URL$ = #Null$
ProcedureReturn #Null$
EndIf
Protected host$, prot$, site$
prot$ = Trim(StringField(URL$,1,"/")) : Debug ">>>>> PROT = " + prot$
host$ = Trim(StringField(URL$,3,"/")) : Debug ">>>>> HOST = " + host$
site$ = prot$ + "//" + host$ + "/" : Debug ">>>>> SITE = " + site$
Protected agent$, cookie$, lang$, type$
agent$ = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393"
cookie$ = ""
lang$ = "fr-FR"
type$ = "text/html"
Protected HttpRequest
If InitNetwork()
NewMap Header$()
;Header$("Accept") = type$
;Header$("Accept-Language") = lang$
Header$("Cache-Control") = "no-cache"
;Header$("Cookie") = cookie$
;Header$("Connection") = "keep-alive"
;Header$("Content-Type") = type$
;Header$("Host") = host$
;Header$("Referer") = site$
Header$("User-Agent") = agent$
HttpRequest = HTTPRequest(#PB_HTTP_Get, page.s, "", 0, Header$())
If HttpRequest
HTML.s = HTTPInfo(HTTPRequest, #PB_HTTP_Response)
;: Debug "Response: " + HTML.s
FinishHTTP(HTTPRequest)
Else ; ............................. If HttpRequest
Debug "Request creation failed"
ProcedureReturn #Null$
EndIf ; ............................ If HttpRequest
Else ; ............................... If InitNetwork()
ProcedureReturn #Null$
EndIf ; .............................. If InitNetwork()
ProcedureReturn HTML.s
EndProcedure
Procedure.s decoder_m3u8(id)
;;https://beautifier.io/
;;http://dean.edwards.name/unpacker/
Protected I, L, N, N$, A$, codage$, radix$, wordc$, hachage$, foo$, chaine$
Protected M3U8.s
Protected line.s, LIGNE
NewList CODES.s()
: Debug ">>>>> DECODE"
PAGE.s = urlHomePage$ + "/stream.php?id=" + Str(id)
: Debug ">>>>> PAGE="+page
HTML.s = obtenir_page_html(page.s)
;: Debug HTML
NewMap LCODE.s()
NewMap PCODE.s()
For LIGNE = 1 To 999
line.s = StringField(HTML.s, LIGNE, #LF$)
;: Debug LINE.s
If FindString(line.s, "m3u8", 1, #PB_String_NoCase)
line.s = ReplaceString(line.s, #TAB$, " ")
: Debug ">>>>> M3U8 trouvé"
ClearClipboard()
L = CountString(line.s, ";") + 1 : Debug "Nombre de lignes de code = " + Str(L)
For N = 1 To L
N$ = Str(N)
LCODE(N$) = Trim(StringField(line.s, N, ";"))
Debug "ligne " + N$ + "= " + LCODE(N$)
Next
: Debug ""
line.s = StringField(LCODE(Str(L)), 1, ".split")
line.s = ReplaceString(line.s, "'", "")
: Debug "line="+line
I = CountString(line.s, ",") : Debug "count , = " + Str(I)
radix$ = StringField(line.s, 2, ",") : Debug "radix="+radix$
wordc$ = StringField(line.s, 3, ",") : Debug "wordc="+wordc$
chaine$ = StringField(line.s, 4, ",") : Debug "Chaine = "+chaine$
codage$ = LCODE(Str(L-2)) : Debug "codage="+codage$
codage$ = StringField(codage$, 2, "\'") : Debug "codage="+codage$
codage$ = UCase(codage$) : Debug "codage="+codage$
; création du tableau des éléments de chaine$
I = CountString(chaine$, "|")
For N = 0 To I
Select N
Case 0 To 9 : A$ = Str(N)
Default : A$ = UCase(Chr(87+N))
EndSelect
PCODE(A$) = StringField(chaine$, N+1, "|")
Next
ForEach PCODE()
Debug "Array["+MapKey(PCODE())+"] = "+PCODE()
Next
: Debug "Longueur codage=" + Len(codage$)
foo$ = #Null$
For I = 1 To Len(codage$)
A$ = Mid(codage$, I, 1)
Select A$
Case "/", ":", ".", "-" : foo$+A$
Case "0","1","2","3","4","5","6","7","8","9"
foo$+PCODE(A$)
Case "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"
foo$+PCODE(A$)
Default : foo$+A$
EndSelect
Next
Debug "Lien vidéo: " + foo$
EndIf
Next
SetClipboardText(foo$)
ProcedureReturn foo$
EndProcedure
decoder_m3u8(173)
; Debug obtenir_page_html(urlHomePage$ + "/stream.php?id=173")
CAGE