Newsgroup: it.comp.lang.visual-basic
Titolo: [!] Obfuscated Visual Basic

A leggere il messaggio sul generatore di poesie mi è venuta la voglia di
riproporre l'Obfuscated Visual Basic che avevo postato un paio di anni fa su
questo NG.
Create un progetto, inserite una form, createci sopra un pulsante di nome
Command1, aggiungete un modulo, e copiate il seguente codice. Però non
mandatelo in esecuzione, provate prima a capire cosa fa.
Se ci riuscite, avete vinto voi. Se non ci riuscite potete mandarlo in
esecuzione, ma ho vinto io. 8-)
Occhio alla Declare che va a capo e un terzo circa del messaggio, ma è da
ricomporre in una riga sola.
----------- inizio codice ------------
' Questo va nella form
Private Sub Command1_Click()
    l1ll1l1 Me
End Sub
' Da qui in poi va tutto in un modulo di nome ModObfuscated
Const lll1 = 1
Const ll11 = 1 + lll1
Const ll = 1 + lll1 + ll11 + ll11
Type l
   lll As String
   ll1 As Integer
   l11 As Long
End Type
Private Declare Function I1ll Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As
Long, ByVal x As Long, ByVal y As Long, ByVal wOptions As Long, ByVal lpRect
As Any, ByVal lpString As String, ByVal nCount As Long, lpDx As Long) As
Long
Function l11(l As l) As l
    l11.ll1 = 11 * ll + l.ll1 + ll
End Function
Function l111(l As l) As l
    Dim l1 As l
    l.ll1 = 11 * Len(l.lll)
    l111.lll = l.ll1
End Function
Sub l1ll1l1(l As Form)
    Dim l1 As l
    Dim ll(1 + 1) As l
    Dim lll(11) As Byte
    Dim llll(11) As Long
    Dim l11l As Variant
    Dim a As String
    l.AutoRedraw = 0
    ll(1) = l11(l1)
    ll(lll1 + 1).ll1 = l11(l1).ll1 + 11 * (ll11 + lll1) - ll11 - ll11
    For l1.ll1 = 0 To 11
        llll(l1.ll1) = 11
    Next
    For l1.ll1 = 1 To UBound(ll)
        lll(l1.ll1) = ll(l1.ll1).ll1
        l11l = l11l & Chr$(lll(l1.ll1))
    Next
    l11l = l11l & "ll"
    l1.lll = "1l1l1ll11l"
    l11l = l11l & Chr$(l111(l1).lll + 1)
    l1.lll = "111"
    l11l = l11l & Chr$(l111(l1).lll - 1)
    l1.lll = "1l1l1ll11l1"
    l11l = l11l & Chr$(l111(l1).lll - 1 - 1)
    l1.lll = "1l1l1ll11l"
    l11l = l11l & Chr$(l111(l1).lll + 1)
    l1.lll = "1l1l1ll11l"
    l11l = l11l & Chr$(l111(l1).lll + ll11 + ll11)
    l11l = l11l & "l"
    l1.lll = "1l1ll1l11"
    l11l = l11l & Chr$(l111(l1).lll + 1)
    I1ll l.hdc, 0, 30, 2, ByVal 0&, l11l, 11, llll(0)
End Sub
--------------- Fine del codice
Ciao
*Roby*
P.S.
Ovviamente non c'è da preoccuparsi. Non formatta l'HD, non cancella nè
scrive nulla sui dischi, e non fa neppure rumori molesti.

hai vinto tu.
molto grazioso.
codice tuo ?

Analizzo Analizzo!

 esecuzione, ma ho vinto io. 8-)
Ciao Roberto,
Il giochino è un mostro! ;-))))
Io ho capito che scrive, e che lo fa su un form (fin qui in effetti non mi è
sembrato particolarmente difficile).
Il problema è: cosa scrive???
Ho visto che giochi un po' con i caratteri ascii: se non ho sbagliato sono
10 caratteri (lettere???), ma poi mi sono perso :-((
Non mi arrendo, ma dimmi almeno se sono sulla strada buona!
Ciao.

scrive nulla sui dischi, e non fa neppure rumori molesti.
:)
ciao, hal

Ciao. Al 2° ciclo mi sono arreso... troppo casino! Ma quanto ci hai messo
per farlo???
Ecco quello che ho analizzato (e senza mai premere il tasto! ;)
Const lll1 = 1
' ll11 = 1 + 1 = 2
Const ll11 = 1 + lll1 ' 2
' LL = 1 + 1 + 2 + 2 = 6
Const ll = 1 + lll1 + ll11 + ll11 ' 6
Function l11(l As l) As l
    ' 1° passaggio : L11.LL1 (integer) = 11 * 6 + 0 + 6 = 72
    l11.ll1 = 11 * ll + l.ll1 + ll
End Function
Sub l1ll1l1(l As Form) ' Sub di Chiamata
    Dim l1 As l ' L1 - Dichiara una variabile oggetto form (quello che gli
passo)
    Dim ll(1 + 1) As l ' LL - Dichiara un vettore di 2 tipi L
    Dim lll(11) As Byte ' LLL - Vettore di 11 byte
    Dim llll(11) As Long ' LLLL - Vettore di 11 long
    Dim l11l As Variant ' L11L - Un Variant
    Dim a As String ' A - Dichiara una string
    l.AutoRedraw = 0 ' Setta l'autoredraw del form a 0
    ' L1 non lo usa nella funct L11
    ' ora Ll(1).LL1 = 72
    ll(1) = l11(l1) ' setta LL(1) = funzione L11(L1) che ritorna un tipo L
    ' L1(2).LL1 (integer)
    ' Ora L1(2).LL1 = 72 +11 * (2 + 1) - 2 - 2 = 101
    ll(lll1 + 1).ll1 = l11(l1).ll1 + 11 * (ll11 + lll1) - ll11 - ll11
    ' L1.LL1 intero
    For l1.ll1 = 0 To 11 ' ciclo eseguito 1 volta
        llll(l1.ll1) = 11 ' LLLL(0)=11
    Next
    For l1.ll1 = 1 To UBound(ll) ' Ciclo eseguito 2 volte
        lll(l1.ll1) = ll(l1.ll1).ll1 ' LLL(1) = 72 --- LLL(2) = 101
        l11l = l11l & Chr$(lll(l1.ll1)) ' L11L = "" & Chr$(72) = "H" ---
L11L = "" & Chr$(101) = "e"
    Next
...
End Sub
Ho capito che sulla stringa L11L ci va a finire (per ora) "He"
Lo devo premere sto pulsante o devo continuare???
CiaoZ
SebaMix

 Lo devo premere sto pulsante o devo continuare???
Bel lavoro SebaMix (io mi sono perso prima)
Cmq subito dopo ci infila due "L" e siamo ad "Hell"
A questo punto non credo che sia necessario continuare con l'analisi
dettagliata delle istruzioni.
Sono esattamente UNDICI caratteri (prima avevo detto 10 perchè la doppia
elle in un unica assegnazione mi aveva confuso) che cominciano per
"Hell"....
Non sarà mica "Hello world"???
Io non lancio ancora ma, voi che lo sapete, ditemi se ho vinto.
:-)))
Ciao.
--
Princi, 
princ...@programmer.net
----------------------------------------------------------------------
"Tutti sanno che una cosa è impossibile da realizzare,
finché arriva uno sprovveduto che non lo sa e la inventa." A.E.

Non sarà mica "Hello world"???
benvenuto ! :)
ciao, hal

Mi sono aiutato... e' stato un divertente esercizio... :)
' Questo va nella form
Private Sub Command1_Click()
    FaiQualcosaSulForm Me
End Sub
' Da qui in poi va tutto in un modulo di nome ModObfuscated
Const constA = 1
Const constB = 1 + constA                          ' = 2
Const constC = 1 + constA + constB + constB        ' = 6
Type type1
   field1 As String
   field2 As Integer
   field3 As Long ' mai usato :)
End Type
Private Declare Function ExtTextOutAny Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As Long,
ByVal x As Long, ByVal y As Long, ByVal wOptions As Long, ByVal lpRect As Any, ByVal
lpString As String, ByVal nCount As Long, lpDx As Long) As Long
Function Function1(param1 As type1) As type1
    Function1.field2 = 11 * constC + param1.field2 + constC
End Function
Function Function2(param1 As type1) As type1
    Dim locVarType1 As type1
    param1.field2 = 11 * Len(param1.field1)
    Function2.field1 = param1.field2
End Function
Sub FaiQualcosaSulForm(param1 As Form)
    Dim locVarType1 As type1
    Dim arrType1(1 + 1) As type1
    Dim arrByte(11) As Byte
    Dim arrLong(11) As Long
    Dim varVariant As Variant
    Dim a As String
    param1.AutoRedraw = 0
    arrType1(1) = Function1(locVarType1)
    arrType1(constA + 1).field2 = Function1(locVarType1).field2 + 11 * (constB + constA) -
