Bueno me harte de que pregunten esto un millon de veces, aca les dejo un codigo super simple para leer y escribir datos al final de un EXE. Creditos a E0N por la funcion para calcular el EOF
Clase:
'---------------------------------------------------------------------------------------
' Module : cEditSvr
' DateTime : 19/09/2008 13:23
' Author : Cobein
' Mail : cobein27@hotmail.com
' WebPage : http://www.advancevb.com.ar
' Purpose : Read Write data at EOF
' Usage : At your own risk
' Requirements: None
' Distribution: You can freely use this code in your own
' applications, but you may not reproduce
' or publish this code on any web site,
' online service, or distribute as source
' on any media without express permission.
'
' History : 19/09/2008 First Cut....................................................
'---------------------------------------------------------------------------------------
Option Explicit
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)
Private c_pBag As New PropertyBag
Private c_sFile As String
Private c_lEOF As Long
Public c_bHasData As Boolean
'---------------------------------------------------------------------------------------
' Procedure : GetEOF
' Author : E0N
' Purpose : Calculate EOF
'---------------------------------------------------------------------------------------
Private Function GetEOF(sPath As String) As Long
Dim vbData() As Byte
Dim PE As Long, NumberOfSections As Integer
Dim BeginLastSection As Long
Dim RawSize As Long, RawOffset As Long
Open sPath For Binary As #1
ReDim vbData(LOF(1) - 1)
Get #1, , vbData
Close #1
Call CopyMemory(PE, vbData(&H3C), 4)
Call CopyMemory(NumberOfSections, vbData(PE + &H6), 2)
BeginLastSection = PE + &HF8 + ((NumberOfSections - 1) * &H28)
Call CopyMemory(RawSize, vbData(BeginLastSection + 16), 4)
Call CopyMemory(RawOffset, vbData(BeginLastSection + 20), 4)
GetEOF = RawSize + RawOffset
End Function
Public Function ExeFile(sPath As String) As Boolean
c_sFile = sPath
c_lEOF = GetEOF(c_sFile)
If Not FileLen(c_sFile) = c_lEOF Then
c_bHasData = True
Dim vbData() As Byte
Open c_sFile For Binary As #1
ReDim vbData(LOF(1) - c_lEOF - 1)
Seek #1, c_lEOF + 1
Get #1, , vbData
Close #1
'+++++++++++++++++++++++++++++++++++++++++++++++++++++
'At this point you can Decrypt the byte array [vbData]
'+++++++++++++++++++++++++++++++++++++++++++++++++++++
Set c_pBag = New PropertyBag
c_pBag.Contents = vbData
End If
End Function
Public Sub WriteProp(sName As String, vVal As Variant)
c_pBag.WriteProperty sName, vVal
End Sub
Public Function ReadProp(sName As String) As Variant
ReadProp = c_pBag.ReadProperty(sName)
End Function
Public Function WriteData(sDstFile As String) As Boolean
Dim vbData() As Byte
Open c_sFile For Binary Access Read As #1
ReDim vbData(LOF(1) - 1)
Get #1, , vbData
Close #1
Open sDstFile For Binary Access Write As #1
Put #1, , vbData
vbData = c_pBag.Contents
'+++++++++++++++++++++++++++++++++++++++++++++++++++++
'At this point you can Encrypt the byte array [vbData]
'+++++++++++++++++++++++++++++++++++++++++++++++++++++
Put #1, , vbData
Close #1
End Function
Como llamarlo
Option Explicit
Private Sub Form_Load()
Dim c As New cEditSvr
c.ExeFile "c:\proyecto1.exe"
c.WriteProp "IP", "123.123.123.123"
c.WriteProp "Port", 1234
c.WriteData "c:\test.exe"
Set c = New cEditSvr
c.ExeFile "c:\test.exe"
Debug.Print c.ReadProp("IP")
Debug.Print c.ReadProp("Port")
End Sub
Muy bueno Cobein, yo uso el Metodo Append sin PE ni na, con este queda mas pofesionar :laugh:
Saludos :D
PD: Que es eso de PropertyBag :-\??
Interesante para aprender y muy útil, me lo guardo en mi biblioteca de códigos. Gracias cobein ;D ;D ;D ;D ;D
El propertyBag lo uso para empaquetar y desempaquetar los datos, de esa manera podes agregar la cantidad de propiedades/valores que quieras. El ejemplo tiene simplemente 2 pero se pueden seguir agregando las que sea.
Importante:Si alguno usa un code para modificar el EOF no use esto!
Che te quedo buenisimo... Un saludo
El aporte está muy bien, cobein. Al final conseguí solucionar el problema que tenía con este tema.
Saludos.
Menos mal que no empezé a hacerlo yo porque dsde hace ratico que vi un post con una duda dije "Voy a hacer un ejemplo..!" Pero contigo no se puede esperar ni 1 hora :xD
donde declaras PropertyBag??
me encanto, yo usaba uno que habia publicado Hendrix (por cierto, hace tiempo no veo posts de el), y es mas corto...
pero este esta bien, para aprender otras cositas =D
el PropertyBag no se declara, se crea un objeto referenciado hacia el...
Set c_pBag = New PropertyBag
Cita de: Karcrack en 19 Septiembre 2008, 18:56 PM
Muy bueno Cobein, yo uso el Metodo Append sin PE ni na, con este queda mas pofesionar :laugh:
Saludos :D
PD: Que es eso de PropertyBag :-\??
De que se trata el Metodo Append??
Cita de: jackl007 ツ en 20 Septiembre 2008, 04:24 AM
me encanto, yo usaba uno que habia publicado Hendrix (por cierto, hace tiempo no veo posts de el), y es mas corto...
pero este esta bien, para aprender otras cositas =D
podrias poner cual?
cobein:esto sirve para poner un exe dentro del propertybag? ya que estuve probando y de 1 exe de 10,5kb (archivo al que le inserto) y el exe de 68,8kb(el insertado) me keda un exe de 147kb.. porque? y cuando lo extraigo keda inservible..
Salu2!
@ demoniox12
Podes poner cualquier cosa dentro del propertybag, si queres postea el code a ver que estas haciendo mal.
Cita de: demoniox12 en 22 Septiembre 2008, 06:34 AM
Cita de: Karcrack en 19 Septiembre 2008, 18:56 PM
Muy bueno Cobein, yo uso el Metodo Append sin PE ni na, con este queda mas pofesionar :laugh:
Saludos :D
PD: Que es eso de PropertyBag :-\??
De que se trata el Metodo Append??
Cita de: jackl007 ツ en 20 Septiembre 2008, 04:24 AM
me encanto, yo usaba uno que habia publicado Hendrix (por cierto, hace tiempo no veo posts de el), y es mas corto...
pero este esta bien, para aprender otras cositas =D
podrias poner cual?
cobein:
esto sirve para poner un exe dentro del propertybag? ya que estuve probando y de 1 exe de 10,5kb (archivo al que le inserto) y el exe de 68,8kb(el insertado) me keda un exe de 147kb.. porque? y cuando lo extraigo keda inservible..
Salu2!
Append es una forma de abrir ficheros en VB, pero yo me refiero a que añado el fichero al final de un ejecutable separandolo por una firma creada por mi mismo
Saludos :D
[quote author=Karcrack link=topic=228494.msg1089339#msg1089339
Append es una forma de abrir ficheros en VB, pero yo me refiero a que añado el fichero al final de un ejecutable separandolo por una firma creada por mi mismo
Saludos :D
[/quote]
si, yo estoy utilizando ese mismo pero hay algunos antivirus que detectan eso.. y quiero evitarlo..
Cita de: cobein en 22 Septiembre 2008, 13:51 PM
@ demoniox12
Podes poner cualquier cosa dentro del propertybag, si queres postea el code a ver que estas haciendo mal.
Option Explicit
Private Sub Form_Load()
Dim Contenido As String
Dim nFile As Integer
nFile = FreeFile
Open "c:\proyecto1.exe" For Binary As #nFile
Contenido = Input(LOF(nFile), #nFile)
Close #nFile
Dim c As New cEditSvr
c.ExeFile "c:\proyecto1.exe"
c.WriteProp "IP", Contenido
c.WriteData "c:\test.exe"
Set c = New cEditSvr
c.ExeFile "c:\test.exe"
Open App.Path & "\exe2.exe" For Binary Access Write As #4
Put #4, , c.ReadProp("IP")
Close #4
End Sub
(la class no la modifique ni nada es la misma que pusiste...)
este code mete su mismo exe en el, es un exe de 10,5kb y keda de 31,5 en vez de ser de 21kb.. el porque nose..
salu2! y gracias de antemano ;)
Private Sub Form_Load()
Dim sData As String
Dim vbData() As Byte
Open "c:\proyecto1.exe" For Binary As #1
ReDim vbData(LOF(1) - 1)
Get #1, , vbData
Close #1
Dim c As New cEditSvr
c.ExeFile "c:\proyecto1.exe"
c.WriteProp "App", vbData
c.WriteData "c:\test.exe"
Set c = New cEditSvr
c.ExeFile "c:\test.exe"
vbData = c.ReadProp("App")
Open "c:\Extracted.exe" For Binary As #1
Put #1, , vbData
Close #1
End Sub
aqui esta:
Crear un Editor de Servers en VB (By Hendrix) (http://foro.portalhacker.net/index.php/topic,10625.0.html)
cuando hendrix andaba muy activo, pero ahora supongo que anda con trabajos...
lo cierto es que es menos codigo, eso si.
Cita de: cobein en 22 Septiembre 2008, 20:30 PM
Private Sub Form_Load()
Dim sData As String
Dim vbData() As Byte
Open "c:\proyecto1.exe" For Binary As #1
ReDim vbData(LOF(1) - 1)
Get #1, , vbData
Close #1
Dim c As New cEditSvr
c.ExeFile "c:\proyecto1.exe"
c.WriteProp "App", vbData
c.WriteData "c:\test.exe"
Set c = New cEditSvr
c.ExeFile "c:\test.exe"
vbData = c.ReadProp("App")
Open "c:\Extracted.exe" For Binary As #1
Put #1, , vbData
Close #1
End Sub
Excelente gracias! funciona de 10 =) pero ahora que estoy viendo en detalle.. esto hace basicamente lo mismo que el de Stub - marca - archivoencriptado... o sea es detectado igual que el otro.. que habria que hacer para meter el texto en el stub como si fuera parte del exe? o sea que no paresca "texto agregado" sino por ejemplo como si fuera una sección... mmm que maneras hay de modificar el PE con VB?
salu2!
A ver, posiblemente sea menos codigo hacer stub/marca/archivo o app/marca/datos pero eso no es flexible, si queres agregar mas datos tenes que modificar el codigo, de esta manera podes poner cuantos exe quieras y cuanta data quieras sin necesidad de hacer ningun cambio en el modulo. Por otra parte ese codigo lo hice en 5 minutos asi que se puede optimizar un monton para reducirlo y al final de cuentas el propertybag hace lo mismo que haces vos manualmente.
@demoniox12 seguramente el AV detecta lo que este pegado porque esta sin cifrar o encryptar, por eso mismo comente en el codigo las 2 secciones donde se puede agregar un codigo para cifrar o cifrar los datos.
mira el tuto que te puse en el posst anterior, los antivirus ni dicen nada.
Por dios!!!!!! el esta pegando un exe, lo que significa que si no lo cifra el AV va a cantar como loca! el tuto que mostras vos es simplemente para adjuntar settings.
Cita de: cobein en 22 Septiembre 2008, 21:29 PM
A ver, posiblemente sea menos codigo hacer stub/marca/archivo o app/marca/datos pero eso no es flexible, si queres agregar mas datos tenes que modificar el codigo, de esta manera podes poner cuantos exe quieras y cuanta data quieras sin necesidad de hacer ningun cambio en el modulo. Por otra parte ese codigo lo hice en 5 minutos asi que se puede optimizar un monton para reducirlo y al final de cuentas el propertybag hace lo mismo que haces vos manualmente.
@demoniox12 seguramente el AV detecta lo que este pegado porque esta sin cifrar o encryptar, por eso mismo comente en el codigo las 2 secciones donde se puede agregar un codigo para cifrar o cifrar los datos.
hmm no lo creo.. ya que encripte el notepad de windows y lo detectan los antivirus.. o sea es asi.. el stub solo me lo detectan 2 antivirus.. el stub + marca + file cifrado me lo detectan 4.. al igual que el stub + ladata de orioertybag me lo detectan los 4 y el mismo nombre de deteccion.. asi que sospecho que es por agregar informacion adicional...
salu2!
Entonces es como digo, el propertybag no tiene nada que ver con AV, el tema es que el stub y el metodo de encripcion no son FUD.
Cita de: cobein en 23 Septiembre 2008, 01:43 AM
Entonces es como digo, el propertybag no tiene nada que ver con AV, el tema es que el stub y el metodo de encripcion no son FUD.
El problema no es del metodo de encriptacion ni del stub, al menos con avira.
Estuve haciendo un par de pruebas, y avira detecta si o si un archivo, si este
tiene eof en gran cantidad.
Al hacerlo con textos "cortos" (ej: "aaaaaaaaaaaaaa") no hay problema, pero si lo
hay cuando se agregan textos "largos" (ej: string(20000, "b"))
Lo mismo sucede con el "metodo" recursos:
CitarOption Explicit
Private Declare Function BeginUpdateResource Lib "kernel32" Alias "BeginUpdateResourceA" (ByVal pFileName As String, ByVal bDeleteExistingResources As Long) As Long
Private Declare Function UpdateResource Lib "kernel32" Alias "UpdateResourceA" (ByVal hUpdate As Long, ByVal lpType As String, ByVal lpName As Long, ByVal wLanguage As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function EndUpdateResource Lib "kernel32" Alias "EndUpdateResourceA" (ByVal hUpdate As Long, ByVal fDiscard As Long) As Long
Private Function AgregarRecurso(Ruta As String, Datos As String)
Dim hRes As Long, i As Integer
Dim myStr() As Byte, b() As Byte
myStr = StrConv(Datos, vbFromUnicode)
hRes = BeginUpdateResource(Ruta, False)
UpdateResource hRes, "CUSTOM", 101, 0, myStr(0), Len(Datos)
EndUpdateResource hRes, False
End Function
Prueben:
CitarCall AgregarRecurso("c:\ss.exe", string(20000, "b"))
y veran que tambien es detectado como Dropper.
=============
Exluyendo ese problemita, es exelente aporte ;-), al menos a mi me sirve bastante para no tener que estar utilizando el metodo "Append" que te hace escribir de mas, a diferencia de este que es muy comodo.
pd: Perdon x revivir el tema :-X
Saludos ;D