Anuncio

Colapsar
No hay anuncio todavía.

[Guía] - Crear una DLL en ASM (Primeros Pasos)

Colapsar
X
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes
    • Compartir

    [Guía] - Crear una DLL en ASM (Primeros Pasos)

    Originalmente publicado por MG-StaT
    Hola a todos, en esta oportunidad voy a intentar explicar Basicamente como crear nuestra propia DLL en ASM, explicare de forma Sencilla sin Terminos que puedan resultar extraños de esa forma todos podrán comprender sin problemas. Cabe destacar que esta guia la publico en esta Zona siendo la de Desarrollo por el echo de que esta guia la ire actualizando a medida que mis tiempos me lo permitan con funciones utiles y las que para ustedes suelen ser las mas importantes. Comensemos:

    Antes de meternos a armar una DLL en ASM (sea en ASM o en C++ o cualquier otro lenguaje) lo primero que debemos saber/comprender es como es la estructura de la misma, y donde poner cada linea, mas basicamente como es su esqueleto:
    Esqueleto de una DLL en ASM:

    Código PHP:
    .386
    .Model flatStdCall
    Option CaseMap
    :none
    ;///////////////////////////////////////////////////////////
    ;Al hacer include evitamos definir Macro por macro
    ;//////////////////////////////////////////////////////////
    Include masm32includewindows.inc
    Include masm32includeuser32.inc
    Include masm32includekernel32.inc
    Include masm32includemasm32.inc
    IncludeLib masm32libuser32
    .lib
    IncludeLib masm32libkernel32
    .lib
    IncludeLib masm32libmasm32
    .lib

    .Const
    ;
    /////////////////////////////////
    ;Constantes a Declarar
    ;/////////////////////////////////

    .Data
    ;///////////////////////////////
    ;Informacion Inicializada!
    ;
    //////////////////////////////

    .Data?
    ;
    //////////////////////////////
    ;Informacion sin Inicializar
    ;/////////////////////////////

    .Code
    DLLEntry Proc hInstDLL
    :HINSTANCEreason:DWordreserved1:DWord
    Mov Eax
    TRUE
    Ret
    DLLEntry EndP 
    Ahora sabiendo basicamente como es el esqueleto de una DLL en ASM intentaremos construir nuestro primer "Proc" el cual esta vez sera la carga de un .INI donde podremos settear varias opciones del servidor.

    Código PHP:
        INILoad Proc
        
    ;/////////////////////////////////////////////////////////////////
        
    INILoad es el Nombre del Proc
        
    Aqui es donde definiremos las opciones de nuestro .INI
        
    ;////////////////////////////////////////////////////////////////
        
    Invoke GetPrivateProfileIntAAddr SectionsAddr BlessPrice9000000Addr [IniFile]
        
    Mov DWord Ptr Ds:[508467H], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr SoulPrice6000000Addr [IniFile]
        
    Mov DWord Ptr Ds:[508446H], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosPrice810000Addr [IniFile]
        
    Mov DWord Ptr Ds:[508489H], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr LifePrice45000000Addr [IniFile]
        
    Mov DWord Ptr Ds:[5084ABH], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr CreationPrice36000000Addr [IniFile]
        
    Mov DWord Ptr Ds:[5084CCH], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr ExcelentDrop2000Addr [IniFile]
        
    Mov DWord Ptr Ds:[41A492H], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1050Addr [IniFile]
        
    Mov DWord Ptr Ds:[49136FH], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1145Addr [IniFile]
        
    Mov DWord Ptr Ds:[49139AH], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1245Addr [IniFile]
        
    Mov DWord Ptr Ds:[4913C5H], Eax
        Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1345Addr [IniFile]
        
    Mov DWord Ptr Ds:[4913F0H], Eax 

    Explicacion basica de las lineas de nuestro Proc:

    Código:
    Invoke GetPrivateProfileIntA, Addr Sections, Addr BlessPrice, 9000000, Addr [IniFile]
    Invoke GetPrivateProfileIntA = Es la funcion necesaria para poder cargar nuestro archivo de configuracion (el Ini es nuestro caso).

    Addr Sections = Aqui agregamos la Seccion donde adicionaremos nuestra Opcion del .INI (La KEY)..Ejemplo: "Sections" = CommonOptions (en el .ini se escribiria [CommonOptions]).

    Addr BlessPrice, 9000000 = Aqui agregamos el nombre de lo que modificaremos en este caso se trata del Precio del Bless, y 9000000 Es el valor (precio) standard que se le asignara a esta opcion en caso de que ninguna otra sea definida dentro del .ini

    [IniFile] = Representa el nombre de Nuestro Archivo .ini el cual es definido previamente en nuestro source de la DLL.

    Código:
    Mov DWord Ptr Ds:[508467H], Eax
    508467 = Este es el Offset osea la direccion del GameServer donde se encuentra asignado el valor del Precio del Bless en este caso.

    Código:
    INILoad EndP
    Nos indica que el "Proc" osea la funcion de nuestra DLL termina allí donde se escriba eso.
    Ahora ustedes habran notado que muchisimas de las Lineas de nuestro Proc necesitan ser Declaradas previamente antes de su Uso, por lo cual a continuacion veremos el Esqueleto de La DLL ya visto con este Proc agregado y con todas sus declaraciones echas para poder ser utilizado:

    Código PHP:
    386
    .Model flatStdCall
    Option CaseMap
    :none
    ;///////////////////////////////////////////////////////////
    ;Al hacer include evitamos definir Macro por macro
    ;//////////////////////////////////////////////////////////
    Include masm32includewindows.inc
    Include masm32includeuser32.inc
    Include masm32includekernel32.inc
    Include masm32includemasm32.inc
    IncludeLib masm32libuser32
    .lib
    IncludeLib masm32libkernel32
    .lib
    IncludeLib masm32libmasm32
    .lib

    .Const
    ;
    /////////////////////////////////
    ;Constantes a Declarar
    ;/////////////////////////////////

    .Data
    ;///////////////////////////////
    ;Informacion Inicializada!
    ;
    //////////////////////////////
    IniFile DB "./CMT.ini";Nome do INI
    Sections DB 
    "CommonOptions";Nome do Sections
    BlessPrice DB 
    "BlessPrice"0
    SoulPrice DB 
    "SoulPrice"0
    ChaosPrice DB 
    "ChaosPrice"0
    LifePrice DB 
    "LifePrice"0
    CreationPrice DB 
    "CreationPrice"0
    ExcelentDrop DB 
    "ExcelentDrop"0
    SoulRate DB 
    "SoulRate"0
    ChaosMix10 DB 
    "ChaosMix10"0
    ChaosMix11 DB 
    "ChaosMix11"0
    ChaosMix12 DB 
    "ChaosMix12"0
    ChaosMix13 DB 
    "ChaosMix13"0
    .Data?
    ;
    //////////////////////////////
    ;Informacion sin Inicializar
    ;/////////////////////////////

    .Code
    DLLEntry Proc hInstDLL
    :HINSTANCEreason:DWordreserved1:DWord
    Mov Eax
    TRUE
    Ret
    DLLEntry EndP
    ;--------------------------------------------------------------------
    ;--------------------------------------------------------------------
    INILoad Proc
    ;/////////////////////////////////////////////////////////////////
    INILoad es el Nombre del Proc
    Aqui es donde definiremos las opciones de nuestro .INI
    ;////////////////////////////////////////////////////////////////
    Invoke GetPrivateProfileIntAAddr SectionsAddr BlessPrice9000000Addr [IniFile]
    Mov DWord Ptr Ds:[508467H], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr SoulPrice6000000Addr [IniFile]
    Mov DWord Ptr Ds:[508446H], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosPrice810000Addr [IniFile]
    Mov DWord Ptr Ds:[508489H], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr LifePrice45000000Addr [IniFile]
    Mov DWord Ptr Ds:[5084ABH], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr CreationPrice36000000Addr [IniFile]
    Mov DWord Ptr Ds:[5084CCH], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr ExcelentDrop2000Addr [IniFile]
    Mov DWord Ptr Ds:[41A492H], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1050Addr [IniFile]
    Mov DWord Ptr Ds:[49136FH], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1145Addr [IniFile]
    Mov DWord Ptr Ds:[49139AH], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1245Addr [IniFile]
    Mov DWord Ptr Ds:[4913C5H], Eax
    Invoke GetPrivateProfileIntA
    Addr SectionsAddr ChaosMix1345Addr [IniFile]
    Mov DWord Ptr Ds:[4913F0H], Eax
    INILoad EndP
    ;--------------------------------------------------------------------
    ;--------------------------------------------------------------------
    End DLLEntry 

    Cabe destacar que aquí tambien hemos agregado otra linea mas al final la cual es -- "End DLLEntry" esta linea nos indica que nuestra DLL finaliza alli.

    Antes de poder compilar nuestra DLL correctamente debemos crear un archivo de Modulo de Referencia, el cual definira el Nombre de nuestra DLL asi como el Nombre de las Opciones que nuestra DLL necesitara Exportar, Para eso debemos crear un archivo que se llame como nuestra DLL pero con extencion ".def" (Ej. CMT.def) el cual hasta el momento por lo que venimos haciendo debera contener la Siguiente Informacion:

    Código:
    LYBRARY CMT
    EXPORTS INILoad
    NOTA: Recuerden que LYBRARY CMT es el nombre de nuestra DLL (yo le puse CMT ustedes pueden ponerle el nombre que deseen). y EXPORTS son los Proc que debe exportar la DLL, en este caso solo creamos un Proc el cual es necesezario exportar que se llama INILoad cuyo Proc es donde definimos la carga de nuestro .ini con sus opciones.

    Luego con mas tiempo iremos agregando mas Proc a esta Guia, utilizaremos comandos como /ServerInfo, /Post, ConnectNotice, etc...

    Espero les alla agradado, y sea de utilidad para todos ustedes, luego con mas tiempo ire actualizando este thread agregando mas funciones y explicando un poco mejor y mas extenzamente.

    Creditos: MG-StaT
    Vota por Nosotros -> www.devastacion.com - L2 Devastacion Gracia Final Full PVP XP 2000x - SP 2000x - Adena 2000x - DropSpoil 2x - 24/7
Trabajando...
X