elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: AIO elhacker.NET 2021 Compilación herramientas análisis y desinfección malware


  Mostrar Temas
Páginas: 1 [2] 3 4 5
11  Programación / Java / JPopupMenu que no responde a eventos en: 19 Agosto 2008, 02:19 am
Hola, veréis, ando haciendo una aplicación que lee una base de datos y la muestra en un JTable.

La cosa es que la tabla tiene unos campos en los que puedes elegir entre varias opciones predeterminadas y para seleccionar unas u otras he decidido mostrar un JPopupMenu, ya que insertar un JComboBox se me hacía demasiado largo :P

Lo añado así:
Código
  1.        JPopupMenu pop = new JPopupMenu();
  2.        JMenu sub = new JMenu("Submenu");    
  3.            sub.add(new JMenuItem("Subitem 1"));
  4.            sub.add(new JMenuItem("Subitem 2"));
  5.        pop.add(sub);
  6.        pop.add(new JMenuItem("Item 1"));
  7.        pop.add(new JMenuItem("Item 2"));
  8.  
  9.        pop.setLocation(evt.getLocationOnScreen());
  10.        pop.setVisible(true);;

Lo raro es que al posicionar el ratón sobre el sub-menú no se extienden los sub-elementos ni nada, como lo hacen los menus normales...


Estoy usando NetBeans, pero si añado los menúes desde el editor tampoco me funciona... Alguna sugerencia de como hacerlo o algún ejemplillo?

Muchas gracias por adelantado
Salu2

12  Programación / Java / Como el ListView de .net o VB?? en: 5 Julio 2008, 00:32 am
Hola a todos

Pues veréis, estoy haciendo un applet simple para gestionar una base de datos y me gustaría poder mostrar la información de dicha base de datos en una lista, solo que con columnas y pudiendo meter iconos y tal, vamos, lo que es un listView de toda la vida:


Estoy usando NetBeans por acortar con la construcción de la interfaz y no veo ningún control similar a ese y en una lista normal la verdad es que limita bastante la forma de mostrar la información...

¿Alguien sabe de algún control similar al ListView para Java?

Ya de paso pregunto otra cosa, si utilizo un List del awt no tengo problema en hacer:
Código:
lst.add("Hola");

Pero si uso un JList no puedo hacer eso.. como se añaden Strings a los JList?

Perdón por las preguntas de novato, pero ando verde.
Gracias y salu2
13  Seguridad Informática / Abril negro / Abril Negro 2008: Taller de ASM en: 13 Abril 2008, 16:52 pm
Abril Negro 2008: Taller de ASM by E0N


INTRODUCCIÓN:
 
Bienvenidos al taller de ASM. Abril Negro 2008.

En este taller vamos a aprender a programar en ASM :P. Usaremos FASM como ensamblador ya que es gratuito y open source, lo podéis descargar de su página oficial: http://flatassembler.net/download.php . Así mismo nuestras aplicaciones serán de 32bits y correrán en procesadores x86.


¿QUÉ ES ASM?

Bueno, como no quiero agobiaros con mucha teoría que casi todo el mundo conocerá simplemente cito de la wikipedia, que esto es un taller ¡nos interesa la práctica!

Cita de: Wikipedia link= http://es.wikipedia.org/wiki/ASM
El lenguaje ensamblador es un tipo de lenguaje de bajo nivel utilizado para escribir programas informáticos, y constituye la representación más directa del código máquina específico para cada arquitectura de computadoras legible por un programador.
Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos.

Convendría que os leyerais lo que pone en la wikipedia, por enteraros un poco de lo que trata el taller.


LOS REGISTROS DEL MICROPROCESADOR:

ASM es totalmente diferente a cualquier otro lenguaje de alto nivel que podáis conocer. Al usar ASM nos valemos directamente de los registro de nuestro microprocesador. No voy a explicar para que valen todos y cada uno de los registros, simplemente os indico los más representativos, que nos sobrarán para diseñar cualquier programa:

EAX, EBX, ECX, EDX: Estos cuatro registros serán los que usemos principalmente para almacenar datos. Tienen el tamaño de un DWORD, es decir 4 bytes o lo que es lo mismo 32 bits. A su vez los podemos dividir en dos para referirnos a datos del tamaño de un WORD o 2 bytes y a su vez en dos para almacenar datos que ocupen un único byte. Para que quede más claro os dejo un dibujo de cómo queda dividido el registro y el nombre que toma:

Por si el link está roto

En la imagen e puesto el registro EAX de ejemplo, pero esto mismo es aplicable a los otros tres cambiando la A por una B, una C o una D según corresponda.

EDI, ESI: Al igual que los cuatro anteriores los usaremos para almacenar datos, aunque tienen otras funciones. También podemos referirnos a ellos como SI o DI si queremos modificar sus 2 bytes más bajos.

EIP: Este registro contendrá la dirección de la siguiente instrucción que se ejecutará.

EBP, ESP: El registro EBP apunta a la Base de la pila y el ESP apunta a la parte Superior de la pila. La pila no es más que una estructura de tipo LIFO ( http://es.wikipedia.org/wiki/LIFO ) que nos servirá para pasar parámetros a las funciones o almacenar datos entre otras cosas. Más adelante todo esto se explicará con mayor claridad, pero para que os hagáis una idea, cuando vosotros en C o en otro lenguaje llamáis al api MessageBox por ejemplo en realidad pasa esto:

Por si el link está roto

Lo último que se mete en la pila con el call es la dirección de retorno, es decir, el valor que tomará el registro EIP al salir de la función para que el programa siga su curso normal. Si no entendéis muy bien esto ahora mismo no os preocupéis, luego se irá explicando todo con mayor detalle.


Aparte de estos hay muchos más registros en el microprocesador, pero nosotros con estos pocos tendremos más que suficiente para hacer la gran mayoría de nuestras aplicaciones en ASM.


OLLY DGB: EL DEBUGGER

Un debugger o depurador es una herramienta que nos permitirá ejecutar nuestro programa paso a paso para solucionar ciertos problemas de programación con los que nos podamos encontrar cuando estemos programando en ASM o en cualquier otro lenguaje.

Lo primero que debemos hacer es descargarnos este debugger de manera totalmente gratuita de su página oficial ( http://www.ollydbg.de/odbg110.zip ). Una vez lo tengamos todo preparado comenzaremos la primera practica de nuestro taller ;D

Empezamos. Copiamos este código en el FASM y ensamblarlo pulsando Control+F9. Por ahora no tenéis que entender nada del código, esta práctica es solamente para que veáis lo que pasa dentro del microprocesador al ejecutar un programa:

Código
  1. include 'H:\archivos de programa\fasm\include\win32ax.inc'
  2.  
  3. .data
  4.   cuerpo db 'Hola mundo', 0
  5.   titulo db 'xD', 0
  6.  
  7. .code
  8. start:
  9.  
  10.   mov eax, NULL    ; Esto equivale a eax = 0
  11.   mov ebx, 0x1234  ; Esto equivale a ebx = 1234 (el 0x de delante indica que es hexadecimal)
  12.  
  13.   push 0           ; Observamos la pila para ver que pasa
  14.   push titulo
  15.   push cuerpo
  16.   push 0
  17.   call [MessageBoxA]
  18.  
  19.   mov edi, NULL
  20.   mov di, 2
  21.  
  22.   push 0
  23.   call [ExitProcess]
  24.  
  25.  
  26. .end start


Apretamos Control+F9, guardamos este código en cualquier ruta con el nombre de Practica1.asm y vereis como se genera un .exe.

Ahora abrimos el olly, File -> Open y seleccionamos nuestro ejecutable. Veremos algo como esto:

Por si el link está roto

En rojo os he indicado las partes fundamentales de las que consta nuestra ventana. Las analizo a continuación una a una ;)

Código del programa: Aquí podemos ver varias cosas interesantes. En la primera columna empezando por la izquierda podemos ver la dirección de memoria en la que se encuentra cierta instrucción. Presupongo que todo el mundo sabe más o menos como se carga un archivo en memoria. En la segunda columna podemos ver nuestro código en forma de opcodes, o lo que es lo mismo, nuestro código expresado en unos y ceros, solo que en base 16 para una mayor claridad, es decir, en hexadecimal. En la tercera columna vemos nuestro código tal y como lo hemos escrito en el FASM y en la última columna vemos algunas aclaraciones que nos pone el olly que nos serán de gran ayuda para entender mejor lo que hace el programa.

Registros: En esa parte del debugger podemos ver los registro que hemos explicado antes y los datos que contienen.

Editor hexadecimal: Vemos nuestro programa tal y como está cargado en memoria. De nuevo todo eso son unos y ceros, pero se expresa en hexadecimal por que para un humano es más facil comprenderlo.

Pila: Aquí podemos ver nuestra famosa pila. Según vayamos ejecutando el programa veremos las cosas que entran y salen de ella y de que manera lo hacen.


Bien, ahora ya sabemos donde están los datos que nos interesan de nuestro programa, pero el programa no se está ejecutando ni haciendo nada, ¿por qué? Este es precisamente el objetivo de un debugger, ejecutar el programa paso a paso, así que vamos a aprender lo necesario para lograrlo.

F8: Si pulsamos esta tecla el programa se ejecutará instrucción a instrucción permitiéndonos ver en cada momento el valor que tienen los registros, las variables y de mas.

F7: Causa el mismo efecto que F8, con la diferencia de que si nos encontramos en un call y pulsamos F8 el programa no entrará dentro de la función, si pulsamos F7 si lo hará y podemos ver como funciona por dentro la misma.

F2: Sirve para poner un breakpoint. Es decir, una “marca” que hará que el programa se para al llegar a ella.

F9: Ejecuta con normalidad el programa a no ser que se encentre con un breakpoint.

Bien, ahora ya conocemos todo lo necesario para depurar nuestros programas, así que manos a la obra. Lo primero que vamos a hacer es poner un breakpoint justo después de la llamada a MessageBoxA pulsando F2. Veréis que el 40201E que indica la posición de memoria de esta instrucción (por lo menos esa es la dirección en mi caso) se pone en rojo.

Ahora vamos a ir pulsando F8 poco a poco para ir viendo lo que sucede. Ejecutamos el mov eax, NULL y si miramos a la derecha, en la zona de los registros, podemos ver como el registro eax se a puesto a cero. Si pulsamos F8 de nuevo veremos como el ebx toma valor 1234.

Ahora entramos en la zona de los push, así que miramos a la pila (abajo a la derecha). Ejecutamos con F8 el primer push y veremos como “empujamos” dentro de la pila un 0. Pulsamos F8 hasta que estemos justamente en el call. Ahora en vez de F8 pulsamos F7 para entrar dentro de la llamada al api MessageBoxA. Lo primero que notaremos es que en la pila entra un parámetro más, el 0x40102E en mi caso por lo menos, que es la dirección de retorno, esto le indica al programa que cuando termine la llamada al api tiene que regresar a ese punto la ejecución.
Si queremos podemos ir pulsando F8 dentro del api, pero como ese código no nos interesa pulsamos F9 para que el programa se ejecute con normalidad. Si lo hacemos veremos que se nos muestra un mensaje emergente y que el programa se detiene donde habíamos puesto nuestro breakpoint.

Finalmente podemos seguir pulsando F8 para ver como van cambiando los registros indicados (incluido el EIP, que apuntará constantemente a la siguiente instrucción) y finalmente salir del programa al llamar al api ExitProcess.


INSTRUCCIONES BÁSICAS DE ASM:

Ha continuación explicaré algunas instrucciones básicas que nos proporcionan los micros de la familia x86. Hay más, podéis googlear un poco para verlas, pero con estas nos apañharemos.
Cuando me refiero a miDWORD, miByte o algo por el estilo, me estoy refiriendo a una variable del tamaño especificado después de "mi". Para hacer las pruebas poned el código entre las etiquetas indicadas a continuación, por ejemplo esto sería para el MOV (se explica a continuación):

Código
  1. include 'H:\Archivos de programa\FASM\INCLUDE\WIN32AX.inc'
  2.  
  3. .data
  4.        miByte  db ?
  5.        miWORD  dw ?
  6.        miDWORD dd ?
  7.  
  8. .code
  9. start:
  10.  
  11.  
  12. ; ---> Aqui haz las pruebas
  13.  
  14. mov eax, ebx    ; eax = ebx
  15. mov eax, 1 ; Hace eax = 1
  16. mov eax, miDWORD ; eax = Puntero a una variable
  17. mov eax, [miDWORD]  ; eax = Contenido de la variable
  18. mov [miDWORD], eax ; MiDWORD pasa a valer lo que valga eax
  19. ;mov [miDWORD], [otroDWORD] ; No válido
  20.  
  21. ; <--- FIN
  22.  
  23. invoke ExitProcess, 0
  24.  
  25. .end start


MOV destino, origen
 Sirve para mover información del origen al destino. Por ejemplo de un registro a otro, de un registro a una variable, etc. Aunque no nos sirve para mover datos entre dos variables.

Ejemplos:

mov eax, ebx    ; eax = ebx
mov eax, 1 ; Hace eax = 1
mov eax, miDWORD ; eax = Puntero a una variable
mov eax, [miDWORD]  ; eax = Contenido de la variable
mov [miDWORD], eax ; MiDWORD pasa a valer lo que valga eax
;mov [miDWORD], [otroDWORD] ; No válido

Es muy importante distinguir que en FASM si ponemos una variable entre “[ ]” nos estamos refiriendo a su contenido y si no a su posición en memoria.

INC/DEC Variable o registro

INC suma uno a una variable o registro y DEC le resta uno.

Ejemplos:

inc eax
dec ecx
inc [miDWORD]
dec [miDWORD]

ADD/SUB Destino, Cantidad

ADD suma un determinado número a un registro o variable. SUB lo resta. Como siempre no está permitido sumar o restar datos directamente entre variables.

Ejemplos:

add eax, 5
add edi, [miDWORD]
add [miDWORD], eax
sub [miDWORD], 2

MUL Multiplicando

MUL varía dependiendo de si el Multiplicando tiene 8 bits, 16 bits o 32 bits:
- Para 8 bits se hace AL * Multiplicando. Se guarda el resultado en AX.
- Para 16 bits se hace AX * Multiplicando. Se guarda el resultado en DX..AX (DX..AX significa que se concatenan los valores, es decir si DX = 0001 y AX = 2001 DX..AX = 00012001)
- Para 32 bits se hace EAX * Multiplicando. Se guarda el resultado en EDX:EAX

Ejemplo:

mov [miDWORD], 0x12932
mov eax, 0x54562
mul [miDWORD]
; EDX..EAX = 0x000000061E863F24

DIV Divisor

DIV de nuevo varía un poco dependiendo de si el divisor tiene 8 bits, 16 bits o 32 bits:
- Para 8 bits se hace AL / Divisor. Se guarda el resultado AL y el resto en AH.
- Para 16 bits se hace DX..AX / Divisor. Se guarda el resultado en AX y el resto en DX.
- Para 32 bits se hace EDX..EAX / Divisor. Se guarda el resultado en EAX y el resto en EDX.

Ejemplo:

mov [miByte], 4
mov al, 9
div [miByte]
; al = Resultado entero = 9/4 = 2
; ah = Resto = 1

PUSH DWORD

PUSH mete un DWORD en la pila. La pila se utiliza por ejemplo para pasar parámetros a las funciones o para utilizar variables locales. Es importante que cada PUSH tenga un POP (ahora lo explico).

Ejemplos:

push [miDWORD]
push eax
push edi

POP DWORD

POP al contrario que PUSH saca un DWORD de la pila.

Ejemplos:

push [miDWORD]
pop ebx
push eax
pop [miDWORD]

Como ya sabéis podéis ver como cambia la pila con el olly por ejemplo ;)

