Foro de elhacker.net

Programación => Ingeniería Inversa => Mensaje iniciado por: .:UND3R:. en 8 Julio 2011, 08:42 am



Título: Como dejar NULL una opción de un Call?
Publicado por: .:UND3R:. en 8 Julio 2011, 08:42 am
Bueno creo que se entiende, es decir si quiero ejecutar un call que es más o menos así

Citar
PUSH 1000
PUSH 40
PUSH 3400
CALL EAX

Osea que cuando llegué a CALL EAX (EAX=Una API) en la pila aparecerán los parámetros más o menos así

Citar
ESP CALL to API
ESP+4 PUSH 3400
ESP+8 PUSH 40
ESP+C PUSH 1000

Pero en la descripción de esta apí ficticia el valor 1000 es opcional osea que se puede dejar NULL, mi pregunta es que coloco para no alterar los otros parámetros del call

Saludos


Título: Re: Como dejar NULL una opción de un Call?
Publicado por: MCKSys Argentina en 8 Julio 2011, 17:46 pm
No entiendo la pregunta...

Estas hablando de definir una funcion con parametros opcionales?

No te entiendo...  :P


Título: Re: Como dejar NULL una opción de un Call?
Publicado por: .:UND3R:. en 8 Julio 2011, 19:14 pm
Con el ejemplo anterior cuando se llama a esa API esta tiene 3 parámetros verdad?

pero mi duda es como hago para dejar el primer parámetro (si se ve desde el desamblador el PUSH 1000) o último (si se ve desde la pila) vacio?

osea dejar un parámetro vacio ya que si este es opcional no sería necesario, pero si no lo pongo, al hacer los push estos se desfazarían

un ejemplo más para que se entienda

Citar
API "virtualxxx"

parámetros:

qw=1
as=2
ad=3

ahora si llevo este ejemplo al Ollydbg quedaría más o menos así

Citar
PUSH 3
PUSH 2
PUSH 1
CALL EAX (virtualxxx)

esto al llegar a la pila queda así:

_______________
Citar
|Call virtualxx to .....
|qw=1
|as=2
|ad=3

este es el ejemplo pero pregunto si ahora yo no necesito (opcional) poner el parámetro qw

por lo que en vez de quedar así

parámetros:

qw=Nada
as=2
ad=3

este si lo ignoro distorsiona los parámetros de la api:

Citar
PUSH 3
PUSH 2
CALL EAX (virtualxxx)

en la pila quedaría así:
____________________
Citar
|Call virtualxx to .....
|qw=2
|as=3

Por eso mi pregunta es que poner en el desamblador para que un parámetro de call se considere NULL ya que si no pongo nada este distorsionaría todos los parámetros como mostré en los ejemplos anteriores

Si no se entendió dímelo de nuevo

Saludos


Título: Re: Como dejar NULL una opción de un Call?
Publicado por: _Enko en 8 Julio 2011, 19:40 pm
la funcion es cdecl o stdcall?

si es stdcall, solo acepta un numero de paramentros constantes, por ende, si un paramentro es opcional se puede dejar nulo.
Para el caso: push 0

si es cdecl, puede aceptar numero de paramentros variables
PUEDES HACER el push 0.
o bien,
 si el programa pasa 3 paramentros, y tu quieres pasar dos, y se da el caso,  puedes:
a) modificar uno de los paramentros  que indicarian la cantidad de variables que se le pasar'a a la funcion. Por ejemplo si es wsprintf, y el parametro de formato es "%s%i" tendrias que sacar o %i o %s segun lo que quieras.
b)modificar el push que no quieras y reemplazarlo por nop.
b2)si reemplazas por nop, al final del llmado a la funcion deberas restar 4 al add esp, X


Título: Re: Como dejar NULL una opción de un Call?
Publicado por: .:UND3R:. en 8 Julio 2011, 19:55 pm
Gracias enko_

Creo que la solución es PUSH 0 en resumen si alguien lo puede corroborar para desamblador ollydbg