Bueno creo que se entiende, es decir si quiero ejecutar un call que es más o menos así
CitarPUSH 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í
CitarESP 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
No entiendo la pregunta...
Estas hablando de definir una funcion con parametros opcionales?
No te entiendo... :P
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
CitarAPI "virtualxxx"
parámetros:
qw=1
as=2
ad=3
ahora si llevo este ejemplo al Ollydbg quedaría más o menos así
CitarPUSH 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:
CitarPUSH 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
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
Gracias enko_
Creo que la solución es PUSH 0 en resumen si alguien lo puede corroborar para desamblador ollydbg