[Pauscal] Funciones indocumentada de MSVBVM60

Iniciado por Yuki, 1 Diciembre 2015, 20:36 PM

0 Miembros y 1 Visitante están viendo este tema.

Yuki

Buenas, les traigo una serie de funciones indocumentadas de MSVBVM60 que logre reversear (creo que así se dice, o crackear, no se...) con OllyDbg, PeExplorer, programación y muchisima depuración.

El código esta escrito en Pauscal.

Hasta ahora logre obtener 51 funciones, algunas ya son conocidas... otras son nuevas.
Obviamente las documente lo mejor que pude, espero que las disfruten.

Código (vb) [Seleccionar]
' Programador: Yuki
' Formato de cadenas: Unicode
' Estado de funciones: Indocumentadas
' Cantidad de funciones declaradas: 51
' MSBVM60 esta disponible en las versiones mas actuales de Windows.

Prototipo pDllFunctionCall(Referencia CallData:DllCallData):Entero

Privado:
        Proc LoadLibrary(Referencia lpLibFileName:Cadena):Entero,"Kernel32" "LoadLibraryA"
        Proc GetProcAddress(hModule:Entero,Referencia lpProcName:Cadena):Entero,"Kernel32" "GetProcAddress"
Público:

Estruc DllCallData,_
       Libreria,_                    ' El nombre de la Dll.
       Función:Cadena,_       ' El nombre del procedimiento.
       Unknown1:Entero,_        ' Desconocido.
       Unknown2:Entero          ' Dirección de una variable de almacenamiento.

' #======================= Misceláneos ========================
' ======================== INFORMACIÓN ========================
' Descripción: Verifica si una cadena esta vacia.
' Parametros:   #1 - Cadena a verificar (EN FORMATO UNICODE).
' Devuelve: Verdad si la cadena esta vacia, falso si no es así.
' ====================== FIN INFORMACIÓN ======================
Proc IsEmpty(Referencia Parametro1:Cadena):Booleano, "MSVBVM60" "rtcIsEmpty"

' ======================== INFORMACIÓN ========================
' Descripción: Verifica si una cadena es nulo.
' Parametros:   #1 - Cadena a verificar (EN FORMATO UNICODE).
' Devuelve: Verdad si la cadenas contiene valor nulo, falso si no es así.
' ====================== FIN INFORMACIÓN ======================
Proc IsNull(Referencia Parametro1:Cadena):Booleano, "MSVBVM60" "rtcIsNull"

' ======================== INFORMACIÓN ========================
' Descripción: Verifica si el parametro establecido es un arreglo.
' Parametros:   #1 - Puntero al dato a verificar.
' Devuelve: Verdad si es un puntero a un arreglo, falso si no es así.
' ====================== FIN INFORMACIÓN ======================
Proc IsArray(Parametro1:Entero):Booleano, "MSVBVM60" "rtcIsArray"

' ======================== INFORMACIÓN ========================
' Descripción: Verifica si una cadena es de tipo numerica.
' Parametros:   #1 - Cadena a verificar (EN FORMATO UNICODE).
' Devuelve: Verdad si la cadena es numerica, falso si no es así.
' ====================== FIN INFORMACIÓN ======================
Proc IsNumeric(Referencia Parametro1:Cadena):Booleano, "MSVBVM60" "rtcIsNumeric"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene el tipo del parametro establecido.
' Parametros:   #1 - Puntero al dato a obtener tipo.
' Devuelve: Tipo de dato que establecimos.
' ====================== FIN INFORMACIÓN ======================
Proc VarType(Parametro1:Entero):Entero, "MSVBVM60" "rtcVarType"

' ======================== INFORMACIÓN ========================
' Descripción: Verifica si el primer parametro es un objeto.
' Parametros:   #1 - Puntero a analizar.
' Devuelve: Verdad si el parametro es un objeto, falso si no es así.
' ====================== FIN INFORMACIÓN ======================
Proc IsObject(Parametro1:Entero):Booleano, "MSVBVM60" "rtcIsObject"

' ======================== INFORMACIÓN ========================
' Descripción: Procesa los eventos pendientes.
' Parametros: Ninguno.
' Devuelve: La cantidad de formularios disponibles.
' ====================== FIN INFORMACIÓN ======================
Proc DoEvents:Entero, "MSVBVM60" "rtcDoEvents"