constB - constB
    For locVarType1.field2 = 0 To 11
        arrLong(locVarType1.field2) = 11
    Next
    For locVarType1.field2 = 1 To UBound(arrType1)
        arrByte(locVarType1.field2) = arrType1(locVarType1.field2).field2
        varVariant = varVariant & Chr$(arrByte(locVarType1.field2))
    Next
    varVariant = varVariant & "ll"                                        'll
    locVarType1.field1 = "1l1l1ll11l"
    varVariant = varVariant & Chr$(Function2(locVarType1).field1 + 1)     ' o
    locVarType1.field1 = "111"
    varVariant = varVariant & Chr$(Function2(locVarType1).field1 - 1)     ' <spazio>
    locVarType1.field1 = "1l1l1ll11l1"
    varVariant = varVariant & Chr$(Function2(locVarType1).field1 - 1 - 1) ' w
    locVarType1.field1 = "1l1l1ll11l"
    varVariant = varVariant & Chr$(Function2(locVarType1).field1 + 1)     ' o
    locVarType1.field1 = "1l1l1ll11l"
    varVariant = varVariant & Chr$(Function2(locVarType1).field1 + constB + constB) ' r
    varVariant = varVariant & "l"                                         ' l
    locVarType1.field1 = "1l1ll1l11"
    varVariant = varVariant & Chr$(Function2(locVarType1).field1 + 1)     ' d
    ExtTextOutAny param1.hdc, 0, 30, 2, ByVal 0&, varVariant, 11, arrLong(0)
End Sub

>Mi sono aiutato... e' stato un divertente esercizio... :)
be', anch'io, mica ho lasciato inalterate quelle sequenze di L minuscole e di 1 che
con il Courier sono quasi indistinguibili ! :)
Comunque, complimenti a chi l' ha inventato !
ciao, hal

 Comunque, complimenti a chi l' ha inventato !
Concordo... :)

ricomporre in una riga sola.
Sei un bas*****
Hai passato tutti i parametry byref, così non ho capito se andavi a modificare il valore delle
variabili originali o meno (mi sembra di sì).
Inoltre hai usato gli stessi nomi per variabili locali e globali... e variabili di tipo diverso
poi!!!!! (per il form e la usertype)... infatti sono partito bene, ma poi mi sono incasinato con i
nomi...
Basta, è mezz'ora che ci perdo su ed è già troppo... a quest'ora poi...
Complimenti! Se non fosse stato per la seconfa funzione (l111), sarebbe stato più semplice...
Grande!!!!!
P.S.:
Posto quello che avevo ottenuto, ma purtroppo ho sbagliato alcuni nomi causa i tranelli di cui
sopra... non è da galantuomini, caro Roberto... ;-)))
(quel cacchio di inputform!!!!!!!)
Const costval1 = 1
Const costval2 = 1 + costval1
Const costval6 = 1 + costval1 + costval2 + costval2
Type vartype
   arraybyte As String
   pippo As Integer
   funzione1 As Long
End Type
Private Declare Function ExtTextOut Lib "gdi32" Alias "ExtTextOutA" (ByVal hdc As Long, ByVal x As
Long, ByVal y As Long, ByVal wOptions As Long, ByVal lpRect As Any, ByVal lpString As String, ByVal
nCount As Long, lpDx As Long) As Long
Function funzione1(inputform As vartype) As vartype
    funzione1.pippo = 72 + inputform.pippo
End Function
Function funzione2(inputform As vartype) As vartype
    Dim varform As vartype
    inputform.pippo = 11 * Len(inputform.arraybyte)
    funzione2.arraybyte = inputform.pippo
End Function
Sub funzione(inputform As Form)
    Dim varform As vartype
    Dim vararrayform(2) As vartype
    Dim arraybyte(11) As Byte
    Dim arraylong(11) As Long
    Dim varvariant As Variant
    Dim a As String
    inputform.AutoRedraw = 0
 
    vararrayform(1) = funzione1(varform)
    vararrayform(costval1 + 1).pippo = funzione1(varform).pippo + 29 '11 * (costval2 + costval1) -
costval2 - costval2
    For varform.pippo = 0 To 11
        arraylong(varform.pippo) = 11
    Next
    For varform.pippo = 1 To UBound(vararrayform)
        arraybyte(varform.pippo) = vararrayform(varform.pippo).pippo
        varvariant = varvariant & Chr$(arraybyte(varform.pippo))
    Next
    varvariant = varvariant & "ll"
    varform.arraybyte = "1l1l1ll11l"
    varvariant = varvariant & Chr$(funzione2(varform).arraybyte + 1)
    varform.arraybyte = "111"
    varvariant = varvariant & Chr$(funzione2(varform).arraybyte - 1)
    varform.arraybyte = "1l1l1ll11l1"
    varvariant = varvariant & Chr$(funzione2(varform).arraybyte - 1 - 1)
    varform.arraybyte = "1l1l1ll11l"
    varvariant = varvariant & Chr$(funzione2(varform).arraybyte + 1)
    varform.arraybyte = "1l1l1ll11l"
    varvariant = varvariant & Chr$(funzione2(varform).arraybyte + costval2 + costval2)
    varvariant = varvariant & "l"
    varform.arraybyte = "1l1ll1l11"
    varvariant = varvariant & Chr$(funzione2(varform).arraybyte + 1)
    ExtTextOut inputform.hdc, 0, 30, 2, ByVal 0&, varvariant, 11, arraylong(0)
