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

 

 


Tema destacado:


  Mostrar Mensajes
Páginas: 1 ... 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 [107] 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
1061  Programación / Programación C/C++ / Re: algoritmos y diagramas de flujo en: 17 Agosto 2010, 20:18 pm
Aqui encontraras un monton de enlaces, lusgo solo tendras que decidir cual te sirve y cual no.

Y ¿para que quieres un libro con diagramas de flujo? Si te hace falta, te los haces tu.

¡Saludos!
1062  Programación / Programación C/C++ / Re: numeros al azar en: 13 Agosto 2010, 13:40 pm
http://c.conclase.net/librerias/index.php?ansifun=freopen#inicio
1063  Programación / Ingeniería Inversa / Re: Diferencias entre OllyDBG 1.1 y 2.0 en: 13 Agosto 2010, 01:29 am
¡Buenas!

El unico "problema" que he encontrado hasta ahora en Windows 7 al utilizar Olly ha sido que en lugar de ir directamente al entry point, para primero en ntdll. Hay dos formas de ir al entry point:

1. En el menu debug seleccionar execute till return (equivalentemente CTRL + F9)

2. En la parte superior de la pila estara la direccion del entry point. Hay que hacer click derecho sobre esta posicion de la pila y en el menu emergente seleccionar follow in Dissasembler

No se si hay alguna otra manera de hacerlo, todavia no conozco tanto el Olly.

A partir de este punto, los pasos que hay que seguir son los mismos que en el tutorial.

Solo un apunte. La CommandBar no reconoce bien el comando ?.

¡Saludos!

PD: La segunda opcion es mentira  :silbar:, simplemente te posicionarias en el entry point, pero eip seguiria en ntdll. Pero, si ejecutais el programa, nada mas llegar al entry point para.

¡Saludos!
1064  Programación / Programación C/C++ / Re: Duda con mi codigo (Manejo de archivos) en: 13 Agosto 2010, 00:42 am
¡Buenas!

Una cosilla mas, esta parte te sobra:
Código
  1. else
  2. {
  3.    continue;
  4. }
  5.  

continue se utiliza en las estructuras de repeticion para ignorar todo el codigo que le sigue y forzar la siguiente iteracion, pero en este caso no tienes nada de codigo despues de continue, asi que realmente, el else entero esta de mas. No quiero decir que lo que has hecho sea incorrecto. No supone ninguna incorreccion, simplemente es codigo de mas que has metido y que realmente no tiene ningun efecto.

¡Saludos!
1065  Foros Generales / Noticias / Re: 10 históricos y procrastinantes videojuegos incluidos en sistemas operativos en: 13 Agosto 2010, 00:34 am
Jajajajaja!

Un gran juego. Creo que se llamaba Historic o prehistoric o como quiera que se escriba historico o prehistorico en ingles..., me lo voy a bajar para el DOSBox.  ;-)

¡Gracias por recordarmelo!
1066  Foros Generales / Noticias / Re: 10 históricos y procrastinantes videojuegos incluidos en sistemas operativos en: 12 Agosto 2010, 22:31 pm
Buf, mi primer contacto con un ordenador vino de la mano de Donkey, Tetris, Stargate, Xonix 1.0, Digger, Frogger...

Snif... :'( (me pongo nostalgico...)

¡Saludos!
1067  Programación / ASM / ¿Podriais darme algun consejo sobre estilo antes de avanzar mas? en: 12 Agosto 2010, 21:47 pm
¡Buenas!

Hace pocos dias empece a leer Assembly_Language_For_Intel_based_computers (solo voy por el capitulo 7). Ya tenia una pequeña base sobre las instrucciones en ensamblador gracias a que he empezado tambien a seguir el curso de ingenieria inversa de Ricardo Narvaja, asi que he ido haciendo algun ejercicio basandome en lo que habia estudiado del libro y en lo que habia visto a traves del debuger. No he tenido ningun problema ni para escribir el codigo ni para depurar los programas, pero antes de seguir avanzando, me gustaria que si podeis, los que mas tiempo llevais utilizando ensamblador, me dieseis algun consejo sobre estilo o alguna otra cosa que se pueda mejorar para obtener claridad. Se por C que es muy importante mantener el codigo ordenado y claro, pero no se si lo que estoy aplicando hasta ahora sirve solo a pequeña escala y luego al meterme en camisas de once varas acabare liado...

Bueno, aqui dejo el codigo y ¡que empieze el chaparron!

Un ultimo aviso, no he llegado a las interrupciones ni conozco la parte del API de Windows que controla la consola, asi que la entrada/salida la hago con funciones de C.

Ah, y el ensamblador que utilizo es MASM32, no se si hay diferencias con respecto al resto... solo llevo 5 dias con esto...

Código
  1. ; PROGRAMA: SWITCH
  2. ; Ejecuta un menu, recoge la opcion y despliega un mensaje segun la opcion
  3.  
  4. .386                       ; compatible con 80386 y  posteriores
  5. .model flat, stdcall       ; modo 32 bits protegido y convencion de llamadas
  6. .stack 4096                ; Tamaño de la pila...
  7.  
  8. ;=============================================================
  9.  
  10. ;stdio.h
  11. include c:\masm32\include\msvcrt.inc
  12. includelib c:\masm32\lib\msvcrt.lib
  13.  
  14. ;ExitProcess
  15. include c:\masm32\include\kernel32.inc
  16. includelib c:\masm32\lib\kernel32.lib
  17.  
  18. ;=============================================================
  19.  
  20. .data
  21.  
  22. opciones db "Escoge una opcion:",13,10,"1.",13,10,"2.",13,10,"0.Salir",13,10,">",0
  23. formatoi db "%ld",0
  24. cad1     db 13,10,"Opcion 1 escogida.",13,10,13,10,0
  25. cad2     db 13,10,"Opcion 2 escogida.",13,10,13,10,0
  26. cadsalir db 13,10,"Has escogido salir.",13,10,13,10,0
  27. endl     db 13,10,0
  28.  
  29. .data?
  30.  
  31. ;    Las dos componentes son el valor del caso y la direccion
  32. ; y de la funcion/codigo que ejecuta el codigo asociado
  33. SwitchTonto dd 4 dup(?)  ; dos elementos tipo switch case: [caso,funcion]
  34. opcion      dd ?
  35.  
  36. .code
  37.  
  38. main PROC
  39.  
  40. mov ebx , OFFSET SwitchTonto    ; cargamos la direccion de los pares valor-funcion
  41.  
  42. xor eax , eax                   ; dejamos eax a cero
  43.  
  44. mov eax , 1                     ; pasamos a eax el primer caso del switch
  45. mov [ebx] , eax                 ; lo guardamos en el primer par
  46. mov [ebx + 4] , op1             ; y copiamos la direccion de la funcion que maneja el caso
  47.  
  48. mov eax , 2                     ; lo mismo con el segundo caso del switch
  49. mov [ebx + 8] , eax
  50. mov [ebx + 12] , op2
  51.  
  52. ;do{
  53. MENU_INI:
  54.  
  55. sub esp , 4                    ;hacemos hueco en la pila para el valor de retorno
  56.  
  57. call menu                      ; desplegamos la informacion y en la pila vuelve la opcion
  58.  
  59. pop eax                        ; recogemos la opcion elegida
  60. mov esi , 2                    ; esi sera el subindice para recorrer el array del switch
  61.  
  62. SWITCH_INI:                    ; principio de la eleccion
  63.  
  64. dec esi                    ; pasamos al siguiente indice
  65. cmp esi , 0FFFFFFFFh       ; si es -1
  66. jz SWITCH_FIN              ; hemos terminado de leer el array y salimos del switch
  67.  
  68. cmp eax , [ebx + 8 * esi]  ; comparamos el valor devuelto por menu con el del caso
  69.  
  70. jnz SWITCH_INI             ; si no son iguales, vamos a comprobar el siguiente caso
  71.  
  72. ;en este punto eax ya no nos sirve, ya que hemos encontrado la opcion elegida
  73. mov eax , 8                ; calculamos el desplazamiento dentro del par valor-funcion
  74. mul esi                    ; en el que se encuentra el offset de la direccion de la funcion:
  75. add eax , 4                ; 8 * indice + 4
  76.  
  77. call DWORD PTR [ebx + eax] ; y llamamos a la funcion que maneja el caso
  78.  
  79. SWITCH_FIN:
  80.  
  81. test eax , eax                 ; si la opcion elegida no es cero (salir)
  82. jnz MENU_INI                   ; volvemos a llamar al menu
  83.  
  84. MENU_FIN:
  85. ;}while(opcion != 0);
  86.  
  87. call salir                         ; desplegamos el mensaje de salida
  88.  
  89. call crt_getchar                   ; esperamos a pulsar intro
  90.  
  91. push 0                             ; y terminamos el programa
  92. call ExitProcess
  93.  
  94. ret
  95.  
  96. main ENDP
  97.  
  98. ; long menu(void)
  99. menu PROC
  100.  
  101. pushad                             ; guardamos los registros para devolverlos como estaban
  102.  
  103. ; do{}while(opcion<0 || opcion>2)
  104. PEDIR_OPCION_INI:
  105.  
  106. push OFFSET endl               ; imprimimos una nueva linea para separar el menu de lo anterior
  107. call crt_printf
  108. add esp , 4                    ; "sacamos" el paramtro de printf de la pila
  109.  
  110. push OFFSET opciones           ; mostramos las opciones
  111. call crt_printf
  112. add esp , 4                    ; y dejamos la pila apuntando a los registros pusheados
  113.  
  114. push OFFSET opcion             ; ponemos la direccion de la variable opcion
  115. push OFFSET formatoi           ; la cadena de formato para scanf
  116. call crt_scanf                 ; llamamos a scanf
  117. add esp , 8                    ; y desplazamos la pila tantas posiciones como bytes tenian los parametros
  118.  
  119. call limpiarbuf                ; sacamos todos los datos que quedan en la entrada
  120.  
  121. mov eax , opcion               ; pasamos a eax el valor introducido
  122.  
  123. cmp eax , 0                    ; si el valor es menor que cero
  124. jl PEDIR_OPCION_INI
  125. cmp eax , 2                    ; o mayor que 2
  126. jg PEDIR_OPCION_INI            ; volvemos a pedir el dato
  127.  
  128. PEDIR_OPCION_FIN:
  129.  
  130. mov edi , esp                      ; copiamos en edi el puntero de pila
  131. mov [edi + 36] , eax               ; y guardamos la opcion elegida despues de los 8 registros y la direccion de retorno
  132.  
  133. popad                              ; dejamos los registros como estaban al entrar en la funcion
  134.  
  135. ret                                ; y regresamos
  136.  
  137. menu ENDP
  138.  
  139. limpiarbuf PROC
  140.  
  141. pushad                             ; guardamos los registros generales
  142.  
  143. ;while(getchar() != '\n')
  144.  
  145. LIMPIEZA_INI:
  146.  
  147. call crt_getchar
  148. cmp eax , 10
  149. jnz LIMPIEZA_INI
  150.  
  151. LIMPIEZA_FIN:
  152.  
  153. popad                              ; y dejamos los registros como antes de la llamada
  154.  
  155. ret                                ; volvemos
  156.  
  157. limpiarbuf ENDP
  158.  
  159. ; imprime el mensaje de que se ha elegido la opcion 1
  160. op1 PROC
  161.  
  162. pushad
  163.  
  164. push OFFSET cad1
  165. call crt_printf
  166. add esp , 4
  167.  
  168. popad
  169.  
  170. ret
  171.  
  172. op1 ENDP
  173.  
  174. ; imprime el mensaje de que se ha elegido la opcion 2
  175. op2 PROC
  176.  
  177. pushad
  178.  
  179. push OFFSET cad2
  180. call crt_printf
  181. add esp , 4
  182.  
  183. popad
  184.  
  185. ret
  186.  
  187. op2 ENDP
  188.  
  189. ; imprime el mensaje de que se ha elegido salir
  190. salir PROC
  191.  
  192. pushad
  193.  
  194. push OFFSET cadsalir
  195. call crt_printf
  196. add esp , 4
  197.  
  198. popad
  199.  
  200. ret
  201.  
  202. salir ENDP
  203.  
  204. END main
  205.  

