Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

¡Al Fin Otro Código! Y esta vez mas dificil.

Si niños, en esta nota se presenta un nuevo código. Este, al igual que PEDEMO.EXE no fue escrito por mi, sino por un ser misterioso del internet conocido solamente con el pseudónimo de Iczelion. Este ser, de quien no se sabe su verdadera identidad, fue el responsable de llevar la programación en Windows a los pocos renegados de ensamblador. Con un tutorial que abarca 35 entregas en MASM. Código y ejecutable incluidos. Sin embargo, dicho tutorial estaba tan lleno de macros y rutinas obsoletas dependientes del MASM que se requirieron de muchas horas de trabajo para sacarle el verdadero jugo a estos tesoros. Actualmente pueden encontrarse traducciones a varios lenguajes (humanos y de ensamblador) de este tutorial. Incluyendo un intento que hizo un perturbado cuyo nombre no voy a mencionar por miedo a los buscadores que ni siquiera se ejecutaban bien y que no estaban completos. Bueno, ahí va el mugrero:


format PE GUI 4.0
entry start

section ‘.code’ code readable executable

start:

; push dword 0
; call [GetModuleHandle]

push 0
call [GetModuleHandle]
mov [hInstance], eax
; se toma el handle de modulo o instancia
; que es la posicion de memoria del programa

call [GetCommandLine]
mov [command_line], eax
; obtener la posicion de la linea de comando

push dword 0ah
push dword [command_line]
push dword 0
push dword [hInstance]
call win_main
; llamar a la funcion winmain() con sus cuatro parametros

push 0
call [ExitProcess]
; Fin del programa

win_main:
push ebp
mov ebp, esp
add esp, 0ffffffb0h
; preparar el stack frame con 80 bytes
virtual at ebp – 80
win_hwnd dd 0

msg_hwnd dd 0
msg_message dd 0
msg_wparam dd 0
msg_lparam dd 0
msg_time dd 0
msg_pt_x dd 0
msg_pt_y dd 0
; estructura local de mensaje MSG

wc_cbsize dd 0
wc_style dd 0
wc_lpfnwndproc dd 0
wc_cbclsextra dd 0
wc_cbwndextra dd 0
wc_hinstance dd 0
wc_hicon dd 0
wc_hcursor dd 0
wc_hbrbackground dd 0
wc_lpszmenuname dd 0
wc_lpszclassname dd 0
wc_hiconsm dd 0
; estructura local WNDCLASSEX

end virtual

mov [wc_cbsize],dword 30h
mov [wc_style], dword 3
mov [wc_lpfnwndproc], window_proc
mov [wc_cbclsextra], dword 0
mov [wc_cbwndextra], dword 0
push dword [hInstance]
pop [wc_hinstance]
mov [wc_hbrbackground], dword 6
mov [wc_lpszmenuname], dword 0
mov [wc_lpszclassname], class_name

push 7f00h
push 0
call [LoadIcon]
mov [wc_hicon], eax
mov [wc_hiconsm], eax

push dword 7f00h
push 0
call [LoadCursor]
mov [wc_hcursor], eax
lea eax, [wc_cbsize]
push eax
call [RegisterClassEx]

push 0
push dword [ebp + 8]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0cf0000h
push app_name
push class_name
push 0
call [CreateWindowEx]
mov [win_hwnd], eax

push dword 1
push [win_hwnd]
call [ShowWindow]

push [win_hwnd]
call [UpdateWindow]

mas_mensajes:
push 0
push 0
push 0
lea eax, dword [msg_hwnd]
push eax
call [GetMessage]

or eax, eax
jz no_mensaje

lea eax, dword [msg_hwnd]
push eax
call [TranslateMessage]

lea eax, dword [msg_hwnd]
push eax
call [DispatchMessage]
jmp mas_mensajes

no_mensaje:
mov eax, [msg_wparam]
leave
ret 10h
; fin de WinMain

window_proc:
push ebp
mov ebp, esp
cmp dword [ebp + 0ch], 2
jne ignora_msg
; ver si el mensaje es WM_DESTROY
; de no serlo no ejecutamos PostQuitMessage

push 0
call [PostQuitMessage]

xor eax, eax
leave
ret 10h
ignora_msg:
push dword [ebp + 14h]
push dword [ebp + 10h]
push dword [ebp + 0ch]
push dword [ebp + 08h]
call [DefWindowProc]

leave
ret 10h
; dejar el stack frame como lo encontramos

db 0cch
section ‘.data’ data readable writeable

hInstance dd 0
command_line dd 0
class_name db ‘SimpleWinClass’,0
app_name db ‘Our first Window’,0

section ‘.idata’ import data readable writeable

dd 0,0,0, RVA kernel_name, RVA kernel_table
dd 0,0,0, RVA user_name, RVA user_table
dd 0,0,0,0,0

kernel_table:
ExitProcess dd RVA _ExitProcess

GetCommandLine dd RVA _GetCommandLineA

GetModuleHandle dd RVA _GetModuleHandleA

dd 0
; este cero indica el fin del arreglo de RVA’s

user_table:
MessageBox dd RVA _MessageBoxA

LoadIcon dd RVA _LoadIconA

LoadCursor dd RVA _LoadCursorA

RegisterClassEx dd RVA _RegisterClassExA

CreateWindowEx dd RVA _CreateWindowExA

ShowWindow dd RVA _ShowWindow

UpdateWindow dd RVA _UpdateWindow

GetMessage dd RVA _GetMessageA

TranslateMessage dd RVA _TranslateMessage

DispatchMessage dd RVA _DispatchMessageA

PostQuitMessage dd RVA _PostQuitMessage

DefWindowProc dd RVA _DefWindowProcA

dd 0

kernel_name db ‘KERNEL32.DLL’,0
user_name db ‘USER32.DLL’,0

_ExitProcess dw 0
db ‘ExitProcess’,0

_GetCommandLineA dw 0
db ‘GetCommandLineA’,0

_GetModuleHandleA dw 0
db ‘GetModuleHandleA’,0

_LoadIconA dw 0
db ‘LoadIconA’,0

_LoadCursorA dw 0
db ‘LoadCursorA’,0

_MessageBoxA dw 0
db ‘MessageBoxA’,0

_RegisterClassExA dw 0
db ‘RegisterClassExA’,0

_CreateWindowExA dw 0
db ‘CreateWindowExA’,0

_ShowWindow dw 0
db ‘ShowWindow’,0

_UpdateWindow dw 0
db ‘UpdateWindow’,0

_GetMessageA dw 0
db ‘GetMessageA’,0

_TranslateMessage dw 0
db ‘TranslateMessage’,0

_DispatchMessageA dw 0
db ‘DispatchMessageA’,0

_PostQuitMessage dw 0
db ‘PostQuitMessage’,0

_DefWindowProcA dw 0
db ‘DefWindowProcA’,0

section ‘.reloc’ fixups data readable discardable


Si conseguiste llegar a estas lineas sin aburrirte felicidades. Ahora tienes una idea de lo grandes que pueden llegar a ser los programas en Ensamblador. ¡Sobre todo porque este enorme programa lo único que hace es desplegar una ventana que no hace nada!.Así que no verás muchos códigos desplegados en este blog. En poco tiempo aprenderé como subir archivos fuente y ejecutables a este lugar y entonces si que comenzará la diversión. Una cosa mas, usando macros, notacion húngara y dividiendo en varios archivos, este programa podría caber en apenas una pantalla o dos, pero sería practicamente imposible estudiarlo. Digamos que esta es la versión de entrenamiento y ya cuando entiendan todos estos conceptos podrán usar las macros si quieren. Por ahora, mejor prepárense porque el camino que sigue es todavía mas dificil.

enero 13, 2009 - Posted by | Uncategorized | , , ,

1 comentario »

  1. repasando el codigo, intente compilarlo en el flat y me salta error en “virtual at ebp – 80” linea 39 supongo que sera.

    Comentario por JavierJV | julio 27, 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: