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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 ... 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 [344] 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 ... 381
3431  Programación / ASM / Re: Que cosa mas rara en: 3 Noviembre 2009, 23:31 pm
Transformandolo a cadena, cada digito del numero en cuestion debe ser transformado a caracter (no olvides el cero terminador de cadena). Otra opcion es usar la libc (printf/sprintf por ejemplo).
3432  Programación / ASM / Re: Que cosa mas rara en: 3 Noviembre 2009, 23:25 pm
En el primer codigo eso depende del contenido de ecx ... a lo que apunte y lo que haya en esa direccion.

El segundo parametro de write es un puntero asi que lo primero que le pasas es un puntero erroneo (ecx=2). En el segundo caso le pasas un puntero a una cadena que contiene un solo caracter, \n, es decir un salto de linea, si queres ver algo de texto usa una cadena como la que puse antes ...
3433  Programación / ASM / Re: Que cosa mas rara en: 3 Noviembre 2009, 21:25 pm
Si, edx es el tercer parametro es decir: size_t count.

Si, lo ensamble y enlace (con as y ld) pero no hace nada, no funciona tal como esta, si pones lo que te dije si escribira eso en la consola.


3434  Programación / ASM / Re: Que cosa mas rara en: 3 Noviembre 2009, 20:47 pm
A grosso modo en Linux se pone en eax el numero del servicio y los siguientes parametros van en ebx, ecx, edx, esi, edi y ebp.

En /usr/include/asm/ unistd.h/unistd_32.h/unistd_64.h encontraras los numeros de los servicios.