RET

RET se usa generalmente para regresar de una función. Lo que hace realmente es “popear” un DWORD de la pila y saltar a él. De ahí que en las funciones se meta la dirección de retorno en la pila y con el RET continúe la ejecución del programa donde corresponde.
A los interesados en el Stack Overflow esto les puede interesar bastante ;)

JMP Etiqueta/Dirección

JMP viene de jump y como el nombre indica vale para saltar a una determinada posición de memoria. FASM nos permite utilizar etiquetas que no son más que una palabra seguida de “:” para facilitar el salto. Luego el linker ya se encarga de ajustarlo todo. Con un ejemplo se entiende mejor.

Ejemplo:

jmp continuar
mov eax, eax ; Esto no se ejecutaría
continuar:

CMP Valor1, Valor2

CMP compara dos valores. En realidad lo que hace esta instrucción es restar el Valor2 del Valor1 y activar el Flag correspondiente a el resultado. Por ejemplo si son iguales, si uno es mayor que el otro… (un Flag es como un registro pero que solo almacena 1 bit).
Usaremos esta instrucción para los saltos condicionales que se explicarán a continuación.

SALTOS CONDICIONALES:

Estos saltos se diferencian del JMP en que mientras que el primero salta donde le indiquemos siempre estos pueden hacerlo o no. Esto nos puede resultar muy útil para simular lo que sería la estructura IF de un lenguaje de alto nivel por poner un ejemplo.

Hay muchos tipos, así que no pondré todos, pero por citar algunos:
JE – Salta si los números comparados son iguales.
JNE – Salta si no son iguales.
JG – Salta si Valor1 es mayor que Valor2.
JGE – Salta si Valor1 es mayor o igual que Valor2.
JB – Salta si Valor1 es menor que Valor2.
JBE – Salta si Valor1 es menor o igual que Valor2.

Como ya he dicho hay muchos más, así que buscad un poco por google, que son unos cuantos para ponerlos todos.

Ejemplo:

mov eax, 2
cmp eax, 2
je salir

 invoke MessageBox, 0, 'No salta', '', 0 ; Esto no se ejecuta

salir:
        invoke ExitProcess, 0


Ejercicos propuestos (no seais vagos!  :¬¬ )

- Hacer un programa que inicialice a 2 el registro eax, a 5 el ebx y los sume quedando su resultdo en eax

- Hacer un programa que halle la media de los valores 7, 8, 5, 2 ,9 ,1 ,0  y 3

- Hacer un programa que meta en la pila los valores 1, 2, 3, 4, 5 y 6 y los asigne a los registros eax, ebx, ecx, edx, edi y esi respectivamente con un pop

- Implementar la instrucción IF de los lenguajes de alto nivel con saltos condicionales

- Hacer un programa que sume dos números que indikemos en el código y si la suma es mayor que 5 muestre un mensaje, si no salga (para mostrar el mensaje poner esa línea: invoke MessageBox, 0, 'Mayor que 5', '', 0 )



INSTRUCCIONES LÓGICAS:

Aparte de las instrucciones que he puesto (y las que no he puesto :P) hay una serie de operaciones lógicas que nos sirven para tratar con bits. Aquí dejo las tablas de verdad de algunas de ellas. No os preocupéis si no sabéis aun que significa cada cosa, más abajo las explico todas, solo echadle un ojo a la tabla:

         X   Y      AND         OR        XOR                 |                X   NOT
         0    0      0             0          0                      |                0   1
         0    1      0             1          1                      |                1   0
         1    0      0             1          1                      |
         1    1      1             1          0                      |

Aparte de las que hay en la tabla también vamos a ver otras ;) No voy a entrar en mucho detalle, se usan como todas las instrucciones que ya he explicado, solo hay que seguir la tabla.


NOT Destino

Lo que hace esta operación lógica es cambiar 1’s por 0’s y viceversa. Imaginaos que tenemos en eax el valor 001101 (en binario), tras hacer un “not ax” nos quedaría almacenado en ese mismo registro 110010.

AND Destino, Dato