' ======================== INFORMACIÓN ========================
' Descripción: Emite un sonido por el altavoz del equipo.
' Parametros: Ninguno.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc vbBeep, "MSVBVM60" "rtcBeep"

' ======================== INFORMACIÓN ========================
' Descripción: Crea una carpeta.
' Parametros:   #1 - Ruta de la carpeta a crear (EN FORMATO UNICODE).
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc MkDir(Referencia Parametro1:Cadena), "MSVBVM60" "rtcMakeDir"

' ======================== INFORMACIÓN ========================
' Descripción: Elimina una carpeta.
' Parametros:   #1 - Ruta de la carpeta a eliminar (EN FORMATO UNICODE).
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc RmDir(Referencia Parametro1:Cadena), "MSVBVM60" "rtcRemoveDir"

' ======================== INFORMACIÓN ========================
' Descripción: ???
' Parametros: Ninguno.
' Devuelve: ???
' ====================== FIN INFORMACIÓN ======================
Proc LocaleID:Entero, "MSVBVM60" "rtcGetHostLCID"

' ======================== Memoria ========================
' ======================== INFORMACIÓN ========================
' Descripción: Lee/Obtiene un Byte (1 bytes) de una dirección en memoria.
' Parametros:   #1 - Dirección en memoria del dato a obtener 1 byte.
'               #2 - Variable de tipo Byte que recibirá el byte copiado.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc GetByte(Dirección:Entero,Referencia Retorno:Byte), "MSVBVM60" "GetMem1"

' ======================== INFORMACIÓN ========================
' Descripción: Lee/Obtiene un WordSig (2 bytes) de una dirección en memoria.
' Parametros:   #1 - Dirección en memoria del dato a obtener 1 WordSig (2 bytes).
'               #2 - Variable de tipo WordSig que recibirá los 2 bytes copiados.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc GetWord(Dirección:Entero,Referencia Retorno:WordSig), "MSVBVM60" "GetMem2"

' ======================== INFORMACIÓN ========================
' Descripción: Lee/Obtiene un EnteroSig (4 bytes) de una dirección en memoria.
' Parametros:   #1 - Dirección en memoria del dato a obtener 1 Entero (4 bytes).
'               #2 - Variable de tipo Entero que recibirá los 4 bytes copiados.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc GetDWord(Dirección:Entero,Referencia Retorno:EnteroSig), "MSVBVM60" "GetMem3"

' ======================== INFORMACIÓN ========================
' Descripción: Lee/Obtiene un Decimal (8 bytes) de una dirección en memoria.
' Parametros:   #1 - Dirección en memoria del dato a obtener 1 Decimal (8 bytes).
'               #2 - Variable de tipo Decimal que recibirá los 8 bytes copiados.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc GetQWord(Dirección:Entero,Referencia Retorno:Decimal), "MSVBVM60" "GetMem4"

' ======================== INFORMACIÓN ========================
' Descripción: Escribe un Byte (1 bytes) en un dato.
' Parametros:   #1 - Dirección en memoria del dato a escribir 1 Byte (1 bytes).
'               #2 - Valor de tipo Byte a escribir.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc PutByte(Destino:Entero,Valor:Byte), "MSVBVM60" "PutMem1"

' ======================== INFORMACIÓN ========================
' Descripción: Escribe un WordSig (2 bytes) en un dato.
' Parametros:   #1 - Dirección en memoria del dato a escribir 1 WordSig (2 bytes).
'               #2 - Valor de tipo WordSig a escribir.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc PutWord(Destino:Entero,Valor:WordSig), "MSVBVM60" "PutMem2"

' ======================== INFORMACIÓN ========================
' Descripción: Escribe un EnteroSig (4 bytes) en un dato.
' Parametros:   #1 - Dirección en memoria del dato a escribir 1 EnteroSig (4 bytes).
'               #2 - Valor de tipo EnteroSig a escribir.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc PutDWord(Destino:Entero,Valor:EnteroSig), "MSVBVM60" "PutMem3"

' ======================== INFORMACIÓN ========================
' Descripción: Escribe un Decimal (8 bytes) en un dato.
' Parametros:   #1 - Dirección en memoria del dato a escribir 1 Decimal (8 bytes).
'               #2 - Valor de tipo Decimal a escribir.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc PutQWord(Destino:Entero,Valor:Decimal), "MSVBVM60" "PutMem4"

