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 - karmany

#631
Buen trabajo.
Gracias por el aporte.

#632
Cita de: F3B14N en 22 Julio 2010, 06:22 AM
No mire en lo mas minimo el src, pero yo hacia lo mismo (creo) con este pequeño src:

Option Explicit

Private Declare Function GetMenu Lib "USER32" (ByVal hwnd As Long) As Long
Private Declare Function GetSubMenu Lib "USER32" (ByVal hMenu As Long, ByVal nPos As Long) As Long
Private Declare Function SetMenuItemBitmaps Lib "USER32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal hBitmapUnchecked As Long, ByVal hBitmapChecked As Long) As Long

Const MF_BYPOSITION = &H400&

Public Sub SetMenuIcon(cForm As Form, cMenu As Long, cSubMenu As Long, cBitmap As ListImage)
    On Error Resume Next
    Dim hMenu As Long
    Dim hSubMenu As Long
    Dim Ret As Long
     
     hMenu = GetMenu(cForm.hwnd)
     hSubMenu = GetSubMenu(hMenu, cMenu)
     Ret = SetMenuItemBitmaps(hSubMenu, cSubMenu, MF_BYPOSITION, Val(cBitmap.Picture), Val(cBitmap.Picture))
     
End Sub


Algo que es muy bueno para mejorar GUIs seria hacer lo mismo en CommandButtons, por que VB lo admite, pero tienen que tener mucha .Height para que se vea y queda MUY molesto para la vista :-X en una de esas alguien sé idea como hacerlo  :silbar:

Salu2  :D



Existen muchísimos códigos (fuente) gratuitos para modificar o crear controles con la apariencia que uno quiera. Un ejemplo es el que te manda BlackZeroX con código fuente incluido.

Respecto a tu código, tu código tiene limitaciones. Por ejemplo las imágenes tienen que ser bmp(no sé si admitirá gif, etc...) y además para que se vean correctas, tienen que tener un tamaño máximo de 13 x 13 píxeles, si las pones de más se verán cortadas.
El código de Leandro, es un código que dibuja tu propio menú como tú quieras. Manejando correctamente los mensajes WM_MEASUREITEM y WM_DRAWITEM puedes crear menús personalizados.
Tu código lo utilicé en MASM32 y aunque deja bastante que desear, pues es muy rápido y sencillo:

#633
Es para un MDI. Supongo que habrá que capturar el dobleclick con CallWindowProc(creo que se podría capturar con WM_NCLBUTTONDBLCLK), pero ahora estoy sin tiempo para probar...
Un saludo.
#634
Cita de: BlackZeroXEstoy aburrido...

Si te vuelves a aburrir, tú que eres un gran programador y yo no tengo nada de tiempo, a ver si podrías capturar el dobleclick en la barra de título de un formulario  para que no se redimensione.
#635
Me parece un excelente código. Yo utilizo algo muy parecido al tuyo utilizando igualmente los mensajes WM_MEASUREITEM y WM_DRAWITEM que ya los había probado en Visual C++.
El que yo uso no utiliza gdi+.

Has hecho un buen trabajo, yo te recomendaría también que lo postees en codeproject o planetsource o similares ya que pienso que son grandes páginas de referencias a programadores.

Muchas gracias por compartir

PD. Leandro Ascierto... muy buena página.
Un saludo
#636
Ingeniería Inversa / Ejemplo 10
19 Julio 2010, 11:14 AM
Ejemplo 10

Redimensionar matrices en VB6.
Sobre Visual Basic (IV)

Muchas veces en determinados programas, sobre todo en programas obsoletos o que ya no se desarrollan es necesario aumentar el rango de la matriz.
Esto puede resultar muy útil, ya que las matrices normalmente no están redimensionadas en ningún evento, están (normalmente) declaradas en las declaraciones de cualquier formulario o módulo y ningún programa te indica dónde están: ni VBReformer, ni VB decompiler ni ningún otro.

En este ejemplo que he hecho, he declarado una matriz: Private variable(1) As String que se compone de variable(0) y variable(1).
Está declarada dentro de las declaraciones del formulario principal.

Os voy a mostrar cómo se puede redimensionar hasta FF ==> 255... cómo encontrar ese byte escondido.

Lo primero es descargar el programa que he hecho:
Descargar el programa ReDimMatriz.exe (está como ReDimMatriz.zip) que está en el archivo .zip. El enlace está en el primer mensaje de este hilo.

Ejecutarlo, examinarlo con Ingeniería Inversa. Es muy sencillo. Si pulsáis el primer botón nos mostrará la dimensión de la variable empezando por 0.
Si se pulsa el botón segundo mostrará variable por variable.


Imagen49

¿Cómo se rellena una matriz de string desde VB6?
Pues es muy sencillo, porque para matrices de cadenas(strings) hace uso de la función __vbaStrCopy, que como su nombre indica copia una cadena de texto. Y este ejemplo es así.

Vamos a analizarlo. Poner un BP en 403477, ejecutar el programa en un depurador(OllyDBG por ej.), pulsar el segundo botón y se detendrá ahí.
00403477   .  FF15 74104000          call near dword ptr ds:[401074]                  ; MSVBVM60.__vbaStrCopy

Si vemos el registro ecx, en mi caso es 0015ef08. Si dumpeamos ese valor veremos el primer dword que se reserva para la matriz. Ese valor dword lo rellena VB con una dirección donde irá la cadena de texto.

Antes de pasar por la función  __vbaStrCopy:
0015EF08  00 00 00 00 00 00 00 00  ........

Después de pasar por la función __vbaStrCopy:
0015EF08  54 A3 16 00 00 00 00 00  T£.....

Y si dumpeo ese valor: 0016A354 vemos esto:
0016A354  76 00 61 00 72 00 69 00  v.a.r.i.
0016A35C  61 00 62 00 6C 00 65 00  a.b.l.e.
0016A364  28 00 30 00 29 00 00     (.0.)..

que es la cadena de texto que se cargará en en variable(0).

Bien, ¿qué ocurre?
Pues variable(1) está definida en las declaraciones del formulario y no se puede redimensionar así como así. Como variable(1) son dos: variable(0) y variable(1) pues en el código del programa existe un byte 02 que es el que hay que buscar...
Sólamente modificando ese byte 02 a cualquier otro valor redimensionamos la matriz. De esto se trata: de encontrar ese byte 02.

Para encontrarlo, voy a poner un Hardware Breakpoint en el dword de la variable(1) que es la segunda string. Se entiendo ¿no?, es decir, voy a poner un HBP on write dword en 0015ef0c. Reinicio OllyDBG y veo cuándo el dword de 0015ef0c se pone a 0.

Ejecuto el depurador, veo que se detiene por HBP pero el valor no es cero. Sigo ejecutando y veo que se detiene y que el valor de 0015ef0c se pone a cero!!! Aquí está.
A veces mirando los registros se puede observar de dónde se está leyendo, pero en este caso no se puede saber, así que se me ocurre ver la pila y observo lo siguiente:

0012F728   0015F0C0
0012F72C   0015F0A8
0012F730   004030B8  Proyecto.004030B8


004030B8?! podría ser éste la dirección que buscamos???
Voy a dumpear a ver:
004030B0  02 00 00 00 00 00 00 00  .......
004030B8  08 00 00 00 26 00 00 00  ...&...
004030C0  55 00 42 00 6F 00 75 00  U.B.o.u.

Como se puede observar, el byte que buscamos es el que está en 004030B0.

Así que vamos a modificar ese bytes y ponemos el valor que queramos y veréis los resultados:

Imagen50


Imagen51

Aprovechando una herramienta mía, voy a mostrar cómo modificar el byte rápidamente desde el ejecutable original que he puesto en descarga. Haré uso de File Location Calculator v0.3.2, que se puede descargar gratuitamente desde aquí:
http://tuts4you.com/download.php?view.2790

Arrastramos el programa sobre File Location Calculator, señalamos virtual address y pegamos ahí la dirección 004030B0. Simplemente pulsamos Enter o pulsamos el botón calcular. Ya se verá en los bytes el byte 02. Ahora sencillamente pulsamos el botón Editor hex, modificamos el byte y guardamos. Imagen:


Imagen52



Gracias a la colaboración (lo ha hecho el todo) de kcr_4u, es posible descargar el tutorial en pdf, hasta el 5º ejemplo (aunque está desactualizado y no se corresponde con el original):

Tutorial en pdf

GRACIAS krc_4u POR TU AYUDA.

Texto y enlaces revisados: Todos los textos y enlaces fueron corregidos y actualizados el día 13 de marzo de 2011. Asimismo todas las imágenes tienen están numeradas y todo tiene copia de seguridad.


Si alguien observa alguna cosa que debiera modificar o añadir, comentario o algún enlace roto, mandarme un mp..
Un saludo a todos.
#637
Es que cada joiner/binder/juntador actua según ha sido programado. Deberías analizarlo desde el punto de Ingeniería Inversa y ver cómo se extrae el archivo embebido.



Opinión personal:
Realmente los programas joiners/binders y crypters etc... están la mayoría catalogados como virus, algo que no es cierto pero como la mayoría de los mismos han sido usados para "esconder" virus, los antivirus los tratan como tales... Es una lástima porque para los programadores, a veces (sin pensar malignamente en introducir virus) pueden resultar muy útiles. ¿Para qué? Pues para embeber archivos, por ejemplo para extraer en temporales archivos dependientes, extraer el archivo de ayuda etc... y los crypters pues para hacer que nuestra aplicación sea más difícil de crackear.
#638
Ingeniería Inversa / Re: Hola Mundo
16 Julio 2010, 00:36 AM
Dejamos este tema por terminado, ya que el camino que está tomando no es el adecuado.

soez tu pregunta estaría mejor en el foro de programación de asm:
http://foro.elhacker.net/asm-b84.0/

Salu2
#639
25.junio.2010 - IDA Pro v5.7

Nueva versión de IDA PRO.

Su página web:
http://hex-rays.com
#640
ctlon: "si lo quieres mas facil, cuando pare en showwindow y sea la nag ves al call stack para ver de donde se llamo, si no recuerdo mal es un push eax..."

Correcto, lo que pasa es que en los programas en Delphi hay que encontrar ese valor y el compilador Borland no hace las operaciones "directamente", me explico: Si tu programas en ensamblador y ejecutas una subrutina llamada: Mostrarventana, si debugeas el programa verás que aparece pero en un Delphi NO.

Para que veas como trabaja Delphi te invito a que leas un tute mio:

Activando controles en Delphi por karmany