Imaginemos que tenemos guardado en eax el valor 101011 y en ebx el valor 011101,. Tras hacer “and eax, ebx” nos quedaría guardado en eax el valor  001001.

OR Destino, Dato

Imaginemos que ahora tenemos guardado en eax 1010 y en ebx 1100. Tras hacer “or eax, ebx” nos quedaría guardado en eax 1110.

XOR Destino, Dato

Ahora tenemos en eax 10110 y en ebx 11011. Tras hacer “xor eax, ebx” nos quedaría en eax 01101. Esta operación es especialmente útil (y muy utilizada) en métodos de cifrado, ya que si os fijáis en su tabla de verdad al hacer un xor a un bit “destino” con otro bit “dato” que valga 5 por poner un ejeplo, el bit “destino” quedará totalmente irreconocible. Lo gracioso del asunto es que si volvemos a hacer al bit “destino” un xor de nuevo con un 5 volverá a valer lo que valía en un inicio.

ROL/ROR Destino, Rotación

Estas operaciones a nivel bit lo que hacen es mover hacia la izquierda (ROL) o hacia la derecha (ROR) un grupo de bits tantas posiciones como indique “Rotación”. Imaginemos que hacemos “ror eax, 2” pues moveríamos todos los bits de eax dos posiciones hacia la derecha. ¿Qué pasa con los bits que estan muy a la derecha y se salen? Pues simplemente “entran” por la izquierda. Podemos imaginar que los bits están formando un círculo y los vamos desplazando por el mismo con ROR y ROL. Por poner un ejemplo si tenemos estos bits “101011” y les hacemos un ROL con “rotación” 1 nos quedaría 010111.

SHL/SHR Destino, Rotación

SHL es como ROL y SHR como ROR con la diferencia de que los bits que se salen al ser desplazados no entran por el otro lado, si no que los bits que se pierden son reemplazados por ceros. Por poner un ejemplo si hacemos un SHL con “rotación” 2 a 000101 nos quedaría 010100. Si os fijáis un poco veréis que 000101 en decimal es 5 y 010100 es 20. Es decir que SHL con rotación 1 es como multiplicar por 2, con rotación 2 es como multiplicar por 4….



Hasta aquí el apartado de instrucciones lógicas. Hay muchas más, al igual que hay muchas más instrucciones propias de ensamblador, pero por falta de tiempo no puedo explicarlas todas, así que recomiendo mirar las que faltan. Por recomendar algunas webs interesantes:

http://www.jegerlehner.com/intel/IntelCodeTable_es.pdf
http://www.wikilearning.com/curso_gratis/curso_de_programacion_de_virus-introduccion/4312-1


ESTRUCTURA DEL CÓDIGO EN FASM:

Una vez ya conocemos todas las instrucciones básicas con las que cuenta nuestro microprocesador ya podemos empezar a programar cosas más serias y útiles :P.
Para ello tenemos que saber como escribir nuestro código para que FASM lo entienda y genere un ejecutable.
FASM tiene diversas formas de estructurar el código, entre ellas destacan estas tres:


1 - Lo primero de debemos hacer es incluir el win32ax: include 'C:\archivos de programa\fasm\include\win32ax.inc' claro, que variará dependiendo de donde tengáis instalado el FASM ;)

Con este método nos ahorramos construir el ImportData a mano, es decir, ir poniendo el nombre de cada api que usamos indicando la dll a la que pertenece.
La estructura básica es esta:

Código
  1. include 'win32ax.inc'
  2.  
  3. .data
  4. ; Aqui van las variables
  5.  
  6. .code
  7. start: ; Aqui empezaria el programa
  8. ; Aqui va el código
  9.  
  10. ; Aquí abajo tambien podemos poner variables :D
  11. .end start ; Aqui terminaria el programa
  12.  

Si os fijais en el ejecutable generado mediante este método y sabéis un poco del formato PE veréis que aparte de las secciones .data y .code que le hemos indicado nosotros también a creado el solo una sección .idata con los nombres de todas las apis que hemos utilizado.

La ventaja de esta forma de estructurar el código es clara: nos ahorramos un montón de trabajo generando el ImportData a mano.
Las desventajas son que si por ejemplo queremos usar un api que no esté declarada en la win32ax.inc tenemos que cargarla con LoadLibrary y GetProcAddress, mientras que si hubiesemos creado el ImportData a mano esto no pasaría.

2 - Para este método podemos incluir de nuevo win32ax o win32a (la ax es la versión extendida, tiene mas declaraciones:

Código
  1. format PE GUI ; Tipo de ejecutable
  2. entry start  ; El "main" de nuestro código
  3.  
  4. section '.code' code readable executable
  5.  
  6. start:
  7.  
  8.        ; Aqui el codigo
  9.  
  10. section '.data' data readable writeable
  11.  
  12. ; Aqui las variables
  13.  
  14. section '.idata' import data readable writeable
  15.  
  16. ; Aqui el ImportData

Mirad el ejemplo que viene con FASM en la ruta FASM\EXAMPLES\PEDEMO para ver como funciona ;) Este formato es de lo más útil para manejar cuantas secciones queremos que tenga el archivo, sus características y donde queremos que vaya cada cosa dentro de las mismas.

3 - Otra opción es no señalar ninguna sección, con lo que FASM creará una única sección llamada “.flat” en la que pondrá todo, las estructura es esta:

Código
  1. include 'H:\Archivos de programa\FASM\INCLUDE\WIN32A.inc'
  2. ; Aqui el codigo
  3. ; Aqui las variables
  4. data import
  5. ; Aqui el ImportData
  6. end data

Mirad el ejemplo FASM\EXAMPLES\BEER para más información :P


VARIABLES EN FASM:

A diferencia de los lenguajes de programación de alto nivel en ensamblador no tenemos variables del tipo char, integer, long o cosas por el estilo, con ensamblador trataremos directamente con bytes y conjuntos de bytes. Los tipos principales de datos y con los que nos apañharemos son tres. El byte, el word (16 bits, es decir, 2 bytes) y el dword (32bits, es decir, 4 bytes).

La declaración de variables es muy simple, solamente hay que poner (en el sitio donde corresponda, que eso ya lo hemos visto en el punto anterior) el nombre de la variable, seguido de su tipo (db si es un byte, dw si es un word o dd si es un dword) seguido de un ? si queremos que no se inicialice con ningún valor o también podemos indicar el valor con el que queremos que se inicialice la variable. Por ejemplo:


Código
  1.  
  2.        cad db 'Hola', 0  ; Variable de tipo byte. Como podeis apreciar
  3.                          ; la inicialozamos con un valor que es muy superior
  4.                          ; a un unico byte, ya que FASM nos permite construir
  5.                          ; cadenas de texto de esta manera. Fiajaos en el 0
  6.                          ; final, es es caracter de fin de cadena, que es un
  7.                          ; caracter que debemos poner para saber donde termina
  8.                          ; la cadena.
  9.        palabra dw ?      ; Word no incializado
  10.        doble   dd 5      ; Dword inicializado a 5, es decir, esos cuatro bytes
  11.                          ; contienen el valor 5
  12.  

Si en vez de usar db, dd o lo que sea ponemos rb, rd seguido de un número lo que haremos será reservar tantas veces se indique en ese número, hechadle un ojo con el olly a este código:

Código
  1. include 'H:\archivos de programa\fasm\include\win32ax.inc'
  2.  
  3. .data
  4.        doble    rd 4  ; Reservamos 4 dwords
  5.        cadena   rb 50 ; Reservamos 50 bytes
  6.        palabra  rw 2  ; Reservamos 2 words
  7.  
  8. .code
  9. start:
  10.  
  11.       mov [doble+4], 5
  12.       leave
  13.       ret
  14.  
  15. .end start  

Pues ya está con esto ya sabemos declarar variables. Para utilizarlas solo tenéis que referiros a ellas como hemos hecho en los puntos anteriores con mov’s, and’s y de más ;)





Tras todo esto ya solo os queda aprender un poco el api del vuestro sistema operativo (podéis usarla con invoke o push + call) y empezar a realizar vuestras propias aplicaciones ;) Mucha suerte.

1S4ludo E0N

Versión para leer sin conexión:
http://e0n-productions.blogspot.com/2009/01/taller-asm.html



14  Programación / Ingeniería Inversa / Saber q api's usa el task manager en: 20 Noviembre 2007, 16:42 pm
Hola

No se muy bien si esto va aki, pero supongo q si ;)

Alguien podria indicarme q apis utiliza el administrador de tareas de windows (o decirme como puedo saberlo) para llenar la lista de procesos??

