| 
	
		|  Autor | Tema: Crear un PE Editor simple..  (Leído 12,843 veces) |  
	| 
			| 
					
						| demoniox12 
								
								 Desconectado 
								Mensajes: 204
								
								 
								El conocimiento es poder
								
								
								
								
								
								     | 
 
Hola! estuve buscando algun ejemplo o algo pero no encontre ninguno en vb.. alguno tiene por ahi algun ejemplo? o alguien que me guie para iniciar nomas..
 salu2! y gracias de antemano!
 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 By Demoniox |  |  |  | 
			| 
					
						| ~~ | 
 
Es muy simple, lees el archivo, rellenas las estructuras PE y las muestras. Alguna duda concreta? 
 
 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| demoniox12 
								
								 Desconectado 
								Mensajes: 204
								
								 
								El conocimiento es poder
								
								
								
								
								
								     | 
 
Es muy simple, lees el archivo, rellenas las estructuras PE y las muestras. Alguna duda concreta?
 de que manera se abre el archivo para mostrar por ejemplo el imagebase? y de que manera se guarda el archivo para guardar el imagebase modificado? salu2! PD: luego si puedo terminarlo publico el source.. |  
						| 
								|  |  
								| « Última modificación: 28 Septiembre 2008, 03:07 am por demoniox12 » |  En línea | 
 
 By Demoniox |  |  |  | 
			| 
					
						| ~~ | 
 
Pues en modo binario, lo lees y rellenas las estructuras con CopyMemory, hay varios ejemplos por el foro    Luego guardas las estructuras modificadas y listo (te recomiendo que mapees el archivo)  Salu2 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  | 
			| 
					
						| demoniox12 
								
								 Desconectado 
								Mensajes: 204
								
								 
								El conocimiento es poder
								
								
								
								
								
								     | 
 
http://rapidshare.com/files/149246470/PE.rar.htmlhe llegado hasta ahi.. con cosas que encontre y fui modificando.. pero no me guarda bien la modificacion y no logro hacerlo andar bien.. alguno puede ayudarme? puse para probar con imagebase nomas salu2! |  
						| 
								|  |  
								|  |  En línea | 
 
 By Demoniox |  |  |  | 
			| 
					
						| achernar_ 
								
								 Desconectado 
								Mensajes: 117
								
								   | 
 
No funciona leyendo el archivo en modo binario, porque si, por ejemplo, queres  explorar la estructura del formato PE para acceder a las Tablas de importacion para conocer las direcciones de memoria de las apis que llama el programa no vas a poder. Porque estas direcciones se cargan en memoria antes de que el programa empiece a correr. Para explorarlo y modificarlo hay que hacerlo mienntras el programa esta funcionando. Te recomiendo este texto:http://goodfellas.shellcode.com.ar/docz/bof/UN-shellcodes_1.txt y para explorar la memoria de un programa en funcionamiento hice este codigo de un programa que explora su propia memoria, para no tener que hacer una "DLL Injection" ni nada parecido. 'PEGAR EN UN FORMULARIO Form1'el proyecto necesita los siguientes componentes:
 'un textbox Text1 para ingresar la direccion de memoria que se quiere leer
 '(&H400000 seria la Direccion Base de la Imagen)
 'un textbox Text2 para ingresar la cantidad de bytes a leer
 ' "    "    Text3 para mostrar los bytes en Hexadecimal (Font = Fixedsys)
 '                 (Font = Fixedsys, Multiline = True, ScrollBars = 2-Vertical)
 ' "    "    Text4 para mostrar los bytes en Ascii
 '                 (Font = Fixedsys, Multiline = True, ScrollBars = 2-Vertical)
 'un boton Comman1 para iniciar la lectura
 '
 '   los bytes en Ascii no se ven bien por los caracteres no imprimibles, como
 '   el retorno de carro, el tab, y el salto de linea.
 
 Option Explicit
 
 Private Const PROCESS_ALL_ACCESS = &H1F0FFF
 
 Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
 Private Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, _
 ByVal bInheritHandle As Long, _
 ByVal dwProcId As Long) As Long
 Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, _
 ByVal lpBaseAddress As Any, _
 lpBuffer As Any, _
 ByVal nSize As Long, _
 lpNumberOfBytesWritten As Long) As Long
 
 Private Sub Command1_Click()
 LeerMemoria Text3, Text4, CLng(Trim$(Text1.Text)), CLng(Text2.Text)
 End Sub
 
 Private Sub LeerMemoria(T_Hex As TextBox, T_Ascii As TextBox, Direccion As Long, CantidadDeBytes As Long)
 Dim PID                             As Long
 Dim hProc                           As Long
 ReDim Buffer(1 To CantidadDeBytes) As Byte
 Dim ret                             As Long
 Dim Contador                        As Long
 Dim i                               As Long
 Dim ByteX                           As String
 
 PID = GetCurrentProcessId
 hProc = OpenProcess(PROCESS_ALL_ACCESS, False, PID)
 ReadProcessMemory hProc, Direccion, Buffer(1), CantidadDeBytes, ret
 
 T_Hex.Text = vbNullString
 T_Ascii.Text = vbNullString
 Contador = 0
 
 For i = 1 To CantidadDeBytes
 Contador = Contador + 1
 ByteX = Hex$(Buffer(i))
 If Len(ByteX) = 1 Then ByteX = "0" + ByteX
 T_Hex.Text = T_Hex.Text + ByteX + " "
 T_Ascii.Text = T_Ascii.Text + Chr$(Buffer(i))
 If Contador = 16 Then
 T_Hex.Text = T_Hex.Text + vbCrLf
 T_Ascii.Text = T_Ascii.Text + vbCrLf
 Contador = 0
 End If
 Next i
 
 End Sub
 
 Private Sub Form_Load()
 Text1.Text = "&H400000"
 Text2.Text = "100"
 Command1.Caption = "Leer Memoria"
 Text4.Text = vbNullString
 Text5.Text = vbNullString
 End Sub
 
 
Agregue, en cierta ocacion, una llamada a la api MessageBoxA para ver si podia obtener la direccion de mememoria de la funcion en la tabla de importacion, para poder cambiarla pero ni siquiera la encontré. VB hace cosas que supongo extraña, en la tabla solo encontre librerias de VB y nada mas. ¿Alguien sabe como llegar a obtener esas direcciones?  seria una especie de intento por hacer "API Hooking" modificando la tabla de importacion con VB. Por ahora demoniox12 te adelanto que si lees los primeros bytes a partir de la direccion &H40003c vas a encontrar la direccion de memoria donde empieza la cabecera PE, y 80 bytes mas adelante de la direccion donde empieza la cabecera PE esta almacenada la direccion donde empiezan las iTables (Tablas de Importacion), importantes en temas como Api Hooking y Shellcodes Universales. Lamentablemente creo que no hay muchos expertos en estos temas en el foro de VB6, no es por ofender a nadie, seguro que hay gente que sabe y mucho de esto, pero no creo que sean muchos por aca. Debe haber mas en los que frecuentan foros de de C o Malware, pero en esos casos vi que a gente que habla de VB los tratan como si habaran de resolver matrices con un ábaco. |  
						| 
								|  |  
								|  |  En línea | 
 
 Tengo una habilidad sorprendente para hacer cosas que no sorprenden. |  |  |  | 
			| 
					
						| ~~ | 
 
No funciona leyendo el archivo en modo binario, porque si, por ejemplo, queres  explorar la estructura del formato PE para acceder a las Tablas de importacion para conocer las direcciones de memoria de las apis que llama el programa no vas a poder. Si, si que se puede, a ver si te crees que se cargan en posiciones de memoria aleatorias xDD Luego hablamos de eso   Primero una demostración de lo que pide el amigo demoniox12: En un form: Private Sub Form_Load()    RellenarPE ("C:\pru.exe")    MsgBox Hex(inh.OptionalHeader.ImageBase)    EndEnd Sub
 En un módulo: Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal L As Long) Private Enum ImageSignatureTypes    IMAGE_DOS_SIGNATURE = &H5A4D     ''\\ MZ    IMAGE_OS2_SIGNATURE = &H454E     ''\\ NE    IMAGE_OS2_SIGNATURE_LE = &H454C  ''\\ LE    IMAGE_VXD_SIGNATURE = &H454C     ''\\ LE    IMAGE_NT_SIGNATURE = &H4550      ''\\ PE\0\0End Enum Private Type IMAGE_DOS_HEADER    e_magic As Integer        ' Magic number    e_cblp As Integer         ' Bytes on last page of file    e_cp As Integer           ' Pages in file    e_crlc As Integer         ' Relocations    e_cparhdr As Integer      ' Size of header in paragraphs    e_minalloc As Integer     ' Minimum extra paragraphs needed    e_maxalloc As Integer     ' Maximum extra paragraphs needed    e_ss As Integer           ' Initial (relative) SS value    e_sp As Integer           ' Initial SP value    e_csum As Integer         ' Checksum    e_ip As Integer           ' Initial IP value    e_cs As Integer           ' Initial (relative) CS value    e_lfarlc As Integer       ' File address of relocation table    e_ovno As Integer         ' Overlay number    e_res(0 To 3) As Integer  ' Reserved words    e_oemid As Integer        ' OEM identifier (for e_oeminfo)    e_oeminfo As Integer      ' OEM information; e_oemid specific    e_res2(0 To 9) As Integer ' Reserved words    e_lfanew As Long          ' File address of new exe headerEnd Type ' MSDOS File headerPrivate Type IMAGE_FILE_HEADER    Machine As Integer    NumberOfSections As Integer    TimeDateStamp As Long    PointerToSymbolTable As Long    NumberOfSymbols As Long    SizeOfOptionalHeader As Integer    characteristics As IntegerEnd Type ' Directory format.Private Type IMAGE_DATA_DIRECTORY    VirtualAddress As Long    Size As LongEnd Type ' Optional header format.Const IMAGE_NUMBEROF_DIRECTORY_ENTRIES = 16 Private Type IMAGE_OPTIONAL_HEADER    ' Standard fields.    Magic As Integer    MajorLinkerVersion As Byte    MinorLinkerVersion As Byte    SizeOfCode As Long    SizeOfInitializedData As Long    SizeOfUnitializedData As Long    AddressOfEntryPoint As Long    BaseOfCode As Long    BaseOfData As Long    ' NT additional fields.    ImageBase As Long    SectionAlignment As Long    FileAlignment As Long    MajorOperatingSystemVersion As Integer    MinorOperatingSystemVersion As Integer    MajorImageVersion As Integer    MinorImageVersion As Integer    MajorSubsystemVersion As Integer    MinorSubsystemVersion As Integer    W32VersionValue As Long    SizeOfImage As Long    SizeOfHeaders As Long    CheckSum As Long    SubSystem As Integer    DllCharacteristics As Integer    SizeOfStackReserve As Long    SizeOfStackCommit As Long    SizeOfHeapReserve As Long    SizeOfHeapCommit As Long    LoaderFlags As Long    NumberOfRvaAndSizes As Long    DataDirectory(0 To IMAGE_NUMBEROF_DIRECTORY_ENTRIES - 1) As IMAGE_DATA_DIRECTORYEnd Type Private Type IMAGE_NT_HEADERS    Signature As Long    FileHeader As IMAGE_FILE_HEADER    OptionalHeader As IMAGE_OPTIONAL_HEADEREnd Type ' Section headerConst IMAGE_SIZEOF_SHORT_NAME = 8 Private Type IMAGE_SECTION_HEADER   SecName As String * IMAGE_SIZEOF_SHORT_NAME   VirtualSize As Long   VirtualAddress  As Long   SizeOfRawData As Long   PointerToRawData As Long   PointerToRelocations As Long   PointerToLinenumbers As Long   NumberOfRelocations As Integer   NumberOfLinenumbers As Integer   characteristics  As LongEnd Type Public ByteArray() As Byte                  ' Byte array del archivo a leerPublic TempArray() As Byte                  ' Array temporal para reducir el ByteArrayPublic Config()    As Byte                  ' La posible configuración del archivo leidoPublic idh         As IMAGE_DOS_HEADER      ' CabecerasPublic inh         As IMAGE_NT_HEADERSPublic ish()       As IMAGE_SECTION_HEADER  Sub RellenarPE(Ruta As String)     Open Ruta For Binary As #1      ReDim ByteArray(LOF(1) - 1)      Get #1, , ByteArray    Close #1     ' Leemos el MS-DOS stub    CopyMemory idh, ByteArray(0), Len(idh)    If idh.e_magic <> IMAGE_DOS_SIGNATURE Then       MsgBox "Formato PE no válido", vbCritical, "Small Crypter"       Exit Sub    End If     ' Leemos a partir del PE\0\0 comletando a su vez:    '   -> IMAGE_FILE_HEADER     (COFF File Header)    '   -> IMAGE_OPTIONAL_HEADER (Optional  Header)    CopyMemory inh, ByteArray(idh.e_lfanew), Len(inh)    If inh.Signature <> IMAGE_NT_SIGNATURE Then       MsgBox "Formato PE no válido", vbCritical, "Small Crypter"       Exit Sub    End If     ' Leemos las distintas secciones    Dim i As Integer    ReDim ish(inh.FileHeader.NumberOfSections - 1)    For i = 0 To inh.FileHeader.NumberOfSections - 1        Call CopyMemory(ish(i), ByteArray(idh.e_lfanew + Len(inh) + Len(ish(i)) * i), Len(ish(i)))    Next i End Sub
 Verás que te muestra en un msgbox el image base del archivo C:\pru.exe, para hacer el editor simplemente muestra los distintos datos en text boxes y luego guarda los valores modificados en un nuevo archivo. 
 achernar_  Agregue, en cierta ocacion, una llamada a la api MessageBoxA para ver si podia obtener la direccion de mememoria de la funcion en la tabla de importacion, para poder cambiarla pero ni siquiera la encontré. VB hace cosas que supongo extraña, en la tabla solo encontre librerias de VB y nada mas. ¿Alguien sabe como llegar a obtener esas direcciones? seria una especie de intento por hacer "API Hooking" modificando la tabla de importacion con VB. IAT hooking, un ejemplo en C:http://hackhound.org/forum/index.php?topic=2726.0 Puedes ver como obtiene las direcciones en la iat y de más, otro ejemplo en C:http://foro.elhacker.net/programacion_cc/source_recorrer_la_iat-t208200.0.html;msg989316 Si te interesan las shellcodes universales esto te será útil, en mi ejemplo lo uso para demostrar como un virus puede llamar a las apis, pero para el caso es lo mismo (y también ves como obtener la posición en memoria de las apis a partir del formato PE, fasm):http://foro.elhacker.net/analisis_y_diseno_de_malware/source_asm_asi_llaman_los_virus_a_las_apis-t219982.0.html;msg1044189 Y ahora mismo o caigo en más ejemplos, pero ahí puedes ver como obtener la dirección en memoria de un api a partir del PE (aunque si puedes usar GetProcAddres desde el principio pues eso que te ahorras jajajajaja) Salu2 |  
						| 
								|  |  
								| « Última modificación: 30 Septiembre 2008, 12:54 pm por E0N » |  En línea | 
 
 |  |  |  | 
			| 
					
						| demoniox12 
								
								 Desconectado 
								Mensajes: 204
								
								 
								El conocimiento es poder
								
								
								
								
								
								     | 
 
Excelente! muchisimas gracias!!!
 Salu2!
 |  
						| 
								|  |  
								| « Última modificación:  1 Octubre 2008, 02:43 am por demoniox12 » |  En línea | 
 
 By Demoniox |  |  |  | 
			| 
					
						| achernar_ 
								
								 Desconectado 
								Mensajes: 117
								
								   | 
 
EON seguro que no se cargan en direcciones aleatorias, pero las direcciones que se cargan en la tabla de importacion (las de las apis que usa el programa) son diferentes en diferentes versiones de windows. Si el mismo programa lo ejecutas en un windows XP sp1 y despues lo ejecutas en un Windows XP sp2 o en español e inglés, la tabla de importacion se va a cargar con diferentes valores, porque en diferentes versiones de windows las direcciones de las apis varian, este es el problema precisamente al intentar encontrar las direccines de las apis cuando se usa una shellcode. Los valores de estas direcciones no pueden ser modificados en el binario, precisamente porque se cargan al ejecutarse el programa, en direcciones, que como dicìs, no son aleatorias.
 Con respecto al formato PE y las shelcodes universales lo hice con el masm32 y lo entiendo, con el texto de RaiSe pero la tabla de importacion de los programas en VB son el problema, solo los hechos en VB son como extraños, incluso para hacer practicas de craking son rebuscados, son distintos. Por lo menos asi lo veo yo XDDDD sobre todo por ese modo que tiene de usar las apis, como eso de reventarse cuando usan threads en vb6, evidentemente no hace un uso normal de las apis.
 
 Si los valores (direcciones de las apis) en la tabla de importacion fuesen valores estaticos y se pudiesen leer en el binario directamente, serian como las shellcodes hardcodeadas, no se pordrian "Portar los Ejecutables" a otras versiones de windows.
 
 
 |  
						| 
								|  |  
								| « Última modificación:  1 Octubre 2008, 16:31 pm por achernar_ » |  En línea | 
 
 Tengo una habilidad sorprendente para hacer cosas que no sorprenden. |  |  |  | 
			| 
					
						| ~~ | 
 
Ya, ya se todo lo que me estás diciendo y por eso te he puesto los ejemplos que te he puesto, mira mi ejemplo en fasm y pruebalo en distintos windows y verás como no falla y no es hardcode    haya la dirección de las apis a partir de su posición en la tabla de importaciones (realmente haya la posición de GetProcAddress y de ahñi saca el resto más rápidamente, aunque se podrían sacar todas así   ) VB lo único raro que puede tener es que aparte de las dll que contienen las apis propias del SO tiene su propia dll de donde saca todas las funciones, ya que un MsgBox no es lo mismo que MessageBoxA   Salu2 |  
						| 
								|  |  
								|  |  En línea | 
 
 |  |  |  |  |  
 
	
 
 
				
					
						| Mensajes similares |  
						|  | Asunto | Iniciado por | Respuestas | Vistas | Último mensaje |  
						|   |   | Algun editor de videos simple (Novato) Multimedia
 | Dacan | 4 | 5,314 |  14 Marzo 2011, 22:52 pm por Dacan
 |  
						|   |   | Crear un simple hack ayuda!! Windows
 | bxanditox | 4 | 4,749 |  25 Enero 2012, 23:10 pm por bxanditox
 |  
						|   |   | como  crear un bot simple??? Programación General
 | bolbal | 0 | 2,429 |  26 Enero 2013, 00:20 am por bolbal
 |  
						|   |   | Crear un bot de navegacion simple Programación General
 | buenoacaestamos | 5 | 3,247 |  4 Marzo 2015, 00:45 am por T. Collins
 |  
						|   |   | Crear un mensaje simple en pantalla en javascript?
							« 1 2 » Desarrollo Web
 | RevolucionVegana | 10 | 7,082 |  5 Enero 2016, 21:49 pm por RevolucionVegana
 |    |