Funcionamiento Basico Del CALL y Del RET En Ollydbg

Hola amigos soy Flamer de nuevo y por pedido de mi amigo Necroxia el cual me pidió hace ya mucho tiempo el funcionamiento de los CALL y los RET pues aquí se lo traigo.

Bueno empecemos primeramente que es un CALL:

La instrucción CALL lo que hace es ir a ejecutar una subrutina o parte del programa cuya dirección esta dada por el valor del operando y una vez que la función termine, el código continúa en la línea siguiente de CALL.

Ejemplo:
Supongamos que tenemos un call así: CALL 00402045

Significa que la próxima línea a ejecutarse será 00402045 y cuando se termine de ejecutar la rutina que esta allí dentro, volverá a la instrucción siguiente a continuación del CALL que la llamo.


Ahora se preguntaran como regresara o como saldrá de la subrutina, para eso se usa la instrucción RET lo veras al final de la subrutina, el cual toma la dirección guardada en la pila, la cual fue almacenada cuando se invoco el CALL.

Por si no me entendieron veamos un ejemplo, para eso usare mi primer crack-me aquí lo podrán descargar: http://elblogdeflamer.blogspot.mx/p/mis-cackmes.html

Ahora lo abriremos con el OllyDbg y nos iremos hasta la dirección 00402AC5 muestra lo siguiente:



Como ven unas dos lineas abajo se encuentra un CALL donde hace una llamada ala api  _vbaVarDup de Visual Basic.

Ahora para poder entrar y ver que es lo que hace el CALL usaremos la tecla F7 y si no queremos entrar tracearemos con F8.

Bueno ejecutaremos el crack-me con F9 y daremos clic en Ayuda----Acerca Del Crack-me

y se detendrá donde puse el Break Point

Antes de continuar observen que el CALL se encuentra en la dirección 00402AD3 y la siguiente linea es 00402AD9 así que cuando salgamos del CALL retornaremos en esa dirección

¿y como sabrá el programa? por que esa dirección se almacenara en la pila cuando entremos al CALL

Ahora entraremos al CALL con F7, el cual nos llevara hasta aquí y observen la pila:




Ya que entramos a la subrutina nos iremos traceando con puro F8 hasta llegar a la instrucción RETN y como observan en la pila se encuentra la dirección 00402AD9



Y si presionamos F8 saldremos del CALL y nos posicionara en la dirección 00402AD9, eso es todo el funcionamiento básico del CALL y el RETN espero lo hallan  entendido.


Complemento

Ahora explicare un dato a la hora de tracear los CALL, esto funciona sin necesidad de ejecutar el programa o ejecutándolo

Supongamos que estamos ejecutando el crackme y damos clic en Ayuda----Acerca Del Crack-me

se detendrá en el Break Point que pusimos y ahora queremos ver que es lo que hay dentro del CALL de la linea 00402AD3, para eso damos clic derecho y clic en FOLLOW como se muestra en la imagen


Esto nos llevara justo dentro del CALL, ahora sino quieren dar clic derecho y clic en FOLLOW, solo presionen ENTER y sucede lo mismo

y ahora se preguntaran para regresarnos, pues fácil solo dan clic derecho----Go To----Previous location y nos llevara de regreso


Ahora sino quieren hacer todo eso solo presionen la tecla -  del teclado numérico y sucederá lo mismo.

Consejo:

No revisen cada CALL que encuentren en los programas que revisen, ya que hay CALL anidados y estos pueden tener 5 o 10 CALL mas adentro, mejor solo observen que valor les regresa



Bueno amigos eso es todo por hoy y un saludo a mi amigo Necroxia que me pidió este tutorial hace ya mucho tiempo que por desidia no lo había hecho

Saludos Flamer  y un saludo a todos los del foro el hacker.net