1 es __NR_exit y el 0 que se le pasa como parametro en ebx es el valor de retorno del programa (http://linux.die.net/man/2/exit).

4 es __NR_write y el 1 que le pasas como primer parametro en ebx es STDOUT (salida por consola), el segundo parametro (ecx) deberia ser el puntero a la cadena y el tercer parametro (edx) el tamaño de la cadena.

http://linux.die.net/man/2/write


Un ejemplo funcional:
Código
  1. movl $6, %edx
  2. movl $msg, %ecx
  3. movl    $1, %ebx        
  4. movl    $4, %eax      
  5. int     $0x80
  6.  
  7. ;;resto del codigo
  8. .data
  9. msg:
  10. .string "DAAAA\n"
3435  Programación / ASM / Re: IO.dll ASM en: 2 Noviembre 2009, 16:03 pm
Esa NO es la manera correcta de hacerlo, es un hack.

Mejor usa la API de Windows.
3436  Programación / ASM / Re: Definir tamaño pila ASM en: 31 Octubre 2009, 23:39 pm
Por lo que veo el .STACK no tiene ningun efecto en el ejecutable final.

En la cabecera opcional del PE hay dos campos sobre la pila:
SizeOfStackReserve   Size of stack to reserve. Only the Stack Commit Size is committed; the rest is made available one page at a time, until reserve size is reached.
SizeOfStackCommit   Size of stack to commit.

http://download.microsoft.com/download/e/b/a/eba1050f-a31d-436b-9281-92cdfeae4b45/pecoff.doc

El enlazador (link.exe) se encarga de escribirlos, 0x100000 (1MB) y 0x1000 (4KB=una pagina) son sus valores por defecto. Con la opcion /STACK podes cambiarlos.
3437  Programación / ASM / Re: Potencia (16 bits o 32) en: 31 Octubre 2009, 20:49 pm
No necesitas un driver, en Windows ese lo escribe Microsoft o como mucho el fabricante del hardware. Los programas usan los servicios del S.O. en cuestion (Windows=CreateFile y amigos).
3438  Programación / ASM / Re: Potencia (16 bits o 32) en: 30 Octubre 2009, 23:43 pm
Ademas de ser menos potentes los sistemas de 16 bits son obsoletos, hoy en dia casi todo el mundo tiene maquinas de 64 bits y muchos ya S.O.s de 64 bits.
3439  Programación / ASM / Re: Examen de Ensamblador [Ayuda] en: 30 Octubre 2009, 11:43 am
Tenes que hacer coincidir la convencion de llamada (stdcall, cdecl, etc.) en tu codigo y en la declaracion en el lenguaje de alto nivel. Podes enlazar a nivel de codigo objeto (.obj) y usar librerias estaticas (.lib de codigo)  o dinamicas (.dll y .lib de importacion).


Lo siguiente es un articulo/tutorial/lo que sea que escribi hace ya un poco mas de 5 años:



Bueno supongo que todos saben que la mayoria de los compiladores de C++ permiten incluir instrucciones de ensamblador dentro del codigo fuente y estas son ensambladas directamente en el codigo objeto. A esto se le llama inline assembler generalmente.

Pero eso no es siquiera interesante; lo que si es muy interesante es la capacidad de escribir librerias (estaticas y dinamicas) tanto en ensamblador como en C++ (MASM y VC++) y linkearlas en ambos lenguajes.

Osea, que por ejemplo podemos crear una libreria en ensamblador y linkearla estaticamente en un programa de C++. Vamos a ver el ejemplo.

Codigo de la libreria de ensamblador:


Código
  1. .386
  2. .model stdcall,flat
  3.  
  4. include windows.inc
  5. include kernel32.inc
  6. include user32.inc
  7.  
  8. includelib kernel32.lib
  9. includelib user32.lib
  10.  
  11. CTEXT MACRO text:VARARG
  12. LOCAL TxtName
  13. .data
  14. TxtName BYTE text,0
  15. .code
  16. EXITM <OFFSET TxtName>
  17. ENDM
  18.  
  19. SayLong PROTO number:DWORD
  20.  
  21. .code
  22.  
  23. SayLong PROC number:DWORD
  24. LOCAL pointer:DWORD
  25. invoke GetProcessHeap
  26. invoke HeapAlloc,eax,HEAP_ZERO_MEMORY or HEAP_GENERATE_EXCEPTIONS,1024
  27. mov pointer,eax
  28. invoke wsprintf,pointer,CTEXT("%d"),number
  29. invoke MessageBox,0,pointer,pointer,0
  30. invoke GetProcessHeap
  31. invoke HeapFree,eax,0,pointer
  32. ret
  33. SayLong ENDP
  34.  
  35. End



Tranquilidad que ahora paso a explicar el codigo anterior.

.386 es una directiva que le indica a MASM que nuestro codigo va optimizado para la arquitectura 386

.model stdcall,flat es una directiva que le indica a MASM que nuestro codigo usa stdcall (convencion de funciones que utiliza la API de Windows) y un modelo de memoria plano (el unico posible en Windows).

Los includes justamente incluyen bibliotecas al estilo de los .H de C++, para conseguir estas bibliotecas hay que tener MASM32 MASM32 instalado y con el path configurado.

Los includelib nos ahorran pasarle en la linea de comandos parametros de librerias que vamos a linkear, tambien hay que tener el MASM32 o sino crearlas (eso lo dejamos para otro tutorial).

El macro CTEXT nos permite utilizar texto al modo de C++ usando CTEXT("TEXTO") cosa que no es posible directamente en ensamblador.

La funcion SayLong simplemente muestra un MessageBox con el numero que hayamos especificado como parametro.

Ustedes diran que carajo hacemos con este codigo, bueno aca esta la respuesta, ensamblamos y linkeamos con MASM:

ml /c /Cp /coff asm_called.asm
lib asm_called.obj

Con eso conseguimos el archivo asm_called.obj que es el codigo objeto y el archivo asm_called.lib que es el codigo ejecutable que vamos a linkear desde C++.

Ahora el codigo de C++ que llama a la funcion de ensamblador:

Código
  1. #include <windows.h>
  2. extern "C" void __stdcall SayLong(DWORD number);
  3.  
  4. void main()
  5. {
  6.  SayLong(50);
  7. }



Muy simple este codigo, muy simple. Declara la funcion externa SayLong con el paso de paremetros de stdcall (la misma que usamos en ensamblador). Y la llama desde un main con un parametro de 50.

Compilamos y linkeamos con VC++:

cl -c calling_asm.cpp
link calling_asm.obj asm_called.lib kernel32.lib user32.lib

Ahora obtenemos un archivo objeto calling_asm.obj y un archivo ejecutable calling_asm.exe.

Ejecuten el archivo calling_asm.exe y veran que aparece un MessageBox con el numero 50, la rutina SayLong (programa en ensamblador) fue llamada desde C++.

Espero que les haya gustado el tutorial y hayan aprendido algo nuevo.
3440  Programación / ASM / Re: Problema para pasar un codigo de MASM a FASM en: 28 Octubre 2009, 07:55 am
Asi te decia:
Código
  1. PostMessageX:
  2. push ebp ; Trampolin
  3. mov ebp, esp
  4. jmp Salto; El resultado va hacia salto donde tenemos ya guardada nuestro handle del "PostMessage"

Lo unico es que vas a tener que usar push's + call's en lugar de stdcall.
Páginas: 1 ... 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 [344] 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 ... 381
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines