Cómo desmontar y conocer los parámetros de función en dll
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 p>
.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
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 p >
}
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.