End Sub
Ciao,
Moreno
#sirri#@#morenosoft#.com
(togliete "#" dall'indirizzo)
Moreno Sirri VB Site - 
http://www.msvbsite.net
---------------------------------------------------------------------------
Le risposte alle tue domande le trovi sul Sito Comune di questo NewsGroup:
 
http://www.it-lang-vb.net
---------------------------------------------------------------------------

Risposta cumulativa a tutti, altrimenti č impossibile.
Grazie per i complimenti, ma ve li devo rigirare tutti con gli interessi.
Personalmente temevo che non l'avrebbe risolto nessuno e quando ho visto il
codice di Jabba The Hut con le lettere nei commenti esattamente come stavano
nel mio sorgente originale a momenti cadevo dalla sedia. 8-)
Pensare che la prima volta che l'avevo postato non aveva avuto nessun
successo. Ma mi pare fosse Agosto e probabilmente eravate tutti in ferie.
Complimenti anche ad Hal (che ha tenuto alto l'onore dei trenisti
risolvendolo per primo), a Princi, A Sebamix a Moreno, a Pal e a tutti
quelli che hanno provato senza postare. Benchč l'output fosse banale (mi
divertiva l'idea di nascondere l'ovvio nell'assurdo), trovarlo era
difficilissimo
Anche solo tradurre le variabili in un modo + comprensibili č da lasciarci
gli occhi. Al limite, mandatemi il conto dell'oculista.
Benchč il codice postato sia mio, l'idea di base non lo č. Esiste da molti
anni una competizione chiamata Obfuscated C che punta proprio sullo scrivere
codice C assolutamente illeggibile.
In C ci sono 2 vantaggi rispetto a VB: č possibile usare le #define per
modificare anche istruzioni di base del linguaggio, e il sorgente puň essere
scritto in qualunque modo. Ad esempio ricordo un vecchio sorgente pieno di
cerchietti, che visto da lontano sembrava una locomotiva a vapore (con il
fumo fatto con "oo00OO"), che lanciato scriveva a video "Ciuff-Ciuff" (ma
capirlo era impossibile).
Se qualcuno č interessato, qui c'č l'URL della competizione:
http://www.ioccc.org/
 e qui c'č un esempio di sorgente (a forma di bandiera)
http://www.ioccc.org/2000/anderson.c
 che non ho assolutamente idea di cosa
faccia 8-)
Non č mia neppure l'idea di mischiare le "L" minuscole, le "i" maiuscole  e
gli "1" per formare i nomi delle variabili. L'avevo visto usare molti anni
fa in un sorgente di CoreWars (per chi non lo sapesse, CoreWars č un gioco
in cui si scrive del codice per comandare un robot usando delle istruzioni
base in simil C, e poi si fanno scontrare due software-robot per volta in
una arena virtuale. Qui c'č l'URL: 
http://corewars.sourceforge.net/
 ). I
sorgenti CoreWars dovevano essere pubblici per regolamento, ed un tizio si
era inventato questo sistema per renderlo sě pubblico, ma incomprensibile.
Oltretutto, usando il font giusto, lettere e numero sono assolutamente
indistinguibili anche da un OCR.
In realtŕ una prima ipotesi era scrivere un "crittatore di sorgenti" da
usare per quei clienti che ti chiedono di dargli anche i sorgenti ma pagano
poco. Benchč fosse fattibile, alla fine ho scartato l'idea perchč preferisco
evitare quel tipo di clienti. 8-)
Ciao
*Roby*
P.S.
Sarebbe bello lanciare una sfida ogni tanto sul NG. Tipo che c'č da
risolvere un problema nel minor numero di istruzioni, oppure evitando di
usare una certa lettera o un certo numero.

Stamattina ho rinunciato (e con amarezza) ho premuto il command button...
Ora faccio sclerare un po di miei colleghi ;)
CiaoZ
SebaMix
P.S. Ma non c'era un modo + semplice x scriverlo???

 usare una certa lettera o un certo numero.
