Autor
|
Tema: Ventana en ASM (Leído 10,517 veces)
|
EAX_
Desconectado
Mensajes: 26
inside myself..
|
Hola.. bueno les cuento.. estoy tratando de entender el lenguaje ASM, con ayuda de un amigo y leyendo un poco he conseguido crear un programa que muestra un msgbox al inicio, se crea una ventana y al clickarla sale otro msgbox.. necesito un poco de ayuda para poder hacer un boton que haga alguna acción (por ejemplo ejecutar CMD) o algo así. Buehh este es el code.. hInstance equ 0x00400000 format PE GUI 4.0 at hInstance as 'exe' entry codee include 'WIN32A.INC' section '.bss' readable writeable msg MSG bools db ? ; [1]Exit section '.text' code readable executable codee: push MB_ICONEXCLAMATION push _msgb0 push _msgb1 push 0 call [MessageBox] push _classname push 0 push 0 call [CreateMutex] call [GetLastError] TEST EAX,EAX jnz .end push BLACK_BRUSH call [GetStockObject] mov [wc.hbrBackground],EAX push IDC_ARROW push 0 call [LoadCursor] mov [wc.hCursor],EAX push IDI_APPLICATION push 0 call [LoadIcon] mov [wc.hIcon],EAX push wc call [RegisterClass] push 0 push [wc.hInstance] push 0 push 0 push 300 push 500 push CW_USEDEFAULT push CW_USEDEFAULT push WS_VISIBLE+WS_CAPTION+WS_SYSMENU+WS_MAXIMIZEBOX push _title push _classname push 0 call [CreateWindowEx] jmp .jump0 .jump: push msg call [TranslateMessage] push msg call [DispatchMessage] test [bools],1 jnz .end .jump0: push 0 push 0 push 0 push msg call [GetMessage] cmp EAX,1 je .jump .end: ret WindowProc: mov EAX,DWORD PTR SS: ESP+8 cmp EAX,WM_LBUTTONDOWN je .lbdwn cmp EAX,WM_DESTROY je .wm_destroy jmp [DefWindowProc] .lbdwn: push 0 push _titlebox push _msgboxcnt push 0 call [MessageBox] retn 16 .wm_destroy: or [bools],1 retn 16 section '.data' writable readable _msgb0 TCHAR 'ALERT',0 _msgb1 TCHAR 'Test program, use under your own risk',0 _text1 TCHAR 'Testing this program fucking',0 _msgboxcnt TCHAR 'Do not click my program fucking',0 _titlebox TCHAR 'WARNING',0 _title TCHAR 'Program fucking',0 _classname TCHAR 'MyFuckingProgram' wc WNDCLASS 0,WindowProc,0,0,hInstance,0,0,0,0,_classname data import U_KERNEL32 equ 1 U_NTDLL equ 0 U_USER32 equ 1 U_GDI32 equ 1 U_DWM equ 0 U_SHELL32 equ 0 U_ADVAPI32 equ 0 U_WS2_32 equ 0 U_COMCTL32 equ 0 U_MSIMG32 equ 0 U_MSVCRT equ 0 U_OLE32 equ 1 include 'LIBS.INC' end data
Si me pudieran explicar o darme algun texto donde se explique el funcionamiento de la pila les agradeceria tambien.. EAX_ Edito: Se me olvidaba.. para programar uso FASM y me ayudo con OllyDbg para tratar de entender bien..
|
|
|
En línea
|
"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Para empezar a probar cambia el codigo de la etiqueta lbdwn, para ejecutar un programa la forma mas simple es usar WinExec (despues ya podras usar CreateProcess o ShellExecute). Despues cuando ya sepas ejecutar algo tendras que crear una ventana hija de la primera para el control del tipo boton (nombre de clase BUTTON) y manejando el mensaje WM_COMMAND podras ver el ID del boton. Lee al respecto en la MSDN: http://msdn.microsoft.com/en-us/library/bb775943(VS.85).aspx Tal vez esto te sirva para la pila: http://insecure.org/stf/smashstack.htmlLeer todo esto no viene mal tampoco: http://foro.elhacker.net/asm/entry_point-t256455.0.html
|
|
« Última modificación: 19 Diciembre 2009, 20:01 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
EAX_
Desconectado
Mensajes: 26
inside myself..
|
Gracias por responder, cuando tenga tiempo voy a leer lo que me mandaste y ahora voy a tratar de agregar esa funcion que me dijiste para ver si sale algo.. EAX_ EI: juntando mensajes.Ufff.. despues de varios intentos y acordandome de algunas cosas que me decia un amigo que me ayuda con esto.. pude abrir CMD.. ahora, no sé si sobra algo o si está mal porque todavia no entiendo bien a la pila.. creo que puse algo de más.. WindowProc: mov EAX,DWORD PTR SS: ESP+8 cmp EAX,WM_LBUTTONDOWN je .lbdwn cmp EAX,WM_DESTROY je .wm_destroy jmp [DefWindowProc] .lbdwn: push SW_SHOWNORMAL push _cmd call [WinExec] retn 16 ; Al quitarlo se cierra el programa y se abre cmd .wm_destroy: or [bools],1 retn 16 section '.data' writable readable _cmd TCHAR 'C:\Windows\system32\cmd.exe',0
Ese retn 16 todavia no lo entiendo bien.. si pudieras explicarme que hace te lo agradeceria.. creo que tiene que ver algo con los push, pero no recuerdo bien.. EAX_ PD: Perdón por el multipost..
|
|
« Última modificación: 19 Diciembre 2009, 20:56 pm por Eternal Idol »
|
En línea
|
"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
http://pdos.csail.mit.edu/6.828/2009/readings/i386/RET.htmRetorna al llamador y saca los parametros de la pila (que para esta funcion son 4 DWORDS, 16 bytes). PD. ¿De donde sale libs.inc? Cada dia odioa mas FASM y sus includes ...
|
|
« Última modificación: 19 Diciembre 2009, 21:00 pm por Eternal Idol »
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
EAX_
Desconectado
Mensajes: 26
inside myself..
|
Libs.inc es esto: library kernel32,'KERNEL32.DLL',U_KERNEL32,\ ntdll,'NTDLL.DLL',U_NTDLL,\ user32,'USER32.DLL',U_USER32,\ gdi32,'GDI32.DLL',U_GDI32,\ dwm,'DWMAPI.DLL',U_DWM,\ shell32,'SHELL32.DLL',U_SHELL32,\ advapi32,'ADVAPI32.DLL',U_ADVAPI32,\ ws2_32,'WS2_32.DLL',U_WS2_32,\ comctl32,'COMCTL32.DLL',U_COMCTL32,\ msvcrt,'MSVCRT.DLL',U_MSVCRT,\ msimg32,'MSIMG32.DLL',U_MSIMG32,\ ole32,'OLE32.DLL',U_OLE32,\ oleaut32,'OLEAUT32.DLL',U_OLE32 include 'API/KERNEL32.INC' include 'API/NTDLL.INC' include 'API/USER32.INC' include 'API/GDI32.INC' include 'API/DWM.INC' include 'API/SHELL32.INC' include 'API/ADVAPI32.INC' include 'API/WS2_32.INC' include 'API/COMCTL32.INC' include 'API/MSIMG32.INC' include 'API/MSVCRT.INC' include 'API/OLE32.INC'
Ya voy entendiendo un poco sobre el ret.. tambien pude usar la funcion WinExec con algunas propiedades y eso.. ahora voy a ver como me va con ShellExecute porque no tube suerte con CreateProcess.. EAX_ EditoBueno, con ShellExecute me fue bien.. ahora, queria hacer una pregunta. Cómo podría yo obtener la letra de la unidad donde esta instalado windows? Me refiero a %HomeDrive% o %SystemRoot%. EAX_
|
|
« Última modificación: 20 Diciembre 2009, 20:33 pm por EAX_ »
|
En línea
|
"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
Podes usar GetWindowsDirectory o GetSystemDirectory; siempre consulta la MSDN, esta la referencia donde explica que representa cada parametro y muchas veces incluye ejemplos.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
EAX_
Desconectado
Mensajes: 26
inside myself..
|
estuve buscando sobre GetWindowDirectory, leí en msdn pero no se me ocurre como poder usar lo que GetWindowDirectory devuelve.. o aunque sea imprimirlo en la ventana que tengo.. Cómo puedo hacer eso? hInstance equ 0x00400000 format PE GUI 4.0 at hInstance as 'exe' entry codee include 'WIN32A.INC' section '.bss' readable writeable msg MSG bools db ? ; [1]Exit section '.text' code readable executable codee: push _classname push 0 push 0 call [CreateMutex] call [GetLastError] TEST EAX,EAX jnz .end push DKGRAY_BRUSH call [GetStockObject] mov [wc.hbrBackground],EAX push IDC_ARROW push 0 call [LoadCursor] mov [wc.hCursor],EAX push IDI_APPLICATION push 0 call [LoadIcon] mov [wc.hIcon],EAX push wc call [RegisterClass] push 0 push [wc.hInstance] push 0 push 0 push 300 push 500 push CW_USEDEFAULT push CW_USEDEFAULT push WS_VISIBLE+WS_CAPTION+WS_SYSMENU+WS_MAXIMIZEBOX push _title push _classname push 0 call [CreateWindowEx] jmp .jump0 .jump: push msg call [TranslateMessage] push msg call [DispatchMessage] test [bools],1 jnz .end .jump0: push 0 push 0 push 0 push msg call [GetMessage] cmp EAX,1 je .jump .end: ret WindowProc: mov EAX,DWORD PTR SS: ESP+8 cmp EAX,WM_LBUTTONDOWN je .lbdwn cmp EAX,WM_DESTROY je .wm_destroy jmp [DefWindowProc] .lbdwn: push 0 push _c push _cmdp push _cmd push _open push 0 call [ShellExecute] retn 16 .wm_destroy: or [bools],1 retn 16 section '.data' writable readable _open TCHAR 'open',0 _c TCHAR 'C:\',0 _cmd TCHAR 'cmd',0 _cmdp TCHAR '/c msg * asd',0 _msgb0 TCHAR 'ALERT',0 _text1 TCHAR 'Testing this program fucking',0 _msgboxcnt TCHAR 'Do not click my program fucking',0 _title TCHAR 'Program fucking',0 _classname TCHAR 'MyFuckingProgram' wc WNDCLASS 0,WindowProc,0,0,hInstance,0,0,0,0,_classname data import U_KERNEL32 equ 1 U_NTDLL equ 0 U_USER32 equ 1 U_GDI32 equ 1 U_DWM equ 0 U_SHELL32 equ 1 U_ADVAPI32 equ 0 U_WS2_32 equ 0 U_COMCTL32 equ 0 U_MSIMG32 equ 0 U_MSVCRT equ 0 U_OLE32 equ 1 include 'LIBS.INC' end data
EAX_
|
|
|
En línea
|
"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
.data buff db 512 dup(0) .code main: push 512 push offset buff call GetSystemDirectoryA
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
EAX_
Desconectado
Mensajes: 26
inside myself..
|
Gracias por contestar, traté poniendo eso y me da error con "offset".. el error es: undefined symbol 'offset'. Faltará algún include?
EAX_
|
|
|
En línea
|
"Everyone is a genius. But if you judge a fish on its ability to climb a tree, it will live its whole life believing it is stupid." - Albert Einstein
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
No, es MASM ... saca offset y listo.
|
|
|
En línea
|
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste. Juan Domingo Perón
|
|
|
|
|