Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: BlackZeroX en 9 Junio 2011, 09:17 am



Título: ASM en VB6 [Respuesta a Myserik]
Publicado por: BlackZeroX en 9 Junio 2011, 09:17 am
.
el código lo pongo publico ya que a mas de a uno le interese a la larga, no soy experto en ASM pero bueno.

Código
  1.  
  2. Option Explicit
  3.  
  4. Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
  5. Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
  6. Private Declare Function CallWindowProc Lib "USER32" Alias "CallWindowProcW" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  7.  
  8. Private Sub form_load()
  9. Dim bASM(0 To 27)           As Byte
  10. Dim i                       As Integer
  11. Dim sMsg                    As String
  12. Dim sTitulo                 As String
  13.  
  14.    sMsg = "Hola Mundo"
  15.    sTitulo = "Titulo de un msgbox"
  16.  
  17.    '   Cada Instruccion pesa {1 Bytes} y el numero de "_" son la cantidad de bytes esperados habitualmente si son 4 es que sea normalmente un puntero, pero eso depende del formato de la instruccion.
  18.    '   Para informacion de los OpCodes:
  19.    '   //  http://ref.x86asm.net/geek.html
  20.    '   PUSH ____
  21.    '   PUSH ____
  22.    '   PUSH ____
  23.    '   PUSH ____
  24.    '   MOV EAX, ____
  25.    '   CALL EAX
  26.    '   RET
  27.    i = 0
  28.    bASM(i) = &H68: i = LongToByte(vbYesNoCancel, bASM(), i + 1)    ' PUSH {vbYesNoCancel}      5 bytes ( 1(&H68) + long(vbYesNoCancel) ).
  29.    bASM(i) = &H68: i = LongToByte(StrPtr(sTitulo), bASM(), i + 1)  ' PUSH {StrPtr(sTitulo)}    5 bytes ( 1(&H68) + long(StrPtr(sTitulo)) )..
  30.    bASM(i) = &H68: i = LongToByte(StrPtr(sMsg), bASM(), i + 1)     ' PUSH {StrPtr(sMsg)}       5 bytes ( 1(&H68) + long(StrPtr(sMsg)) )..
  31.    bASM(i) = &H68: i = LongToByte(&H0, bASM(), i + 1)              ' PUSH {&H0}                5 bytes ( 1(&H68) + long(&H0) )..
  32.  
  33.    ' MOV {EAX},{LongToByte(GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxW")}
  34.    bASM(i) = &HB8: i = LongToByte(GetProcAddress(LoadLibrary("user32.dll"), "MessageBoxW"), bASM(), i + 1) ' 5 bytes
  35.    bASM(i) = &HFF: i = i + 1 ' CALL ___    1 bytes
  36.    bASM(i) = &HD0: i = i + 1 ' EAX         1 bytes
  37.    bASM(i) = &HC3: i = i + 1 ' RET         1 bytes
  38.    MsgBox CallWindowProc(ByVal VarPtr(bASM(0)), 0&, 0&, 0&, 0&)    ' Run ASM
  39. End Sub
  40.  
  41. Private Function LongToByte(ByVal lLong As Long, ByRef bReturn() As Byte, Optional i As Integer = 0) As Long
  42.    bReturn(i) = lLong And &HFF
  43.    bReturn(i + 1) = (lLong And &HFF00&) \ &H100
  44.    bReturn(i + 2) = (lLong And &HFF0000) \ &H10000
  45.    bReturn(i + 3) = (lLong And &HFF000000) \ &H1000000
  46.    LongToByte = i + 4
  47. End Function
  48.  
  49.  

Dulces Lunas!¡.


Título: Re: ASM en VB6 [Respuesta a Myserik]
Publicado por: BlackZeroX en 9 Junio 2011, 09:58 am
.
Solo agrego lo siguiente.

Código
  1.  
  2.    '   Cada Instruccion pesa {1 Bytes} y el numero de "_" son la cantidad de bytes esperados habitualmente si son 4 es que sea normalmente un puntero, pero eso depende del formato de la instruccion.
  3.    '   Para informacion de los OpCodes:
  4.    '   //  http://ref.x86asm.net/geek.html
  5.    '   PUSH ____
  6.    '   PUSH ____
  7.    '   PUSH ____
  8.    '   PUSH ____
  9.    '   MOV EAX, ____
  10.    '   CALL EAX
  11.    '   RET
  12.  
  13.  

Dulces Lunas!¡.


Título: Re: ASM en VB6 [Respuesta a Myserik]
Publicado por: raul338 en 9 Junio 2011, 14:34 pm
Al menos podrias poner un link al tema de donde venia (si es que no fue para revivirlo) para asi todos podamos entender de que se trataba :P


Título: Re: ASM en VB6 [Respuesta a Myserik]
Publicado por: Miseryk en 11 Junio 2011, 15:25 pm
:D:D:D gracias, lo había pensado así pero no agregar al array el GetProc, a veces la respuesta suele ser como uno la piensa :P. Gracias (Y)(Y)(Y)