Mi hai entusiasmato! E fare un obfuscated VB??? ;)
Sarebbe troppo forte!!!
CiaoZ
SebaMix

 ha scritto nel messaggio
news:9b6gdn$82v26$1...@ID-66833.news.dfncis.de...


Adesso comincio a scriverne uno... ;) He he he
CiaoZ
SebaMix

 Comunque, complimenti a chi l' ha inventato !
*Questa* e` poesia, altro che ecosemafori del tubo oulipotiano.
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

fare un copia&incolla
diabolico :->
ciao, hal


e farne una rubrichetta sul sc ?
ciao, hal

 solo fare un copia&incolla
questo dimostra la perversione mentale che risiede in tutti i cervelli
dei programmatori.
--
Fibia "Sakamoto" FBI
E-mail: 
fibi...@hotmail.com
ICQ UIN 63586057
Sito Personale: 
http://www.geocities.com/fibiafbi
VB Simple: 
http://vbsimple.virtualave.net
Membro #25 delle Mitiche Brigate Takahashi sezione Sud

 Adesso comincio a scriverne uno... ;) He he he
Guarda che ti prendo in parola. Ormai ti sei sbilanciato e aspettiamo tutti
un tuo post. 8-)
Buona Pasqua
*Roby*

 e farne una rubrichetta sul sc ?
Si, ma chi ce l'ha il tempo?
Facciamo che se qualcuno (me compreso) pensa qualche cosa, la posta. Farne
una rubrica fissa presuppone un impegno continuativo che penso possano
offrire veramente in pochi.
Magari quello che si potrebbe fare è formalizzare le eventuali regole.
Chesso, dare tempo una settimana e  vietare la pubblicazione dei risultati
fino alla scadenza. Ciascuno può inviare i risultato ad un referente, oppure
al SC, e vengono pubblicati tutti assieme. Poi alla fine ognuno può voltare
quello che gli sembra più meritevole (vietato ovviamente votare sè stessi) e
si stila una classifica.
Personalmente eviterei sfide lunghe o tediose, tipo costruire un programma
che faccia un completo task specifico, cercando invece qualcosa risolvibile
in poche righe di codice (diciamo massimo una 20ina) ma che richieda un po'
di ingegno.
Tutto molto bello in teoria, ma in pratica mi sa che resterà lettera morta.
8-)
Vabbè, dopo Pasqua mancherò dal NG per una settimana, magari nel frattempo
ci penso.
Ciao
*Roby*

*Roby*
bravo, leva in alto l' onore dei trenisti !
ciao, hal

*Roby*
Aug, hal

 Aug, hal
Auguri anche da parte mia!
--------------------------------------------
             ASSA
http://assatarram.yohoo.it
Napster: Assatarram3
it.comp.lang.visual-basic: Assa
--------------------------------------------

>offrire veramente in pochi.
Beh, se la cosa la si studia a tavolino, si potrebbe fare in modo da limitare al masimo lintervendo
di un moderatore...
Magari una rubrica "Svago & VB" sul SC... ovvero come i programmatori in VB possono lasciare lo
stress lavorativo per qualche minuto per sottoporsi ad un nuovo stress...:-)))


 stress lavorativo per qualche minuto per sottoporsi ad un nuovo
stress...:-)))
Eh, se non fossimo masochisti nell'intimo, avremmo scelto un altro lavoro.
8-)
Ciao
*Roby*

dispiacerebbe che lavorassi per qualcosa che potrebbe restare lettera morta.
Ni.
Gią altre sezioni sono gestite da altre persone, come Zanna per Leonardo, io per i Libri, Mix per i
link, Stefanelli per FTP e prima Jimi (sparito... qualcuno ne sa qualcosa?) ora *Alessandro* per
FAQ. Questi curano le pagine della rubrica ed il WM ha solo il compito di uploadare quelle
aggiornate...


Ok Ok Ma prima posso riprendermi da pasquetta??? Ho la colomba che svolazza
ancora per lo stomaco ;)
Comunque ho dato un occhio ai codici del concorso obfuscated C... veramente
esauriti... peccato non potere fare una cosa del genere con VB...
Adesso comincio a scriverne uno, ma non assicuro che arrivi prima della
classifica del mese di giugno... ;)
Ma lo devo pensare bene, progettare con cura... nutrirlo da ddiio ;)
CiaoZ
SebaMix
P.S. non mi sono sbilanciato... sono solo inciampato ;)

Se vuoi faccio parte volentieri della prima giuria italiana per un concorso
Obfuscated VB... ;)
CiaoZ
SebaMix