Saludos  ;)
15  Programación / .NET (C#, VB.NET, ASP) / Ejercicios básicos C# en: 25 Octubre 2007, 17:39 pm
Pues eso, como e empezado hace pokito con C# he heho los típicos ejercicios básicos y los keria compartir con vosotros, y si kereis pues animaros y poner alguno vuestro ;)

Mini-Calculadora en modo consola:
Código
  1. using System;
  2.  
  3. namespace Calculadora
  4. {
  5. class Program
  6. {
  7. public static void Main(string[] args)
  8. {
  9. float  primero;     // El primer número
  10. float  segundo;     // El segundo número
  11. string operacion;   // La operación a realizar
  12.  
  13. Console.Title = "Mini-Calculadora"; // Damos formato a la consola
  14. Console.BackgroundColor = ConsoleColor.White;
  15. Console.ForegroundColor = ConsoleColor.Blue;
  16. Console.Clear();
  17.  
  18. Console.SetCursorPosition (3,2); // Pedimos el primer número
  19. Console.WriteLine ("Introduzca el primer  número");
  20. Console.SetCursorPosition (60,2);
  21. primero = float.Parse(Console.ReadLine());
  22.  
  23. Console.SetCursorPosition (3,3); // Pedimos la operación
  24. Console.WriteLine ("Introduzca la operación a realizar (+,-,*,/)");
  25. Console.SetCursorPosition (59,3);
  26. operacion = Console.ReadLine();
  27.  
  28. Console.SetCursorPosition (3,4); // Pedimos el segundo número
  29. Console.WriteLine ("Introduzca el segundo número");
  30. Console.SetCursorPosition (60,4);
  31. segundo = float.Parse(Console.ReadLine());
  32.  
  33.  
  34. Console.SetCursorPosition (57,5); // Mostramos la solucion...
  35. Console.WriteLine ("__________");
  36.  
  37. Console.SetCursorPosition (3,6);
  38. Console.WriteLine ("El resultado es");
  39. Console.SetCursorPosition (60,6);
  40.  
  41. Console.WriteLine (calcular(primero,segundo,operacion));
  42. Console.ReadKey ();
  43.  
  44. }
  45.  
  46. private static string calcular (float primero , float segundo, string operacion)
  47. {
  48. float temp;
  49. switch (operacion) // Estructura con switch
  50. {
  51. case "+":
  52. temp = primero + segundo;
  53. return temp.ToString ();
  54. case "-":
  55. temp = primero - segundo;
  56. return temp.ToString ();
  57. case "*":
  58. temp = primero * segundo;
  59. return temp.ToString ();
  60. case "/":
  61. temp = primero / segundo;
  62. return temp.ToString ();
  63. }
  64. return "-1";
  65. }
  66. }
  67. }
  68.  


Mini-Calculadora en modo gráfico: (los nombres de los controles son faciles de deducir viendo el code  :P)
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5. using System.Text;
  6.  
  7. namespace Calculadora
  8. {
  9. /// <summary>
  10. /// Description of MainForm.
  11. /// </summary>
  12. public partial class MainForm : Form
  13. {
  14. int   oper ;   // 1 -> + | 2 -> - | 3 -> * | 4 -> /
  15. float primero;
  16.  
  17.  
  18. public MainForm()
  19. {
  20. InitializeComponent();
  21. }
  22.  
  23. void Numero7Click(object sender, EventArgs e)
  24. {
  25. txtnum.Text = txtnum.Text + 7;
  26. }
  27.  
  28. void Numero8Click(object sender, EventArgs e)
  29. {
  30. txtnum.Text = txtnum.Text + 8;
  31. }
  32.  
  33. void Numero9Click(object sender, EventArgs e)
  34. {
  35. txtnum.Text = txtnum.Text + 9;
  36. }
  37.  
  38. void Numero4Click(object sender, EventArgs e)
  39. {
  40. txtnum.Text = txtnum.Text + 4;
  41. }
  42.  
  43. void Numero5Click(object sender, EventArgs e)
  44. {
  45. txtnum.Text = txtnum.Text + 5;
  46. }
  47.  
  48. void Numero6Click(object sender, EventArgs e)
  49. {
  50. txtnum.Text = txtnum.Text + 6;
  51. }
  52.  
  53. void Numero1Click(object sender, EventArgs e)
  54. {
  55. txtnum.Text = txtnum.Text + 1;
  56. }
  57.  
  58. void Numero2Click(object sender, EventArgs e)
  59. {
  60. txtnum.Text = txtnum.Text + 2;
  61. }
  62.  
  63. void Numero3Click(object sender, EventArgs e)
  64. {
  65. txtnum.Text = txtnum.Text + 3;
  66. }
  67.  
  68. void Numero0Click(object sender, EventArgs e)
  69. {
  70. txtnum.Text = txtnum.Text + 0;
  71. }
  72.  
  73. void CClick(object sender, EventArgs e)
  74. {
  75. txtnum.Text = "";
  76. }
  77.  
  78. void DivClick(object sender, EventArgs e)
  79. {
  80. oper = 4;
  81. primero = float.Parse (txtnum.Text);
  82. txtnum.Text = "";
  83. }
  84.  
  85. void MulClick(object sender, EventArgs e)
  86. {
  87. oper = 3;
  88. primero = float.Parse (txtnum.Text);
  89. txtnum.Text = "";
  90. }
  91.  
  92. void ResClick(object sender, EventArgs e)
  93. {
  94. oper = 2;
  95. primero = float.Parse (txtnum.Text);
  96. txtnum.Text = "";
  97. }
  98.  
  99. void SumClick(object sender, EventArgs e)
  100. {
  101. oper = 1;
  102. primero = float.Parse (txtnum.Text);
  103. txtnum.Text = "";
  104. }
  105.  
  106. void SolClick(object sender, EventArgs e)
  107. {
  108. float segundo = int.Parse (txtnum.Text);
  109. float resultado;
  110.  
  111. switch (oper)
  112. {
  113. case 1:
  114. resultado = primero + segundo;
  115. txtnum.Text =  resultado.ToString();
  116. break;
  117. case 2:
  118. resultado = primero - segundo;
  119. txtnum.Text = resultado.ToString();
  120. break;
  121. case 3:
  122. resultado = primero * segundo;
  123. txtnum.Text = resultado.ToString();
  124. break;
  125. case 4:
  126. resultado = primero / segundo;
  127. txtnum.Text = resultado.ToString();
  128. break;
  129. }
  130. }
  131. }
  132. }

Un ejemplo muy simple para resolver ecuaciones de seegundo grado (añadir 3 text box y un boton):
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8.  
  9. namespace Ecuaciones
  10. {
  11.    public partial class Form1 : Form
  12.    {
  13.        public Form1()
  14.        {
  15.            InitializeComponent();
  16.        }
  17.  
  18.        private void resolver_Click(object sender, EventArgs e)
  19.        {
  20.            ecuacion miEcuacion =  new ecuacion (double.Parse(a.Text), double.Parse(b.Text), double.Parse(c.Text));
  21.        }
  22.    }
  23. }


Exporador de carpetas: (añadir un text box "txtRuta" dos listas "lbcar" y "lbar" y un boton con nombre por defecto)
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;
  8. using System.IO;
  9.  
  10. namespace ExploradorCarpetas
  11. {
  12.    public partial class Form1 : Form
  13.    {
  14.        public Form1()
  15.        {
  16.            InitializeComponent();
  17.        }
  18.  
  19.        // El form load
  20.        private void Form1_Load(object sender, EventArgs e)
  21.        {
  22.            // Iniciamos el txtRuta
  23.            txtRuta.Text = Directory.GetDirectoryRoot(Directory.GetCurrentDirectory());
  24.  
  25.            // Listamos las carpetas
  26.            carpetas(txtRuta.Text);
  27.  
  28.            // Listamos los archivos
  29.            archivos(txtRuta.Text);
  30.        }
  31.  
  32.        // El botón para explorar rutas
  33.        private void button1_Click(object sender, EventArgs e)
  34.        {
  35.            // Listamos las carpetas
  36.            carpetas(txtRuta.Text);
  37.  
  38.            // Listamos los archivos
  39.            archivos(txtRuta.Text);
  40.        }
  41.  
  42.        // Al hacer doble click sobre una ruta la colocamos en txtRuta
  43.        private void lbcar_DoubleClick(object sender, EventArgs e)
  44.        {
  45.            txtRuta.Text = lbcar.SelectedItem.ToString();
  46.  
  47.            // Listamos las carpetas
  48.            carpetas(txtRuta.Text);
  49.  
  50.            // Listamos los archivos
  51.            archivos(txtRuta.Text);
  52.        }
  53.  
  54.        // Metodo que coloca las carpetas de la ruta indicada en el list
  55.        // box correspondiente
  56.        private void carpetas(string ruta)
  57.        {
  58.            lbcar.Items.Clear();
  59.  
  60.            string[] carpeta = Directory.GetDirectories(ruta);
  61.  
  62.            foreach(string car in carpeta)
  63.                lbcar.Items.Add (car);
  64.        }
  65.  
  66.        // Metodo que coloca los archivos de la ruta indicada en el list
  67.        // box correspondiente
  68.        private void archivos(string ruta)
  69.        {
  70.            lbar.Items.Clear();
  71.  
  72.            string[] archivo = Directory.GetFiles(ruta);
  73.  
  74.            foreach (string ar in archivo)
  75.                lbar.Items.Add(ar);
  76.        }
  77.    }
  78. }


Operaciones simples con matrices:
Código
  1. using System;
  2.  
  3. namespace Matrices
  4. {
  5. class Program
  6. {
  7. public static void Main(string[] args)
  8. {
  9. float [,] mat1; // Las matrices
  10. float [,] mat2;
  11.  
  12. int f1, c1;   // El número de filas y columnas de las matrices
  13. int f2, c2;
  14.  
  15. //Llamamos al menu y recojemos la opción seleccionada
  16. byte opcion;
  17. do {
  18. opcion = menu();
  19. } while (opcion >= 5);
  20.  
  21. switch (opcion)
  22. {
  23. case 1: // SUMA
  24.  
  25. // Leemos el número de filas y columnas de las matrices 1 y 2
  26. Console.WriteLine ("Introduzca el número de filas de las matrices 1 y 2");
  27. f1 = int.Parse (Console.ReadLine());
  28. Console.WriteLine ("Introduzca el número de columnas de las matrices 1 y 2");
  29. c1 = int.Parse (Console.ReadLine());
  30.  
  31. // Pedimos los datos de filas y columnas
  32. Console.WriteLine ("Introduzca los datos de la matriz 1 enumerandolos por filas:");
  33. mat1 = leer(f1,c1);
  34. Console.WriteLine ("Introduzca los datos de la matriz 2 enumerandolos por filas:");
  35. mat2 = leer(f1,c1);
  36.  
  37. //Mostramos la suma de ambas matrices
  38. suma(mat1,mat2);
  39. break;
  40.  
  41. case 2: // RESTA
  42.  
  43. // Leemos el número de filas y columnas de las matrices 1 y 2
  44. Console.WriteLine ("Introduzca el número de filas de las matrices 1 y 2");
  45. f1 = int.Parse (Console.ReadLine());
  46. Console.WriteLine ("Introduzca el número de columnas de las matrices 1 y 2");
  47. c1 = int.Parse (Console.ReadLine());
  48.  
  49.  
  50. // Pedimos los datos de filas y columnas
  51. Console.WriteLine ("Introduzca los datos de la matriz 1 enumerandolos por filas:");
  52. mat1 = leer(f1,c1);
  53. Console.WriteLine ("Introduzca los datos de la matriz 2 enumerandolos por filas:");
  54. mat2 = leer(f1,c1);
  55.  
  56. // Mostramos la resta de ambas matrices
  57. resta (mat1, mat2);
  58. break;
  59.  
  60. case 3: // PRODUCTO POR UN ESCALAR
  61.  
  62. // Leemos el número de filas y columnas de la matriz 1
  63. Console.WriteLine ("Introduzca el número de filas de la matriz 1");
  64. f1 = int.Parse (Console.ReadLine());
  65. Console.WriteLine ("Introduzca el número de columnas de la matriz 1");
  66. c1 = int.Parse (Console.ReadLine());
  67.  
  68. float escalar;
  69. Console.WriteLine ("Introduzca el escalar por el que quiere multiplicar la matriz");
  70. escalar = float.Parse(Console.ReadLine());
  71.  
  72. // Pedimos los datos de filas y columnas
  73. Console.WriteLine ("Introduzca los datos de la matriz 1 enumerandolos por filas:");
  74. mat1 = leer(f1,c1);
  75.  
  76. // Mostramos la solución
  77. prodEscalar (mat1,escalar);
  78.  
  79. break;
  80. }
  81. Console.ReadKey();
  82. }
  83.  
  84. // Función que muestra el menu de selección de operaciones
  85. public static byte menu()
  86. {
  87. try {
  88. byte opcion;
  89. Console.SetCursorPosition(10,1);
  90. Console.WriteLine("Menú:");
  91. Console.SetCursorPosition(0,3);
  92. Console.WriteLine("Elija la operación que quiere hacer:");
  93. Console.WriteLine("1 - Suma de matrices");
  94. Console.WriteLine("2 - Resta de matrices");
  95. Console.WriteLine("3 - Producto por un escalar");
  96.  
  97. opcion = byte.Parse (Console.ReadLine());
  98.  
  99. if (opcion >=1 && opcion <=3) {
  100. Console.Clear();
  101. return opcion;
  102. }
  103. else {
  104. Console.Clear();
  105. return 5;
  106. }
  107. } catch {     //En caso de error
  108. Console.Clear();
  109. return 5;
  110. }
  111. }
  112.  
  113. // Función que lee los datos de las matrices
  114. public static float [,] leer(int filas, int columnas)
  115. {
  116. float [,] ret = new float [filas, columnas];
  117. for (int fila = 0; fila < filas; fila++)
  118. {
  119. for (int columna = 0; columna  < columnas; columna++)
  120. {
  121. ret[fila,columna] = float.Parse (Console.ReadLine());
  122. }
  123. }
  124. return ret;
  125. }
  126.  
  127. // La función suma
  128. public static void suma (float [,] mat1, float [,] mat2)
  129. {
  130. Console.WriteLine ("La suma de sus dos matrices es (enumeradas por filas)");
  131. for (int fila = 0; fila <= mat2.GetUpperBound(0); fila++)
  132. {
  133. for (int columna = 0; columna <= mat2.GetUpperBound(1); columna++)
  134. {
  135. float suma;
  136. suma = mat1[fila,columna] + mat2[fila,columna];
  137. Console.WriteLine (suma.ToString());
  138. }
  139. Console.WriteLine("");
  140. }
  141. }
  142.  
  143. // La función resta
  144. public static void resta (float [,] mat1, float [,] mat2)
  145. {
  146. Console.WriteLine ("La resta de sus dos matrices es (enumeradas por filas)");
  147. for (int fila = 0; fila <= mat2.GetUpperBound(0); fila++)
  148. {
  149. for (int columna = 0; columna <= mat2.GetUpperBound(1); columna++)
  150. {
  151. float resta;
  152. resta = mat1[fila,columna] - mat2[fila,columna];
  153. Console.WriteLine (resta.ToString());
  154. }
  155. Console.WriteLine("");
  156. }
  157. }
  158.  
  159. // Producto por un escalar
  160. public static void prodEscalar (float [,] mat1, float escalar)
  161. {
  162. Console.WriteLine ("La multiplicación del escalar por su matriz es (enumerada por filas)");
  163. for (int fila = 0; fila <= mat1.GetUpperBound(0); fila++)
  164. {
  165. for (int columna = 0; columna <= mat1.GetUpperBound(1); columna++)
  166. {
  167. float esc;
  168. esc = mat1[fila,columna] * escalar;
  169. Console.WriteLine (esc.ToString());
  170. }
  171. Console.WriteLine("");
  172. }
  173. }
  174. }
  175. }

Windows-pong, con dos botones y un radio buton simulo en clasico pong, muy cutre pero entretenido xDDD

Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Windows.Forms;
  5.  
  6. namespace MiniJuegoPelota
  7. {
  8. /// <summary>
  9. /// Description of MainForm.
  10. /// </summary>
  11. public partial class MainForm : Form
  12. {
  13. //  1 -> Derecha      -1 -> Izquierda
  14. //  1 -> Abajo        -1 -> Arriba
  15. private int dx = -1, dy = 1;
  16.  
  17. // Variables q contiene la ultima tecla pulsada por cierta pala
  18. // para q el rebote se efectue en una o otra direcion
  19. // 'u' (up) -> arriba     'd' (down) -> abajo
  20. private char d1, d2;
  21.  
  22.  
  23. public MainForm()
  24. {
  25. InitializeComponent();
  26. }
  27.  
  28. void Timer1Tick(object sender, EventArgs e)
  29. {
  30. // Movemos la "pelota"
  31. pelota.Left += dx;
  32. pelota.Top  += dy;
  33.  
  34. // Para el movimiento de la pelota
  35.  
  36. //dx = pelota.Location.X >= this.ClientSize.Width ? -1 : dx;
  37. //dx = pelota.Location.X  == 0 ? 1 : dx;
  38.  
  39. if (pelota.Location.X + 18 >= this.ClientSize.Width)
  40. {
  41. timer1.Enabled = false;
  42. MessageBox.Show("Gana el jugador 1", "Felicidades");
  43. }
  44. if (pelota.Location.X == 0)
  45. {
  46. timer1.Enabled = false;
  47. MessageBox.Show("Gana el jugador 2", "Felicidades");
  48. }
  49.  
  50. // Si choca contra la parte inferior o el menú
  51. dy = pelota.Location.Y + 50  >= this.ClientSize.Width ? -1 : dy;
  52. dy = pelota.Location.Y  == 25 ? 1 : dy;
  53.  
  54. // Si choca contra la pala1
  55. if (pelota.Left == pala1.Left + pala1.Width)
  56. {
  57. if (pelota.Top > pala1.Top && pelota.Top < pala1.Top + pala1.Height)
  58. {
  59. dx = 1; // Hacemos que valla hacia la derecha
  60. // y en funcion de la ultima tecla pulsada hacia arriba o abajo
  61. dy = d1 == 'u' ? -1 : 1;
  62. }
  63. }
  64.  
  65. // Si choca contra la pala2
  66. if (pelota.Left == pala2.Left - pala2.Width)
  67. {
  68. if (pelota.Top > pala2.Top && pelota.Top < pala2.Top + pala2.Height)
  69. {
  70. dx = -1; // Hacemos que valla hacia la izq
  71. // y en funcion de la ultima tecla pulsada hacia arriba o abajo
  72. dy = d2 == 'u' ? -1 : 1;
  73. }
  74. }
  75.  
  76. }
  77.  
  78.  
  79.  
  80. //Para mover la pala 1 A = arriba, Z = abajo
  81. //Para mover la pala 2 K = arriba, M = abajo
  82. void MainFormKeyPress(object sender, KeyPressEventArgs e)
  83. {
  84. switch (Char.ToUpper(e.KeyChar))
  85. {
  86. case 'A': //La pala1
  87. pala1.Top -= 10;
  88. if (pala1.Top  < 25) pala1.Top = 25;
  89. d1 = 'u';
  90. break;
  91. case 'Z':
  92. pala1.Top +=  10;
  93. if (pala1.Top + pala1.Height  >= this.ClientSize.Height) pala1.Top = this.ClientSize.Height - pala1.Height;
  94. d1 = 'd';
  95. break;
  96.  
  97. case 'K': //La pala2
  98. pala2.Top -= 10;
  99. if (pala2.Top  < 25) pala2.Top = 25;
  100. d2 = 'u';
  101. break;
  102.  
  103. case 'M':
  104. pala2.Top +=  10;
  105. if (pala2.Top + pala2.Height  >= this.ClientSize.Height) pala2.Top = this.ClientSize.Height - pala2.Height;
  106. d2 = 'd';
  107. break;
  108. }
  109. }
  110.  
  111.  
  112. // Las opciones del menú
  113. void NuevoToolStripMenuItemClick(object sender, EventArgs e)
  114. {
  115. timer1.Enabled = true;
  116. pelota.Left = 154;
  117. pelota.Top  = 134;
  118. }
  119.  
  120. void ContrrolesToolStripMenuItemClick(object sender, EventArgs e)
  121. {
  122. MessageBox.Show ("Pulsar las teclas A y K para subir y las teclas Z y M para bajar las respectivas paletas de los jugadores 1 y 2", "Controles");
  123. }
  124.  
  125. void SalirToolStripMenuItemClick(object sender, EventArgs e)
  126. {
  127. Application.Exit();
  128. }
  129. }
  130. }
  131.  

Pues eso es todo, luego a lo mejor me animo y subo un par de ejemplillos simples usando XNA para hacer mini-juegos en 2D  :P

Saludos y animaros a subir vuestros programas básicos ;)
16  Programación / .NET (C#, VB.NET, ASP) / [Duda C#] Problema con visivilidad de objetos en: 2 Octubre 2007, 22:57 pm
Hola a todos

Vereis, tengo un problema con la visibiliad de un objeto, por ejemplo un Text Box.
La cosa es, yo inicio un programa de formularios de windows, le añado un text box  y ahora intento modificar sus propiedades. Desde distintos lugares.

Me voy al MainForm.cs (donde esta añadido mi textBox1) y este es el código que el compilador me pone por defecto:

Código:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace Prueva
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
}
}