' ======================== INFORMACIÓN ========================
' Descripción: Copia los datos de una dirección en memoria a otra.
' Parametros:   #1 - Longitud de bytes a copiar.
'               #2 - Dirección del destino de los datos a copiar.
'               #3 - Dirección de la fuente de los datos a copiar.
' Devuelve: Nada.
' Detelles: Vease API CopyMemory.
' ====================== FIN INFORMACIÓN ======================
Proc CopyBytes(Tamaño,Destino,Fuente:Entero), "MSVBVM60" "__vbaCopyBytes"

' ======================== INFORMACIÓN ========================
' Descripción: Carga en memoria una libreria.
' Parametros:   #1 - Nombre o dirección de la DLL a cargar en memoria (EN FORMATO ANSI).
' Devuelve: Modulo de la DLL cargada.
' Detelles: Vease API LoadLibrary.
' ====================== FIN INFORMACIÓN ======================
Proc LibraryLoad(Referencia Libreria:Cadena):Entero, "MSVBVM60" "EbLibraryLoad"

' ======================== INFORMACIÓN ========================
' Descripción: Descarga en memoria una libreria.
' Parametros:   #1 - Puntero al modulo devuelto por LibraryLoad/LoadLibrary.
' Devuelve: Nada
' Detelles: Vease API FreeLibrary.
' ====================== FIN INFORMACIÓN ======================
Proc LibraryUnload(vbLibLoadPtr:Entero), "MSVBVM60" "EbLibraryUnload"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene la dirección en memoria de una cadena.
' Parametros:   #1 - Cadena a obtener puntero (ASCII o UNICODE).
' Devuelve: Dirección en memoria de la cadena establecida.
' Detelles: Esta API crea una copia del parametro que es establecido.
' ====================== FIN INFORMACIÓN ======================
Proc StrPtr(Str:Cadena):Entero, "MSVBVM60" "VarPtr"

' ======================== Colores ========================
' ======================== INFORMACIÓN ========================
' Descripción: Obtiene el valor entero de una combinación RGB/RVA.
' Parametros:   #1 - Valor del color Rojo (0 - 255).
'               #2 - Valor del color Verde (0 - 255).
'               #3 - Valor del color Azul (0 - 255).
' Devuelve: Valor entero que representa el color RGB.
' ====================== FIN INFORMACIÓN ======================
Proc vbRGB(R,G,B:Byte):Entero, "MSVBVM60" "rtcRgb"

' ======================== Conversión de datos. ========================
' ======================== INFORMACIÓN ========================
' Descripción: Convierte un valor de tipo WordSig (2 bytes) a cadena.
' Parametros:   #1 - Valor de tipo WordSig a convertir.
' Devuelve: Cadena del parametro establecido (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc vbaStrI2(Number:WordSig):Cadena,"MSVBVM60" "__vbaStrI2"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte un valor de tipo EnteroSig (4 bytes) a cadena.
' Parametros:   #1 - Valor de tipo Entero a convertir.
' Devuelve: Cadena del parametro establecido (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc vbaStrI4(Number:EnteroSig):Cadena,"MSVBVM60" "__vbaStrI4"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte un valor de tipo Decimal (8 bytes) a cadena.
' Parametros:   #1 - Valor de tipo Decimal a convertir.
' Devuelve: Cadena del parametro establecido (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc vbaStrCy(Number:Decimal):Cadena,"MSVBVM60" "__vbaStrCy"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte un valor de tipo Real (8 bytes) a cadena.
' Parametros:   #1 - Valor de tipo Real a convertir.
' Devuelve: Cadena del parametro establecido (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc vbaStrR8(Number:Real):Cadena,"MSVBVM60" "__vbaStrR8"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte un valor de tipo Byte (1 bytes) a cadena.
' Parametros:   #1 - Valor de tipo Byte a convertir.
' Devuelve: Cadena del parametro establecido (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc vbaStrUI1(Number:Byte):Cadena,"MSVBVM60" "__vbaStrUI1"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena a WordSig (2 bytes).
' Parametros:   #1 - Cadena de numerica que se procesará (EN FORMATO UNICODE).
' Devuelve: Parametro de cadena convertido a WordSig.
' ====================== FIN INFORMACIÓN ======================
Proc vbaI2Str(Referencia Number:Cadena):WordSig,"MSVBVM60" "__vbaI2Str"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena a EnteroSig (4 bytes).
' Parametros:   #1 - Cadena de numerica que se procesará (EN FORMATO UNICODE).
' Devuelve: Parametro de cadena convertido a EnteroSig.
' ====================== FIN INFORMACIÓN ======================
Proc vbaI4Str(Referencia Number:Cadena):EnteroSig,"MSVBVM60" "__vbaI4Str"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena a Decimal (8 bytes).
' Parametros:   #1 - Cadena de numerica que se procesará (EN FORMATO UNICODE).
' Devuelve: Parametro de cadena convertido a Decimal.
' ====================== FIN INFORMACIÓN ======================
Proc vbaCyStr(Referencia Number:Cadena):Decimal,"MSVBVM60" "__vbaCyStr"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena a Real (8 bytes).
' Parametros:   #1 - Cadena de numerica que se procesará (EN FORMATO UNICODE).
' Devuelve: Parametro de cadena convertido a Real.
' ====================== FIN INFORMACIÓN ======================
Proc vbaR8Str(Referencia Number:Cadena):Real,"MSVBVM60" "__vbaR8Str"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena a Byte (1 bytes).
' Parametros:   #1 - Cadena de numerica que se procesará (EN FORMATO UNICODE).
' Devuelve: Parametro de cadena convertido a Byte.
' ====================== FIN INFORMACIÓN ======================
Proc vbaUI1Str(Referencia Number:Cadena):Byte,"MSVBVM60" "__vbaUI1Str"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena UNICODE a ANSI.
' Parametros:   #1 - Puntero a variable de tipo entero que recibira el puntero a la cadena convertida.
'               #2 - Cadena de caracteres que se a de convertir a ANSI (EN FORMATO UNICODE).
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc StrToAnsi(Retorno:Entero,Referencia Palabra:Cadena), "MSVBVM60" "__vbaStrToAnsi"

' ======================== INFORMACIÓN ========================
' Descripción: Convierte una cadena ANSI a UNICODE.
' Parametros:   #1 - Puntero a variable de tipo entero que recibira el puntero a la cadena convertida.
'               #2 - Cadena de caracteres que se a de convertir a UNICODE (EN FORMATO ANSI).
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc StrToUnicode(Retorno:Entero,Referencia Palabra:Cadena), "MSVBVM60" "__vbaStrToUnicode"

' ======================== Cadenas ========================
' ======================== INFORMACIÓN ========================
' Descripción: Crea una cadena de Nulos con el tamaño establecido.
' Parametros:   #1 - Longitud de la cadena que devolvera la función.
' Devuelve: Cadena de longitud establecida (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc Space(Longeur:Entero):Cadena,"MSVBVM60" "rtcSpaceBstr"

' ======================== INFORMACIÓN ========================
' Descripción: Invierte una cadena.
' Parametros:   #1 - Cadena que se invertira (EN FORMATO UNICODE).
' Devuelve: Cadena invertida (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc StrReverse(sStr:Cadena):Cadena,"MSVBVM60" "rtcStrReverse"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene el caracter ANSI de un valor.
' Parametros:   #1 - Valor a obtener caracter.
' Devuelve: Caracter del valor establecido (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc Chr(bChr:Byte):Cadena,"MSVBVM60" "rtcBstrFromAnsi"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene caracteres del lado izquierdo de una cadena.
' Parametros:   #1 - Cadena a extraer caracteres (EN FORMATO UNICODE).
'               #2 - Longitud a obtener.
' Devuelve: Cadena de caracteres extaida (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc Left(Referencia sStr:Cadena,iLen:Entero):Cadena,"MSVBVM60" "rtcLeftCharBstr"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene caracteres del lado derecho de una cadena.
' Parametros:   #1 - Cadena a extraer caracteres (EN FORMATO UNICODE).
'               #2 - Longitud a obtener.
' Devuelve: Cadena de caracteres extaida (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc Right(Referencia sStr:Cadena,iLen:Entero):Cadena,"MSVBVM60" "rtcRightCharBstr"

' ======================== INFORMACIÓN ========================
' Descripción: Elimina todos los espaciós del lado izquierdo y derecho de la cadena establecida.
' Parametros:   #1 - Cadena a eliminar espacios.
' Devuelve: Cadena establecida sin espacios (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc Trim(Referencia ItemPtr:Cadena):Cadena,"MSVBVM60" "rtcTrimBstr"

' ======================== INFORMACIÓN ========================
' Descripción: Elimina todos los espaciós del lado izquierdo de la cadena establecida.
' Parametros:   #1 - Cadena a eliminar espacios.
' Devuelve: Cadena establecida sin espacios (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc LTrim(Referencia ItemPtr:Cadena):Cadena,"MSVBVM60" "rtcLeftTrimBstr"

' ======================== INFORMACIÓN ========================
' Descripción: Elimina todos los espaciós del lado derechi de la cadena establecida.
' Parametros:   #1 - Cadena a eliminar espacios.
' Devuelve: Cadena establecida sin espacios (EN FORMATO UNICODE).
' ====================== FIN INFORMACIÓN ======================
Proc RTrim(Referencia ItemPtr:Cadena):Cadena,"MSVBVM60" "rtcRightTrimBstr"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene la longitud de una cadena.
' Parametros:   #1 - Texto a obtener longitud (EN FORMATO UNICODE).
' Devuelve: Longitud de la cadena establecido.
' ====================== FIN INFORMACIÓN ======================
Proc Len(Referencia Expresion:Cadena):Entero, "MSVBVM60" "__vbaLenBstr"

' ======================== Archivos ========================
' Descripción: Obtiene el tamaño de un archivo.
' Parametros:   #1 - Ruta del archivo a obtener tamaño (en formato UNICODE).
' Devuelve: Tamaño del archivo.
' ====================== FIN INFORMACIÓN ======================
Proc FileLen(Referencia Parametro1:Cadena):Entero, "MSVBVM60" "rtcFileLen"

' ======================== Matematicas ========================
' ======================== INFORMACIÓN ========================
' Descripción: Obtiene la tangente de un valor real.
' Parametros:   #1 - Valor de tipo real a obtener tangente.
' Devuelve: Tangente del valor establecido.
' ====================== FIN INFORMACIÓN ======================
Proc vbTan(Parametro1:Real):Real, "MSVBVM60" "rtcTan"

' ======================== INFORMACIÓN ========================
' Descripción: Obtiene el exponente de un valor real.
' Parametros:   #1 - Valor de tipo real a obtener exponente.
' Devuelve: Exponente del valor establecido.
' ====================== FIN INFORMACIÓN ======================
Proc vbExp(Parametro1:Real):Real, "MSVBVM60" "rtcExp"

' ======================== Otros ========================
' ======================== INFORMACIÓN ========================
' Descripción: Destruye una matriz.
' Parametros:   #1 - Reservado, debe ser cero.
'               #2 - Puntero a la matriz a borrar.
' Detalles: Esta función no redimenciona la matriz, pero vuelve esta in-utilizable.
' Devuelve: Nada.
' ====================== FIN INFORMACIÓN ======================
Proc ArrayDestruct(Reservado,PtrMatriz:Entero), "MSVBVM60" "__vbaAryDestruct"

' ======================== INFORMACIÓN ========================
' Descripción: Destruye una matriz.
' Parametros:   #1 - Reservado, debe ser cero.
'               #2 - Puntero a la matriz a borrar.
' Devuelve: Nada.
' Detalles: Esta función no redimenciona la matriz, pero vuelve esta in-utilizable.
' ====================== FIN INFORMACIÓN ======================
Proc Erase(Reservado,PtrMatriz:Entero), "MSVBVM60" "__vbaErase"

' ======================== INFORMACIÓN ========================
' Descripción: Carga dinamicamente un procedimiento de una libreria en memoria.
' Parametros:   #1 - Estructura DllCallData con los datos requeridos.
' Devuelve: Si la función tiene exito, el procedimiento devuelve la dirección del procedimiento
' establecido en "Parametro1.Procedure" miembro.
' Si la función falla, retorna 0.
' Detalles: Utilize AdmErr para controlar el error de acceso a memoria.
' ====================== FIN INFORMACIÓN ======================
Proc DllFunctionCall(Referencia CallData:DllCallData):Entero
        Var Ptr,PtrProc:Entero,Call:pDllFunctionCall
        Ptr = LoadLibrary("MSVBVM60")
        Si Ptr = 0 Entonces GenerarError &C4855647
        PtrProc = GetProcAddress(Ptr,"DllFunctionCall")
        Si PtrProc = 0 Entonces GenerarError &C0D2DECF
        Call@ = PtrProc
        AdmErr
                Resultado = Call(CallData)
        Controlar
                ' Si se produce un error, no hacer nada.
        FinAdmErr
FinProc

También me gustaria, si conocen alguna función indocumentada de MSVBVM60 la comenten en este post.

Si tienen alguna duda sobre (casi) cualquiera de estas funciones, por favor no duden en preguntar.

Saludos!