¡Saludos!
1068  Programación / Programación C/C++ / Re: [C]Terna pitagorica(Fuerza bruta) en: 12 Agosto 2010, 20:46 pm
Tambien puedes ahorrarte el trabajo de llamar a funciones y comprobar directamente lo que dice el teorema:

hipotenusa * hipotenusa == cateto1 * cateto1 + cateto2 * cateto2:

Código
  1. for(hipotenusa == MAX_HIPOTENUSA ; hipotenusa > 1 ; hipotenusa--)
  2. {
  3.    for(cateto1 == hipotenusa - 1 ; cateto1 > 0 ; cateto1--)
  4.    {
  5.        for(cateto2 == hipotenusa - 1 ; cateto2 > 0 ; cateto2--)
  6.        {
  7.            if(hipotenusa * hipotenusa == cateto1 * cateto1 + cateto2 * cateto2)
  8.            {
  9.                /* ahora haces lo que quieras con estos datos ... */
  10.            }
  11.        }
  12.    }
  13. }
  14.  

¡Saludos!
1069  Foros Generales / Foro Libre / Re: En un mundo de sueños, cualquier cosa es posible (imagen) en: 2 Agosto 2010, 22:26 pm
Cierto, ahi esta la diferencia entre analisis y algebra. Algebraicamente no se puede dividir por cero, pero en analisis realmente no estas haciendo una division por cero, sino que estas viendo como varia la proporcion entre numerador y denominador.  Ambas respuestas tienen su sentido segun de que se hable, si de algebra o de analisis.

Por otra parte, si cualquier cosa es posible, es posible que todo sea posible, por lo que es posible que todo sea imposible, y tenemos una contradiccion, es decir, no cualquier cosa es posible y por lo tanto tiene que existir al menos una cosa que sea imposible.

¡Saludos!
1070  Programación / Programación C/C++ / Re: Rookie perdido en: 2 Agosto 2010, 21:28 pm
¡Buenas!

Justo despues del while has puesto punto coma, por lo que el cuerpo del while queda vacio y acto seguido con el printf lo unico que imprimes es el primer resultado, ya que las cuentas quedan fuera del while.

Has cometido uno de los errores mas tipico en principiantes y profesionales, y no sera la ultima vez que lo cometas. Sobre todo intenta no cometer los siguientes errores (aunque como te he dicho, siempre se te escapara alguno)
Código
  1. /* las siguientes estructuras de control tienen el cuerpo vacio, ya que hay un punto coma donde no deberia haberlo */
  2. if();
  3. {
  4. }
  5.  
  6. if()
  7. {
  8. }
  9. else;
  10.  
  11. for(;;);
  12. {
  13. }
  14.  
  15. /* este es el que hay en tu codigo */
  16. while();
  17. {
  18. }
  19.  

¡Saludos!
Páginas: 1 ... 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 [107] 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines