Red de conocimiento informático - Material del sitio web - Cómo desmontar y conocer los parámetros de función en dll

Cómo desmontar y conocer los parámetros de función en dll

Los parámetros de la función de la interfaz se pueden conocer mediante el desmontaje. Se recomienda utilizar W32DSM para el análisis, o puede utilizar VC directamente para el análisis, lo cual es más problemático.

Ahora use W32DSM para especificar:

1. Primero abra la DLL que necesita ser analizada, luego busque la función que necesita ser analizada a través de la función de menú: "Exportar", y haga doble clic en él.

Puede localizar funciones directamente.

2. Mire la entrada de la función. Generalmente, el siguiente código es la entrada de la función.

push ebp

mov ebp, esp

3. Luego busque la salida de la función. Generalmente, la declaración de salida de la función es la siguiente. .

ret xxxx; //donde xxxx es el número de bytes de todas las diferencias en la función, que es múltiplo de 4. Divide xxxx entre 4

El resultado es el número de parámetros.

Ubicación de almacenamiento de parámetros:

ebp 08 //El primer parámetro

ebp 0C //El segundo parámetro

ebp 10 // El tercer parámetro

ebp 14 //El cuarto parámetro

ebp 18 //El quinto parámetro

ebp 1C //El sexto parámetro Parámetros

. . . .

------------------------------------------- -----

Otra llamada frecuente:

sub esp, xxxx //parte inicial

//contenido de la función

.

//El contenido de la función

agregar esp, xxxx

ret //finalizar parte

El resultado de xxxx/4 También es un número de parámetro.

------------------------------------------- ----- ------

Existe otro método de llamada:

Debido a que la función es relativamente simple y no existe un proceso de apilamiento de parámetros,

donde

esp 04 es el primer parámetro

esp 08 es el segundo parámetro

.

esp xx es el xx/4º parámetro

El número máximo de xx que mencionaste dividido por 4 es el número de parámetros pasados ​​a la función.

------------------------------------------- ----- ---

Dependiendo de dónde se encuentre ahora, debería poder ver claramente la cantidad de argumentos que se pasan. En cuanto a lo que se está aprobando, es necesario un mayor análisis.

La forma más conveniente es descubrir primero el software que llama a la función y luego utilizar la tecnología de depuración para averiguar dónde se llama la función. Los parámetros generalmente se pasan mediante la instrucción PUSH

. En este punto, puede ver qué se insertó exactamente en la pila. En términos generales, si el parámetro es un número entero, puede saberlo de un vistazo; si es una cadena, es relativamente simple, simplemente vaya a la parte superior de la dirección para verlo;

Si estás familiarizado con la estructura, no hay forma conveniente, simplemente lee el montaje. Para el análisis anterior, solo estoy dando algunas ideas.

Espero que pueda ser de alguna utilidad para todos.

Ayer os di una breve introducción sobre cómo saber el número de parámetros de una interfaz, así como una interfaz sencilla. Debido a la optimización del compilador,

algunos parámetros pueden no ser tan simples como los que presenté anteriormente, así que hoy permítanme analizar nuevamente la interfaz llamada por la DLL.

Si hay una llamada API en una función

de la DLL y uno o más parámetros de la llamada API son parámetros de la función DLL.

Entonces es fácil conocer los parámetros de la función DLL.

Ejemplo: El siguiente código ensamblador es de W32DSM.

Fn() exportado: myTestFunction - Ord: 0001h

: 10001010 8B442410 mov eax, dword ptr [esp 10]

: 10001014 56 push esi

.10001015 8B74240C mov esi, dword ptr [esp 0C]

: 10001019 0FAF742410 imul esi, dword ptr [esp 10]

: 1000101E 85C0 test eax, eax

:.10001020 7414 je 10001036

:10001022 8B442418 mov eax, dword ptr [esp 18]

:10001026 8B4C2408 mov ecx, dword ptr [esp 08 ] ]

:.1000102A 6A63 empujar 00000000

:1000102C 50 empujar eax

:1000102D 51 empujar ecx

:1000102E 6A00 empujar 00000000

* Consulte T USER32 .MessageBoxA, Ord: 01BEh

|

: 10001030 FF15B0400010 Llamar a dword ptr [100040B0]

* Dirección:

|: 10001020(C)

|

: 10001036 8BC6 mov eax, esi

: 10001038 5E pop esi

:10001039 C3 ret

long myTestFunction(LPCTSTR lpText, long p2, long p3, long p4, LPCTSTR lpCaption);

En cuanto al tercer parámetro ESP 10 y luego busque la ubicación donde se usa este parámetro, imul esi, dword ptr [esp 10] tiene dichas instrucciones.

Debido a que imul es una instrucción de multiplicación, podemos estar seguros de que ESP 10 usa el bit largo y no estará mal. De manera similar, también podemos saber que el segundo parámetro esp 0C

Es seguro utilizar el bit largo. No está mal,

mov eax, dword ptr [esp 10]

test eax, eax

je 10001036<. /p>

Ver esto ¿Cuál es el propósito de los parámetros?

Traducido al lenguaje C, es:

if(p3)

{

/Ejecuta el siguiente comando je 10001036

}

return ;

Hasta ahora puedes tratar el tercer parámetro como un puntero, ¿verdad? Es decir, si p3 está vacío regresará directamente, si no, hará otra cosa.

Bien, hasta ahora, podemos enumerar la interfaz correcta:

long myTestFunction(LPCTSTR lpText, long n1, char *pIsNull, long n2, LPCTSTR lpCaption);

¡Jaja, ahora funciona! !

long CryptExtOpenCER(long p1, long p2, LPCSTR p3, long p4);

El tercer parámetro puede ser el nombre del archivo,

o PCERT_BLOB

Determina el nombre del archivo en CERT_QUERY_OBJECT_ FILE o CERT_QUERY_OBJECT_BLOB.

------------------------------------------- ----- --------------------

Hoy pensé en una buena manera de resolver el problema de los parámetros, pero es un poco difícil.

1. De acuerdo con los diversos métodos introducidos anteriormente, puede conocer rápidamente la cantidad de parámetros. Suponga que el nombre de la función

es MyTestFunc y la cantidad de parámetros es 3.

Por lo tanto se puede definir de la siguiente manera:

long MyTestFunc(long p1, long p2, long p3);

2.

3. Al llamar a otro programa, activar HOOK y depurar en HOOK, puede conocer claramente

los parámetros de la llamada, los parámetros de la llamada y el número de parámetros. .

El parámetro de la llamada, el valor del parámetro.

-------------

Aún no he implementado este método, pero creo que definitivamente se puede lograr. Los parámetros así obtenidos deberían ser bastante precisos.