Ahora quiero q se muestre "Hola" en el textbox al iniciar y hago esto:

Código:
namespace Prueva
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}

void MainFormLoad(object sender, EventArgs e)
{
textBox1.Text = "Hola";
}
}
}

OK todo perfecto. El problema me viene dado al intentar hacer esto mismo pero desde una clase.... me explco con codigo:

Código:
namespace Prueva
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
}

class miClase
{
// La constructora
miClase()
{
textBox1.Text = "Hola"; //Esta es la linea donde <---
//salta el error         <---
}
}

}

En la línea indicada me salta el siguiente error: "The name 'textBox1' does not exist in the current context (CS0103)" vamos q el texbox no está visible para esa clase e provado a llamarlo de mil maneras distintas pero no lo consigo... alguien sabe como lo puedo llamar??
Gracias por la ayuda, por q  aunke es una duda muy simple me trae de cabeza
17  Programación / Programación Visual Basic / [Source] Spliter en: 27 Septiembre 2007, 12:53 pm
Básicamente es un programa para partir archivos, source y de mas caracteristicas aki:

http://foro.elhacker.net/index.php/topic,182029.msg866752.html#new
18  Programación / .NET (C#, VB.NET, ASP) / Ultimas versiones... =/ (2005 o 2008) en: 21 Septiembre 2007, 14:52 pm
Hola a todos

Estoy pensando en iniciarme en C# y tb en migrar de VB6 a VB net, pero leyendo un poco por el foro me  e encontrado con q hay C# 2005 y 2008 al igual q con VB...

Por el nombre deduzco q la edicion 2008 es la mas nueva  :xD , pero cual es la diferencia entre una y otra? la sintaxis cambia o solamente se mejora el compilador manteniendo la sintaxis? la edicion 2008 tb depende de framework? cual me recomendais personalmente?

Muchas gracias de antemano  ;) 
19  Programación / Programación Visual Basic / [Source] Editor de Server's completo en: 11 Julio 2007, 14:31 pm
Lo prometido es deuda, asi que aquí os lo dejo.

He intentado hacer tanto el código como la forma de uso lo más simple posible.

Funciona de la sihguiente manera:
Compilais el Juntador, el Server y el Cliente. Ejecutais el Juntador y apretais el botoncito que tiene. Os pedira la ruta del clientte y del server, las elegis y ya esta.

Ahora abris el cliente y poneis una ip y un puerto en los text box, le dais al boton y elegis la ruta donde se generará el server, una vez hecho esto podeis borrar el server y el juntador y kedaros solo con el cliente. Si ejecutais ahora el server q se acaba de crea podréis ver como os devueve la ip y el puerto  :P

DESCARGA
20  Media / Juegos y Consolas / Final Fantasy VII para Play Station 1 (español) en: 21 Junio 2007, 11:31 am
Hola

Alguien sabe donde puedo conseguir el FFVII en español para play1??
Si alguien fuera tan amable de pasarmelo se lo agradeceria mucho  ;D

Gracias por adelantado
1S4ludo
Páginas: 1 [2] 3 4 5
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines