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

#511
Dessa, harás que me sonroje !!! :P
#512
Este es uno de los códigos mas "simples" para llamar APIs de forma dinámica.

Como sabrás este código va en una clase. Las clases de Vb6 tienen una estructura interna donde almacenan la dirección de memoria donde se encuentran las funciones. A esta estructura se le llama vTable o Virtual Table...


Este código lo que hace es generar el código ASM para el pusheo de los parámetros y la llamada a la API, almacena ese código ASM en un array de bytes y parchea la vTable para que apunte al nuevo código ASM....

Te comento el código linea por linea:
Código (vb) [Seleccionar]

Public Function DoNotCall() As Long
'FUNCION VACIA QUE SERA PARCHEADA
End Function

Public Function CallAPIByName(ByVal sLib As String, ByVal sMod As String, ParamArray Params()) As Long
   Dim lPtr                As Long
   Dim bvASM(&HEC00& - 1)  As Byte
   Dim i                   As Long
   Dim lMod                As Long

   lMod = GetProcAddress(LoadLibraryA(sLib), sMod) 'OBTENEMOS EL PUNTERO DEL API
   If lMod = 0 Then Exit Function

   lPtr = VarPtr(bvASM(0)) 'OBTENEMOS EL PUNTERO DEL ARRAY DE BYTES VACIO
   CpyMem ByVal lPtr, &H59595958, &H4:            lPtr = lPtr + 4 'COPIAMOS EN EL ARRAY CODIGO ASM
   CpyMem ByVal lPtr, &H5059, &H2:                lPtr = lPtr + 2 'COPIAMOS EN EL ARRAY CODIGO ASM
   For i = UBound(Params) To 0 Step -1 'POR CADA PARAMETRO...
       CpyMem ByVal lPtr, &H68, &H1:              lPtr = lPtr + 1 'METEMOS UN PUSH...
       CpyMem ByVal lPtr, CLng(Params(i)), &H4:   lPtr = lPtr + 4 '...CON EL VALOR
   Next
   CpyMem ByVal lPtr, &HE8, &H1:                  lPtr = lPtr + 1 'METEMOS EL OPCODE DEL CALL
   CpyMem ByVal lPtr, lMod - lPtr - 4, &H4:       lPtr = lPtr + 4 ' Y LA DIRECCION RELATIVA
   CpyMem ByVal lPtr, &HC3, &H1 'AHORA METEMOS EL RET

   Dim lVTE                As Long
   Dim lRet                As Long

   CpyMem lVTE, ByVal ObjPtr(Me), &H4 'OBTENEMOS EL PUNTERO A LA vTABLE
   lVTE = lVTE + &H1C 'OBTENEMOS EL PUNTERO A LA DIRECCION DE LA FUNCION "zDoNotCall"
   CpyMem lRet, ByVal lVTE, &H4 ' SACAMOS LA DIRECCION ORIGINAL
   CpyMem ByVal lVTE, VarPtr(bvASM(0)), &H4 'PARCHEAMOS LA FUNCION PARA QUE EJECUTE NUESTRO CODIGO ASM
   CallAPIByName = DoNotCall
   CpyMem ByVal lVTE, lRet, &H4 'RESTAURAMOS LA FUNCION
End Function


Respecto a los primeros OPCODES que se introducen... Resulta que las llamadas a las funciones no siguen un convencion stdcall, si no que la posicion de los parametros en el stack varia segun la cantidad y el tipo de estos, ademas que para devolver valores tambien varia dependiendo del tipo variable...
Asi que los Opcodes iniciales se encargan de parchear el stack para dejar la direccion de retorno correcta ;)


Ante cualquier duda ya sabes ;)
#513
Otra alternativa mas:
Código (vb) [Seleccionar]
'KERNEL32
Private Declare Function OpenFile Lib "KERNEL32" (ByVal lpFileName As String, ByRef lpReOpenBuff As Any, ByVal wStyle As Long) As Long

Private Function DoFileExists(ByVal sPath As String) As Boolean
   Dim OFSTRUCT(&H21)  As Long
   DoFileExists = CBool(OpenFile(sPath, OFSTRUCT(0), &H4000) <> -1)
End Function

MOD:La ruta tiene una limitación de 128 caracteres... Problema de usar funciones diseñadas para 16bits :xD
#514
Scripting / Re: [RETO+Python] Buscando rangos
31 Enero 2011, 18:30 PM
Debe ser una batalla feroz.... >:D :laugh: :laugh:
#515
Esa técnica es bastante utilizada por los ofuscadores de código :) Aun así a mi no me gusta demasiado, ya que aumenta considerablemente el tamaño del código...

Por cierto, no seria necesario crear labels para los saltos si no me equivoco se puede indicar el número de linea o algo similar :)
#516
Lo unico que se me ocurre si quieres guardarlo como cadena de texto es pasar los opcodes a hexadecimal y almacenarlos así... es decir... si un fichero empieza por MZ tu cifrarias 4D54 y despues lo descifrarias....
#517
Muchos de los opcodes de un fichero en forma binaria no se pueden mostrar en texto...
#518
ManijaProceso = pi.hProcess
#519
Si habia pensado eso hace tiempo, pero en vez de para llamar codigo ASM (Ya que para hacer eso hay formas mas simples) para hacer un Invoke :)
Muy buen codigo :) Aunque usando Arrays para meter el codigo ASM te ahorras VirtualAlloc/VirtualFree ;)

PD: Por favor del codigo largo desactiva el Geshi, sino llena una pagina completa... mejor por solo [code][/code]
#520
http://foro.elhacker.net/analisis_y_diseno_de_malware/taller_asi_funcionan_los_crypters_encriptando_malware_a_mano-t262806.0.html
Supuse que te referias a eso, pero no se que quieres decir con lo de stub :xD