Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: nhaalclkiemr en 31 Enero 2008, 23:36 pm



Título: Melt
Publicado por: nhaalclkiemr en 31 Enero 2008, 23:36 pm
Bueno pues a ver, ya se que muchos sabeis que un Melt (autodestruccion) es hacer que después de ejecutarse el programa se borre a si mismo...pues el problema que tengo es que la mayoría de veces el archivo se copia y la nueva copia que se ejecuta es la que borra el original...pero yo no quiero tener que andar copiando ningun archivo...quiero que al terminar su ejecucion se borre...pero si todavía está en ejecución como puedo borrarme a mi mismo???

Esa es la cuestion...a ver si alguien me puede ayudar...se me ocurren métodos como poner una linea del cmd.exe en tareas programadas o para el proximo inicio...pero weno me gustaría algo profesional...que el propio programa se eliminase a si mismo...y como hago si se encuentra en ejecucion??? ese es el problema

A ver que ideas se os ocurren...no me hacen falta codigos...simplemente ideas...

Saludos ;)


Título: Re: Melt
Publicado por: Mad Antrax en 1 Febrero 2008, 00:09 am
Vale, entonces tú no quieres hacer Melt... definamos antes algunos conceptos:

Melt

P1 = Programa Principal
P2 = Dummy Deleter

1) Ejecutamos P1
2) P1 crea el proceso P2 en %temp% (por ejemplo)
3) P1 ejecuta P2 y le pasa su ruta (P1 le da la ruta de P1 a P2)
4) P1 finaliza su ejecución
5) P2 entra en bucle, si encuentra el fichero P1 lo elimina
6) P2 continua en bucle hasta que no exista P1 (hasta que lo haya eliminado)
7) P2 sale del bucle (P1 está eliminado ya) y continua ejecutando el código
8) Fin

Efecto: El usuario ejecuta P1, y justo en ese instante el fichero de P1 es eliminado pero se sigue ejecutando (en realidad se ejecuta P2 que es una copia de P1 en otra ubicación)

Lo que tu quieres hacer

1) Ejecutamos P1
2) Trabajamos con P1 un buen rato
3) Al cerrar P1, que se autoelimine sin usar Dummies.

Ummm, lo que planteas no parece tener fácil solución. Yo al menos no lo sé resolver sin usar Dummies temporales. Podrías hacer esto...

1) Ejecutamos P1
2) P1 crea el proceso P2 en %temp% (por ejemplo)
3) P1 ejecuta P2 y le pasa su ruta (P1 le da la ruta de P1 a P2)
4) P1 finaliza su ejecución
5) P2 hace CreateProcess(P1) y obtiene su handle hProcess
6) El usuario trabaja con P1, P2 no se muestra en ningún momento.
7) P2 está esperando en WaitForSingleObject(P1) - Es decir, espera a que finalicemos P1
8) P1 es finalizado por el usuario
9) P2 se entera y manda un DeleteFile(P1)
10) P1 es eliminado porque ya no se ejecuta

Efecto: El usuario P1 es ejecutado por el usuario, P1 permanece físicamente en la misma ruta, y al finalizar su ejecución, éste (P1) es eliminado automáticamente (en realidad lo elimina P2).

Con este método sólo quedaría P2 en el disco del usuario sin ejecutarse ni nada. Es lo único que se me ocurre, y estoy hablando desde la teoría, tendría que probarlo antes...

Saludos!!


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 01:56 am
El mejor metodo para melt es crear un thread remoto en el explorer y borrar el .exe desde ahi. El problema esk los avs lo detectan :P (No se lo haces con asm, pero... estamos en la sección de vb xD).... Usa el cmd, es una novatada pero en vb no se puede mas jeje

Saludos


Título: Re: Melt
Publicado por: Chefito en 1 Febrero 2008, 02:02 am
Chicos, este tema me ha gustado y he estado calentandome el tarro de como se podria hacer. Estaba pensando en si utilizase apis de prodesos e hilos y tal.....vamos.....la muerte jajajaja, hasta que se me encendio la bombilla y pense.....a ver si por casualidad se pueden aprovechar los comandos del win? Efectiviwonder, con Erase funciona!!!! te cagas....y yo hace años me comí la cabeza con este mismo tema, sin darle solución jajajaja. Poner esto en el proyecto .exe que compileis:
Código:
Private Sub Form_Terminate()
    Shell "cmd /c erase c:\proyecto1.exe /f", vbHide
End Sub

c:\proyecto1.exe esta claro.....es la localización y nombre de mi propio proyecto a borrar (el que esta en ejecución). El comando /f fuerza ha borrar los de solo lectura.
Si si, solo eso y nuestro proyecto se va a la mierd... cuando cerremos jajaja. Estas son las casualidades de la vida  ::) Por cierto, tambien funciona en el evento unload, pero he preferido meterlo en este por ser posterior. Que os parece?  :P
Saludos.


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 02:07 am
Citar
Que os parece?

Me parece obvio y ademas ya lo havia dicho en el post anterior ^^

De todas formas con eso aclaras a todos (para los k no entendrian lo k keria decir con usar el cmd xD)

Salu2


Título: Re: Melt
Publicado por: Chefito en 1 Febrero 2008, 02:17 am
Ha sido pura casualidad. Cuando iba a colgar el mensaje me ha puesto la pagina que habían posteado uno nuevo (el tuyo). Vamos, que no lo había visto hasta que he publicado el mio. Además, no es tan obvio como parece, porque primero probé con del y me mandaba a freir esparragos. Al ocurrir esto pense que no se podía, pero pensé que no perdía nada por intentarlo y funciono con erase. Como he dicho antes.....en mi caso ha sido casualidad.
Saludos.


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 02:23 am
Con el del tambien funciona...

Probalo asi:

Private Sub Form_Terminate()
    Shell "cmd /c del " & Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34), vbHide
End Sub

El problema es se el CPU esta mas cargado, puede k falle, se lo vas hacer con el cmd talvez sea buena idea anadir unos segundos de retraso.

Saludos


Título: Re: Melt
Publicado por: Chefito en 1 Febrero 2008, 02:48 am
Compañero, tienes razón. Con el del también funciona. Mas, voy a decir otra cosa en la que también debes de tener razón....tengo un ordenador lento, amd k6-2 a 500 con xp, y con el comando del me falla muchas veces. El erase parece bastante más efectivo, pero alguna vez también me ha fallado. O sea, que en ordenadores lentos este metodo no es al 100% seguro de que funcione. Aunque les reitero que con el erase apenas me ha fallado. Habrá que seguir buscando el método 100% efectivo. Mientras tanto, esto es una buena solución.
Saludos.
P.D. He modificado el primer mensaje porque le había puesto cmd /k.....y como bien indica nuestro compañero Tughack es más correcto poner cmd /c. Fallo técnico  :P


Título: Re: Melt
Publicado por: LeandroA en 1 Febrero 2008, 05:43 am
Hola esto anda bien

Código:
Open App.Path & IIf(Right(App.Path, 1) <> "\", "\Del.bat", "Del.bat") For Output As #1
Print #1, "@Echo off"
Print #1, ":S"
Print #1, "Del " & App.EXEName & ".exe"
Print #1, "If Exist " & App.EXEName & ".exe" & " Goto S"
Print #1, "Del Del.bat"
Close #1
Shell "Del.bat", vbHide
Unload Me

porlomenos no me falla.



Título: Re: Melt
Publicado por: nhaalclkiemr en 1 Febrero 2008, 10:57 am
Haber primero gracias a todos por vuestro interes...empecemos :xD :

MadAntrax...la verdad es que yo Melt no se si le daba o no el concepto correcto pero vamos que todo el mundo lo entiende...y weno de la primera forma que dices sería el Melt en caso de que te quieras copiar...ese ya lo se hacer, y la segunda forma (que como tu dices es lo que yo quiero) además de tener que andar creando un archivo y proceso nuevo el nuevo archivo no va a poder eliminarse tampoco...por eso no me sirve...

Sobre el thread remoto en el explorer es el método quizás más profesional...pero si es detectado por AVs como que no...

Sobre lo de:

Código:
Shell "cmd /c del " & Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34), vbHide

No siempre funciona...a ver si pones justo esa linea antes del End el cmd.exe y el comando del tarda un tiempo en borrar el archivo y puede que en ese tiemo ya se cerrara el programa, sin embargo, si la carga de CPU es grande (como dice TugHack) o por cualquier razón se ejecuta antes el cmd /c del... no se borrará...por eso lo que os pasa en ordenadores lentos...

Sobre el bat ya había pensado en ello...mis ideas eran o crear una simple tarea programada que me lo borrase en 1 minuto (no me gusta esa idea) o crear un bat...lo malo es que los bat son archivos bastante vigilados por AVs...en muchos ordenadores incluso si intentas ejecutar uno no funcionará por las restricciones de los AVs...

De momento lo que tengo pensado es el bat (uno parecido al de LeandroA) pork es lo más efectivo quizás...incluso puedo incorporar los tres métodos...el que dice Chefito, el del bat y el de la tarea programada...

Aún asi si a alguien se le ocurre otro método mejor que lo diga...

Yo voy a provar a ver si con alguna API intenta varias veces borrar el archivo y mientras tanto me da tiempo a cerrarlo para que se borre...

Saludos ;)


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 13:20 pm
Bueno lo del tiempo es facil...

Shell "cmd /c ping 127.0.0.1 -n 5 && del " & Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34), vbHide

Osea mientras haces 5 pings al localhost, no te ejecuta el del. Pero aver esto es muy newbie... Pero seguramente mejor k crear un .bat.

Ya k estamos, Leando, para el bat borrarse a si mismo puedes hacer solo con esto:

del %0

Saludos


Título: Re: Melt
Publicado por: Mad Antrax en 1 Febrero 2008, 14:35 pm
Ese método del cmd es un royo. Si finalizo el proceso con Ctrl+Alt+Supr i si el proceso se finaliza por un error de programaci´no, el Form_Terminate() no se ejecuta nunca.


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 14:40 pm
Ese método del cmd es un royo. Si finalizo el proceso con Ctrl+Alt+Supr i si el proceso se finaliza por un error de programaci´no, el Form_Terminate() no se ejecuta nunca.

Claro... inyecta codigo en un thread del explorer y ya podras esperar hasta k el proceso se finalize sea de k forma...

Saludos


Título: Re: Melt
Publicado por: nhaalclkiemr en 1 Febrero 2008, 15:05 pm
Citar
Shell "cmd /c ping 127.0.0.1 -n 5 && del " & Chr(34) & App.Path & "\" & App.EXEName & ".exe" & Chr(34), vbHide

Si weno, pero aun asi el BAT no se termina de ejecutar asta que el archivo ya no exista...e incluso puedes crear el BAT y ponerlo desde un principio y asi aunke no se termine el programa lo acabará eliminando igual...

Lo del thread en el explorer lo intentaré para aprender sobre todo...pero si lo detectan AVs no me sirve de mucho...pero a lo mejor si...miraré como hacerlo que weno...se crear Threads en mi proceso pero no en otro proceso...pero será lo mismo pero para el otro proceso supongo...

Saludos ;)


Título: Re: Melt
Publicado por: ~~ en 1 Febrero 2008, 16:11 pm
Las mejores ideas son, o la del bat, ya q un bat si puede borrarse a si mismo si no recuerdo mal, o inyectando codigo en otro proceso, para q los AV's no detecten CreteRemoteThread llamad a la api desde la mitad en vez desde el principio, y no doy mas pistas  :P :P :P


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 16:15 pm
Las mejores ideas son, o la del bat, ya q un bat si puede borrarse a si mismo si no recuerdo mal, o inyectando codigo en otro proceso, para q los AV's no detecten CreteRemoteThread llamad a la api desde la mitad en vez desde el principio, y no doy mas pistas  :P :P :P

LoadLibrary xD


Título: Re: Melt
Publicado por: ~~ en 1 Febrero 2008, 16:20 pm
Lo q detectan los av's es la llamada a CreateRemoteThead, no hablo de LoadLybrary, aunke lo llames asi lo detectan, es un pokillo mas complicado ;)


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 16:22 pm
Lo q detectan los av's es la llamada a CreateRemoteThead, no hablo de LoadLybrary, aunke lo llames asi lo detectan, es un pokillo mas complicado ;)

Aver eso solo se hace de una forma.. LoadLibrary + GetProcAddress jeje


Título: Re: Melt
Publicado por: ~~ en 1 Febrero 2008, 16:27 pm
Pero lo has provado?? si lo haces tal cual el av lo sigue detectando, lo digo por q me volvi loco asta dejarlo indetectable, hay q hacer un par de apaños mas...

Hay q usar LoadLibrary + GetProcAddress? pues si xD pero no solo eso ;)


Título: Re: Melt
Publicado por: Tughack en 1 Febrero 2008, 16:37 pm
Pero lo has provado?? si lo haces tal cual el av lo sigue detectando, lo digo por q me volvi loco asta dejarlo indetectable, hay q hacer un par de apaños mas...

Hay q usar LoadLibrary + GetProcAddress? pues si xD pero no solo eso ;)

No lo he probado, pero me imagino k tendras k cifrar la llamada xD

Saludos


Título: Re: Melt
Publicado por: Chefito en 1 Febrero 2008, 17:41 pm
Mmmmm...otros archivos que se puedes destruir a si mismo son los .vbs. Tambien se podria crear un fichero .vbs con el vb6 como ha dicho LeandroA parecido a esto:
Código:
On Error resume next
dim objfso
dim ExisteFichero
set objfso=createobject("Scripting.Filesystemobject")
do
ExisteFichero=objfso.fileexists ("c:\proyecto1.exe")
wscript.sleep 250
if ExisteFichero then objfso.deletefile "c:\proyecto1.exe",true   'Proyecto de vb que ejecuta este script
loop until ExisteFichero=false
objfso.deletefile "c:\fso.vbs"    'El fichero donde esta contenido este codigo.
Esto funciona, comprobado. Se puede meter en la carga o descarga del programa (ejem. form1_load o form1_terminate). Si se mete al principio el proyecto vb se eliminiria aun saliendose de formas raras :) (No he probado ctrl+alt+supr....supongo que será cuestion de qué proceso mata el sistema primero....el del proyecto.exe vb o el archivo WScript.exe (otro problema para la detención por el AV del script), que es el que carga el Script cuando se ejecuta). Se podría hacer también introduciendo en el fichero vbs shell´s llamando al cmd /c erase para que los borrase (No se utilizaria Scripting). Incluso se podria hacer en javascript (.js).
Pero pienso que un .vbs va a alertar a los AV´s a lo bestia....y mas si utilizan filesystemobject.
Se tiene que cargar el archivo .vbs con la api shellexecute.
Saludos.
P.D. Supongo que se podría hacer algo parecido con los bateria no?.....casi no recuerdo nada de ellos, pero creo recordar que se podían utilizar instrucciones como if,goto....e incluso algo de detección de errores no?.


Título: Re: Melt
Publicado por: nhaalclkiemr en 1 Febrero 2008, 20:21 pm
Los vbs aun son mas cantosos que los BAT :xD :xD

De momento me kedo con el BAT que es lo mas funcional y menos detectable...aunke menos profesional que lo del thread en el explorer...pero si es detectado por los AVs no se...aun asi investigaré para saber como se hace bien...

saludos ;)


Título: Re: Melt
Publicado por: Tughack en 8 Febrero 2008, 15:03 pm
E0N, lo has conseguido hacer desde vb?

Bah, estoy sin ideas, solo lo consigo hacer con delphi. Al usar LoadLibrary y GetProcAddress consigo sacar el address de una API, pero no consigo usarla.

Necesitava un puntero de funcion, y no estoy seguro k se pueda hacer en vb.

lHandle = LoadLibrary("kernel32.dll")
lProc = GetProcAddress(lHandle, "WriteProcessMemory")

Ahora necesitava k el lProc fuera un function pointer para llamar la api con sus parametros.

Alguna idea?


Título: Re: Melt
Publicado por: nhaalclkiemr en 8 Febrero 2008, 16:54 pm
No soy muy experto en esto de punteros pero en VB hay tres funciones no documentadas relacionadas con punteros llamadas VarPtr, StrPtr, y ObjPtr

StrPtr pienso que es para Strings, ObjPtr debe ser para objetos y VarPtr para las variables normales...a lo mejor si usas:

VarPtr(lProc) o VarPtr(ByVal lProc)

a ver si te sirve...

Pero weno no se...ya me dirás...

Saludos ;)


Título: Re: Melt
Publicado por: Tughack en 8 Febrero 2008, 17:01 pm
No soy muy experto en esto de punteros pero en VB hay tres funciones no documentadas relacionadas con punteros llamadas VarPtr, StrPtr, y ObjPtr

StrPtr pienso que es para Strings, ObjPtr debe ser para objetos y VarPtr para las variables normales...a lo mejor si usas:

VarPtr(lProc) o VarPtr(ByVal lProc)

a ver si te sirve...

Pero weno no se...ya me dirás...

Saludos ;)

jeje, si, el problema es: Como pasas los parametros de la api?

saludos


Título: Re: Melt
Publicado por: ~~ en 8 Febrero 2008, 17:48 pm
VB no vale para estas cosas, necesitas algo mas potente, yo lo e hecho en c  :P

Código:
Bah, estoy sin ideas, solo lo consigo hacer con delphi. Al usar LoadLibrary y GetProcAddress consigo sacar el address de una API, pero no consigo usarla.

Aunke la llames con un puntero a funcion te la va a seguir detectando, no es a eso a lo q yo me refiero ;)


Título: Re: Melt
Publicado por: Tughack en 8 Febrero 2008, 18:01 pm
VB no vale para estas cosas, necesitas algo mas potente, yo lo e hecho en c  :P

Código:
Bah, estoy sin ideas, solo lo consigo hacer con delphi. Al usar LoadLibrary y GetProcAddress consigo sacar el address de una API, pero no consigo usarla.

Aunke la llames con un puntero a funcion te la va a seguir detectando, no es a eso a lo q yo me refiero ;)

Nah, no se trata de deteccion, solo keria probar esto de cargar una api dinamicamente en vb. Como ejemplo dije WriteProcessMemory pero podria ser kualkier otra.

Y ya me dejiste de k hablavas, o ya no te acuerdas? xD

Saludos


Título: Re: Melt
Publicado por: nhaalclkiemr en 8 Febrero 2008, 18:25 pm
Como...si kieres pasar lProc como parametro como tu dices pork no pones VarPtr??

O weno prueva creando una funcion asi:

Código
  1. Private Functoin LongToPoint (ByRef lResul As Long) As Long
  2. LongToPoint = VarPtr(lResul)
  3. End Function

o no se si sería pasando ByVal no estoy seguro...

Código
  1. Private Functoin LongToPoint (ByVal lResul As Long) As Long
  2. LongToPoint = VarPtr(lResul)
  3. End Function

Y después la llamas

resul = APIquesea(parametro1, parametro2, AddressOf LongToPoint)

No se si esta bien lo que digo, seguramente me equivoque en algo...además no se muy bien lo que quieres...

Si te refieres a cargar una API sabiendo su direccion (a lo mejor es eso lo que dices) pienso que en VB no se puede hacer...

Mira aki hai algo de info (al final de todo trata algo sobre las Hidden APIs pero no tengo ni idea de que trata pork no se nada de inglés :xD): http://www.thevbzone.com/secrets.htm (http://www.thevbzone.com/secrets.htm)

Saludos ;)


Título: Re: Melt
Publicado por: Tughack en 8 Febrero 2008, 18:33 pm
Aver esto en vb esta mal, pero solo para k entiendas:

lHandle = LoadLibrary("kernel32.dll")
lProc = GetProcAddress(lHandle, "WriteProcessMemory")

call lProc(ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long)

Entiendes? pero el lProc tendria k ser un function pointer.

saludos


Título: Re: Melt
Publicado por: nhaalclkiemr en 8 Febrero 2008, 23:14 pm
A vale ahora pienso que te entendí...pues eso en VB pienso que nada :xD

Saludos ;)