2012-03-22 8 views
6

Estoy tratando de solucionar el arranque lento de un archivo binario de terceros (sin fuente). Es una aplicación de 32 bits que se ejecuta en Windows 7 de 64 bits.Reventado de la creación de HANDLE en WOW64

He utilizado un depurador para entrar en la aplicación mientras está colgado con un 0% de uso de la CPU durante el inicio, y parece estar esperando ReadFile para regreso. El primer argumento para ReadFile es el valor del controlador, 000000f0. la orden de windbg !handle me dice:

Handle f0 
    Type   File 
    Attributes  0 
    GrantedAccess 0x120189: 
     ReadControl,Synch 
     Read/List,ReadEA,ReadAttr,WriteAttr 
    HandleCount  2 
    PointerCount 4 
    No Object Specific Information available 

Quiero saber qué dispositivo esto corresponde a. Pero Sysinternals Process Explorer no incluye este identificador en su lista de identificadores de proceso.

He utilizado windbg para rastrear todas las llamadas a ntdll!NtCreateFile e imprimí la ruta y el identificador devuelto: este identificador no se encuentra entre ellos. Los puntos de interrupción en kernel32!CreateNamedPipeW, kernel32!CallNamedPipeW y kernel32!WaitNamedPipeW nunca se disparan (lo cual es extraño porque Process Explorer sí mostró otro identificador con la ruta \Device\NamedPipe\).

Para referencia, aquí es el comando de rastrear NtCreateFile (akak ZwCreateFile) en Windows x64:

bp ntdll!NtCreateFile "!ustr poi(@r8+10) ; r $t0 = @rcx ; gu ; dd @$t0 L1 ; gc" 

Thanks to Skywing for pointing me in the right direction on that.

¿De dónde más puede venir una MANIJA de tipo File? ¿Las otras funciones de creación de HANDLE no se delegan en NtCreateFile para el syscall real (supongo que no)?

+1

¿Ha considerado también el monitor de proceso para supervisar el inicio? Una segunda opción sería livekd para examinar el lado kernel de windbg. – deemok

+0

@deemok: Sí, y por lo que yo sé, procmon ni siquiera ve la llamada 'ReadFile' que está expirando. Creo que podría ejecutar un depurador de núcleo, con una VM no sería tan malo, pero he estado tratando de evitar eso. Toda la información necesaria debe estar disponible en el modo de usuario, en el momento en que se realiza la llamada a cualquier API que cree el MANGO. –

+0

No sé si 'NtCreateFile' es la única rutina de sistema invocada para obtener un' HANDLE'. Pero creo que debería haber una manera de descubrir las propiedades 'HANDLE' sin embargo. Dentro del proceso específico, el 'HANDLE' debe corresponder al' FILE_OBJECT' subyacente (si es un manejador de archivo, por supuesto). Puede usar 'ObReferenceObjectByHandle', verificar que sea un identificador de archivo (verificar' ObjectType') y luego convertir los datos del objeto a 'FILE_OBJECT'.Contiene, entre otras cosas, un puntero a 'DEVICE_OBJECT', que contiene un puntero a' DRIVER_OBJECT'. Entonces, todo teóricamente se puede descubrir – valdo

Respuesta

1

Parece que solo se puede obtener la información del identificador de archivo al realizar una depuración del kernel. Entonces hay 3 opciones.

  1. Hacer una depuración del núcleo de la máquina local, esto no debería ser un problema ya que solo necesita obtener la información del identificador del archivo y que se mantendrá estático. Consulte lo siguiente: http://msdn.microsoft.com/en-us/library/windows/hardware/ff553382(v=vs.85).aspx
  2. Realice una depuración remota del kernel de una máquina VM. "Más seguro" en el sentido de que no puede explotar su máquina.
  3. BSOD su cuadro y mire el vertedero de esa manera. Una vez más, no es algo muy bueno que hacer en su caja, pero he hecho cosas similares en el pasado cuando necesitaba poder hacer un análisis completo en la máquina sin que el estado de la máquina cambiara.
1

Los identificadores se pueden heredar y también se pueden crear mediante DuplicateHandle(). Puede intentar llamar al GetFileInformationByHandleEx en el controlador y consultar FileNameInfo.

+0

¿Cómo puedo hacer esto desde una sesión de depuración? ¿Debo realizar una inyección DLL para ejecutar código dentro del proceso objetivo? –

+0

Es una sesión de depurador de 32 bits que puede inyectar código con el comando 'a'. 'push f0'' push 2' 'push ' 'push 200'' llamada kernel32! GetFileInformationByHandleEx'. 'int 3'. Luego arregle las cosas o simplemente salga de la sesión del depurador. – John

Cuestiones relacionadas