Programación General > ASM (Ensamblador)
Consulta Sobre Programacion De Dll En Asm
(1/1)
L3andro:
Hola a todos, bueno quisiera consultarles lo siguiente, estoy intentando trabajar con una DLL programada en ASM, tengo algunas cuantas dudas sobre el tema, las cuales seguramente no sean muy complicadas de contestar.
Bueno el codigo Fuente completo hasta ahora de la DLL es el siguiente:
--- Código: Text --- ;EasyCodeName=Module1,1.386.Model flat, StdCallOption CaseMap:noneInclude \masm32\include\windows.incInclude \masm32\include\user32.incInclude \masm32\include\kernel32.incInclude \masm32\include\masm32.incIncludeLib \masm32\lib\user32.libIncludeLib \masm32\lib\kernel32.libIncludeLib \masm32\lib\masm32.libInclude \masm32\macros\MACROS.ASM .ConstMEMSIZE Equ 175535LittleBuffer Equ 10HGSAuthKey1 Equ 00BE2329HGSAuthKey2 Equ 0AED66CE1HGSAuthKey3 Equ 0F1499052HGSAuthKey4 Equ 0EBE9BBF1HGSAuthKey5 Equ 0A6B3HGSAuthKey6 Equ 0DBH.DataItemKor DB "..\data\lang\Kor\item(Kor).txt", 0ItemVTM DB "..\data\lang\vtm\item(Vtm).txt", 0SkillKor DB "..\data\lang\Kor\skill(Kor).txt", 0SkillVTM DB "..\data\lang\vtm\skill(Vtm).txt", 0QuestKor DB "..\data\lang\Kor\Quest(Kor).txt", 0QuestVTM DB "..\data\lang\Vtm\Quest(Vtm).txt", 0CheckSum DB "..\data\lang\Kor\CheckSum.dat", 0Monster DB "..\data\Monster.txt", 0Gate DB "..\data\gate.txt", 0MonsterBase DB "..\data\MonsterSetBase.txt", 0Shop0 DB "..\data\Shop0.txt", 0Shop1 DB "..\data\Shop1.txt", 0Shop2 DB "..\data\Shop2.txt", 0Shop3 DB "..\data\Shop3.txt", 0Shop4 DB "..\data\Shop4.txt", 0Shop5 DB "..\data\Shop5.txt", 0Shop6 DB "..\data\Shop6.txt", 0Shop7 DB "..\data\Shop7.txt", 0Shop8 DB "..\data\Shop8.txt", 0Shop9 DB "..\data\Shop9.txt", 0Shop10 DB "..\data\Shop10.txt", 0Shop11 DB "..\data\Shop11.txt", 0Shop12 DB "..\data\Shop12.txt", 0MoveReqKor DB "..\data\lang\Kor\movereq(kor).txt", 0MoveReqVTM DB "..\data\lang\Vtm\movereq(Vtm).txt", 0ItemSetOption DB "..\data\lang\Kor\itemsetoption(Kor).txt", 0ItemSetType DB "..\data\lang\Kor\itemsettype(Kor).txt", 0CommonLoc DB "..\data\lang\Kor\CommonLoc.cfg", 0GameServerInfo DB "GameServerInfo", 0ClientVersion DB "ClientExeVersion", 0ClientSerial DB "ClientExeSerial", 0ServerName DD LittleBuffer Dup(0)VersionServer DD LittleBuffer Dup(0)ClientVersionReturn DD LittleBuffer Dup(0)ClientSerialReturn DD LittleBuffer Dup(0)AGGSOffset DD ?AGSOffset2 DD ?FirstTime DD ?.Data?hFile HANDLE ?hMemory HANDLE ?pMemory DWord ?SizeReadWrite DWord ?.CodeDllEntry Proc hInstDLL:HINSTANCE, reason:DWord, reserved1:DWord Mov Eax, TRUE RetDllEntry EndP AGSetInfo Proc Mov Eax, DWord Ptr Ss:[Ebp + 18H] Mov Ecx, DWord Ptr Ss:[Ebp + 14H] Mov Edx, DWord Ptr Ss:[Ebp + 0CH] Mov Ebx, DWord Ptr Ss:[Ebp + 20H] Mov ServerName, Eax Mov VersionServer, Ecx Mov AGGSOffset, Edx Mov AGSOffset2, Ebx Xor Eax, Eax RetAGSetInfo EndP AGGetKey Proc Mov Edx, GSAuthKey1 Mov Eax, DWord Ptr Ss:[Ebp + 8] Mov DWord Ptr Ds:[Eax], Edx Mov Edx, GSAuthKey2 Mov DWord Ptr Ds:[Eax + 4], Edx Mov Edx, GSAuthKey3 Mov DWord Ptr Ds:[Eax + 8], Edx Mov Edx, GSAuthKey4 Mov DWord Ptr Ds:[Eax + 0CH], Edx Mov Cx, GSAuthKey5 Mov Word Ptr Ds:[Eax + 10H], Cx Mov Dl, GSAuthKey6 Mov Byte Ptr Ds:[Eax + 12H], Dl Xor Eax, Eax RetAGGetKey EndP AGRequestData Proc Local Number:DWord Cmp FirstTime, 0 Jnz DeleteBuffer Mov FirstTime, 1 Jmp SwitchNumbersDeleteBuffer: Invoke CloseHandle, hFile Invoke GlobalUnlock, pMemory Invoke GlobalFree, hMemorySwitchNumbers: Mov Ecx, DWord Ptr Ss:[Ebp + 0CH] Mov Number, Ecx Switch NumberCase 0 Mov Eax, Offset ItemKorCase 1 Mov Eax, Offset ItemVTMCase 2 Mov Eax, Offset SkillKorCase 3 Mov Eax, Offset SkillVTMCase 4 Mov Eax, Offset QuestKorCase 5 Mov Eax, Offset QuestVTMCase 6 Mov Eax, Offset CheckSumCase 7 Mov Eax, Offset MonsterCase 8 Mov Eax, Offset GateCase 9 Mov Eax, Offset MonsterBaseCase 0BH Mov Eax, Offset Shop0Case 0CH Mov Eax, Offset Shop1Case 0DH Mov Eax, Offset Shop2Case 0EH Mov Eax, Offset Shop3Case 0FH Mov Eax, Offset Shop4Case 10H Mov Eax, Offset Shop5Case 11H Mov Eax, Offset Shop6Case 12H Mov Eax, Offset Shop7Case 13H Mov Eax, Offset Shop8Case 14H Mov Eax, Offset Shop9Case 15H Mov Eax, Offset Shop10Case 16H Mov Eax, Offset Shop11Case 17H Mov Eax, Offset Shop12Case 18H Mov Eax, Offset MoveReqKorCase 1AH Mov Eax, Offset ItemSetOptionCase 1CH Mov Eax, Offset ItemSetTypeEndSwLoadFile: Invoke CreateFile, Eax, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL Mov hFile, Eax Invoke GlobalAlloc, GMEM_MOVEABLE Or GMEM_ZEROINIT, MEMSIZE Mov hMemory, Eax Invoke GlobalLock, hMemory Mov pMemory, Eax Invoke ReadFile, hFile, pMemory, MEMSIZE - 1, Addr SizeReadWrite, NULL Xor Eax, Eax RetAGRequestData EndP AGGetDataBufferSize Proc Mov Eax, SizeReadWrite RetAGGetDataBufferSize EndP AGGetDataBuffer Proc Mov Eax, pMemory RetAGGetDataBuffer EndP AGGetClientVersion ProcInvoke GetPrivateProfileString, Addr GameServerInfo, Addr ClientVersion, NULL, Addr ClientVersionReturn, 14H, Addr CommonLocInvoke GetPrivateProfileString, Addr GameServerInfo, Addr ClientSerial, NULL, Addr ClientSerialReturn, 14H, Addr CommonLocMov Eax, DWord Ptr Ds:[ClientVersionReturn]Mov Ecx, DWord Ptr Ds:[ClientVersionReturn + 4]Mov Edx, DWord Ptr Ss:[Ebp + 8]Mov DWord Ptr Ds:[Edx], EaxMov DWord Ptr Ds:[Edx + 4], EcxMov Eax, DWord Ptr Ds:[ClientSerialReturn]Mov Ecx, DWord Ptr Ds:[ClientSerialReturn + 4]Mov Edx, DWord Ptr Ss:[Ebp + 0CH]Mov DWord Ptr Ds:[Edx], EaxMov DWord Ptr Ds:[Edx + 4], EcxMov Eax, DWord Ptr Ds:[ClientSerialReturn + 8]Mov Ecx, DWord Ptr Ds:[ClientSerialReturn + 0CH]Mov DWord Ptr Ds:[Edx + 8], EaxMov DWord Ptr Ds:[Edx + 0CH], EcxMov Eax, DWord Ptr Ds:[ClientSerialReturn + 10H]Mov DWord Ptr Ds:[Edx + 10H], EaxXor Eax, EaxRetAGGetClientVersion EndP End DllEntry
Asi como esta, funciona bien... Ahora mi consulta es la siguiente, me decidi a agregarle algunas funciones mas de configuracion, añadiendo un .ini - y quisiera ver si esto esta bien y si de estarlo hay alguna forma de optimizar el codigo si pueden asesorarme, o corregirme de estar mal.
Lo que agrego seria lo siguiente.
Dentro de .Data añado esto:
--- Código: Text --- .Data IsGlobalChatBuff DB 1 Dup(0)GChatLevelBuff DB 4 Dup(0)GChatMoneyBuff DB 4 Dup(0) Sections DB "Config", 0IniFileName DB "./Config.ini" , 0
Y posteriormente creo un nuevo Proc de la siguiente manera:
--- Código: Text --- LoadConfig Proc Invoke GetPrivateProfileInt, Addr Sections, Addr IsGlobalChat, 0, Addr IniFileName Mov DWord Ptr Ds:[IsGlobalChatBuff], Eax Invoke GetPrivateProfileInt, Addr Sections, Addr GChatLevel, 50, Addr IniFileName Mov DWord Ptr Ds:[GChatLevelBuff], Eax Invoke GetPrivateProfileInt, Addr Sections, Addr GChatMoney, 10000, Addr IniFileName Mov DWord Ptr Ds:[GChatMoneyBuff], Eax RetnLoadConfig EndP
Las opciones son muchisimas mas, pero en resumen la idea es esa, y esto quedaria de la siguiente manera:
--- Código: Text --- .386.Model flat, StdCallOption CaseMap:noneInclude \masm32\include\windows.incInclude \masm32\include\user32.incInclude \masm32\include\kernel32.incInclude \masm32\include\masm32.incIncludeLib \masm32\lib\user32.libIncludeLib \masm32\lib\kernel32.libIncludeLib \masm32\lib\masm32.libInclude \masm32\macros\MACROS.ASM .ConstMEMSIZE Equ 175535LittleBuffer Equ 10HGSAuthKey1 Equ 00BE2329HGSAuthKey2 Equ 0AED66CE1HGSAuthKey3 Equ 0F1499052HGSAuthKey4 Equ 0EBE9BBF1HGSAuthKey5 Equ 0A6B3HGSAuthKey6 Equ 0DBH.Data IsGlobalChatBuff DB 1 Dup(0)GChatLevelBuff DB 4 Dup(0)GChatMoneyBuff DB 4 Dup(0) Sections DB "Config", 0IniFileName DB "./Config.ini" , 0 ItemKor DB "..\data\lang\Kor\item(Kor).txt", 0ItemVTM DB "..\data\lang\vtm\item(Vtm).txt", 0SkillKor DB "..\data\lang\Kor\skill(Kor).txt", 0SkillVTM DB "..\data\lang\vtm\skill(Vtm).txt", 0QuestKor DB "..\data\lang\Kor\Quest(Kor).txt", 0QuestVTM DB "..\data\lang\Vtm\Quest(Vtm).txt", 0CheckSum DB "..\data\lang\Kor\CheckSum.dat", 0Monster DB "..\data\Monster.txt", 0Gate DB "..\data\gate.txt", 0MonsterBase DB "..\data\MonsterSetBase.txt", 0Shop0 DB "..\data\Shop0.txt", 0Shop1 DB "..\data\Shop1.txt", 0Shop2 DB "..\data\Shop2.txt", 0Shop3 DB "..\data\Shop3.txt", 0Shop4 DB "..\data\Shop4.txt", 0Shop5 DB "..\data\Shop5.txt", 0Shop6 DB "..\data\Shop6.txt", 0Shop7 DB "..\data\Shop7.txt", 0Shop8 DB "..\data\Shop8.txt", 0Shop9 DB "..\data\Shop9.txt", 0Shop10 DB "..\data\Shop10.txt", 0Shop11 DB "..\data\Shop11.txt", 0Shop12 DB "..\data\Shop12.txt", 0MoveReqKor DB "..\data\lang\Kor\movereq(kor).txt", 0MoveReqVTM DB "..\data\lang\Vtm\movereq(Vtm).txt", 0ItemSetOption DB "..\data\lang\Kor\itemsetoption(Kor).txt", 0ItemSetType DB "..\data\lang\Kor\itemsettype(Kor).txt", 0CommonLoc DB "..\data\lang\Kor\CommonLoc.cfg", 0GameServerInfo DB "GameServerInfo", 0ClientVersion DB "ClientExeVersion", 0ClientSerial DB "ClientExeSerial", 0ServerName DD LittleBuffer Dup(0)VersionServer DD LittleBuffer Dup(0)ClientVersionReturn DD LittleBuffer Dup(0)ClientSerialReturn DD LittleBuffer Dup(0)AGGSOffset DD ?AGSOffset2 DD ?FirstTime DD ?.Data?hFile HANDLE ?hMemory HANDLE ?pMemory DWord ?SizeReadWrite DWord ?.CodeDllEntry Proc hInstDLL:HINSTANCE, reason:DWord, reserved1:DWord Mov Eax, TRUE RetDllEntry EndP LoadConfig Proc Invoke GetPrivateProfileInt, Addr Sections, Addr IsGlobalChat, 0, Addr IniFileName Mov DWord Ptr Ds:[IsGlobalChatBuff], Eax Invoke GetPrivateProfileInt, Addr Sections, Addr GChatLevel, 50, Addr IniFileName Mov DWord Ptr Ds:[GChatLevelBuff], Eax Invoke GetPrivateProfileInt, Addr Sections, Addr GChatMoney, 10000, Addr IniFileName Mov DWord Ptr Ds:[GChatMoneyBuff], Eax RetnLoadConfig EndP AGSetInfo Proc Mov Eax, DWord Ptr Ss:[Ebp + 18H] Mov Ecx, DWord Ptr Ss:[Ebp + 14H] Mov Edx, DWord Ptr Ss:[Ebp + 0CH] Mov Ebx, DWord Ptr Ss:[Ebp + 20H] Mov ServerName, Eax Mov VersionServer, Ecx Mov AGGSOffset, Edx Mov AGSOffset2, Ebx Xor Eax, Eax Ret AGSetInfo AGGetKey Proc Mov Edx, GSAuthKey1 Mov Eax, DWord Ptr Ss:[Ebp + 8] Mov DWord Ptr Ds:[Eax], Edx Mov Edx, GSAuthKey2 Mov DWord Ptr Ds:[Eax + 4], Edx Mov Edx, GSAuthKey3 Mov DWord Ptr Ds:[Eax + 8], Edx Mov Edx, GSAuthKey4 Mov DWord Ptr Ds:[Eax + 0CH], Edx Mov Cx, GSAuthKey5 Mov Word Ptr Ds:[Eax + 10H], Cx Mov Dl, GSAuthKey6 Mov Byte Ptr Ds:[Eax + 12H], Dl Xor Eax, Eax RetAGGetKey EndP AGRequestData Proc Local Number:DWord Cmp FirstTime, 0 Jnz DeleteBuffer Mov FirstTime, 1 Jmp SwitchNumbersDeleteBuffer: Invoke CloseHandle, hFile Invoke GlobalUnlock, pMemory Invoke GlobalFree, hMemorySwitchNumbers: Mov Ecx, DWord Ptr Ss:[Ebp + 0CH] Mov Number, Ecx Switch NumberCase 0 Mov Eax, Offset ItemKorCase 1 Mov Eax, Offset ItemVTMCase 2 Mov Eax, Offset SkillKorCase 3 Mov Eax, Offset SkillVTMCase 4 Mov Eax, Offset QuestKorCase 5 Mov Eax, Offset QuestVTMCase 6 Mov Eax, Offset CheckSumCase 7 Mov Eax, Offset MonsterCase 8 Mov Eax, Offset GateCase 9 Mov Eax, Offset MonsterBaseCase 0BH Mov Eax, Offset Shop0Case 0CH Mov Eax, Offset Shop1Case 0DH Mov Eax, Offset Shop2Case 0EH Mov Eax, Offset Shop3Case 0FH Mov Eax, Offset Shop4Case 10H Mov Eax, Offset Shop5Case 11H Mov Eax, Offset Shop6Case 12H Mov Eax, Offset Shop7Case 13H Mov Eax, Offset Shop8Case 14H Mov Eax, Offset Shop9Case 15H Mov Eax, Offset Shop10Case 16H Mov Eax, Offset Shop11Case 17H Mov Eax, Offset Shop12Case 18H Mov Eax, Offset MoveReqKorCase 1AH Mov Eax, Offset ItemSetOptionCase 1CH Mov Eax, Offset ItemSetTypeEndSwLoadFile: Invoke CreateFile, Eax, GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, NULL Mov hFile, Eax Invoke GlobalAlloc, GMEM_MOVEABLE Or GMEM_ZEROINIT, MEMSIZE Mov hMemory, Eax Invoke GlobalLock, hMemory Mov pMemory, Eax Invoke ReadFile, hFile, pMemory, MEMSIZE - 1, Addr SizeReadWrite, NULL Xor Eax, Eax RetAGRequestData EndP AGGetDataBufferSize Proc Mov Eax, SizeReadWrite RetAGGetDataBufferSize EndP AGGetDataBuffer Proc Mov Eax, pMemory RetAGGetDataBuffer EndP AGGetClientVersion ProcInvoke GetPrivateProfileString, Addr GameServerInfo, Addr ClientVersion, NULL, Addr ClientVersionReturn, 14H, Addr CommonLocInvoke GetPrivateProfileString, Addr GameServerInfo, Addr ClientSerial, NULL, Addr ClientSerialReturn, 14H, Addr CommonLocMov Eax, DWord Ptr Ds:[ClientVersionReturn]Mov Ecx, DWord Ptr Ds:[ClientVersionReturn + 4]Mov Edx, DWord Ptr Ss:[Ebp + 8]Mov DWord Ptr Ds:[Edx], EaxMov DWord Ptr Ds:[Edx + 4], EcxMov Eax, DWord Ptr Ds:[ClientSerialReturn]Mov Ecx, DWord Ptr Ds:[ClientSerialReturn + 4]Mov Edx, DWord Ptr Ss:[Ebp + 0CH]Mov DWord Ptr Ds:[Edx], EaxMov DWord Ptr Ds:[Edx + 4], EcxMov Eax, DWord Ptr Ds:[ClientSerialReturn + 8]Mov Ecx, DWord Ptr Ds:[ClientSerialReturn + 0CH]Mov DWord Ptr Ds:[Edx + 8], EaxMov DWord Ptr Ds:[Edx + 0CH], EcxMov Eax, DWord Ptr Ds:[ClientSerialReturn + 10H]Mov DWord Ptr Ds:[Edx + 10H], EaxXor Eax, EaxRetAGGetClientVersion EndP End DllEntry
Bueno mi consulta es la nombrada, quisiera saber si los ultimos agregados como el del .ini para configuracion estan bien aplicados, y si hay alguna manera de optimizar el codigo.
Saludos y desde ya gracias.
Navegación
Ir a la versión completa