2012-01-20 8 views
8

¿Puede detectar si un depurador está conectado a su proceso nativo de Windows mediante un temporizador de alta precisión para calcular cuánto tiempo se tarda en dividir un entero por cero?Puede detectar un depurador conectado a su proceso usando Div by Zero

La razón es que si no hay depurador asociado, recibe un error de disco, el cual es manejado por el hardware y es muy rápido. Si se adjunta un depurador, en su lugar se obtiene un error suave, que se filtra hasta el sistema operativo y, finalmente, el depurador. Esto es relativamente lento

+1

¿Lo intentó? –

+2

Lo probé. Creo que hay una correlación estadística, pero no se puede usar de manera confiable porque es difícil elegir un límite de corte de cuánto tiempo debería llevar un hardware diferente. –

+3

¿Y qué pasa si una interrupción llega en ese momento? ¿Qué tal un cambio de contexto? En el mejor de los casos obtendrás un resultado probabilístico. –

Respuesta

1

la mayoría de los depuradores utilizados por ingenieros reversa vienen con métodos para afectar (eliminar) el 99% de las marcas dejadas por los depuradores, la mayoría de estos depuradores proporcionan filtrado de excepciones, lo que significa que la diferencia de velocidad sería indetectable.

es más productivo para evitar la conexión del depurador en primer lugar, pero a la larga nunca saldrá adelante a menos que haga inviable la inversión requerida.

4

Dado que no hay absolutamente nada que pueda hacer para evitar que una persona determinada de la ingeniería inversa del código, hay un enfoque inteligente a encontrar será significativamente mejor que llamar IsDebuggerPresent()

+0

Para ser más específicos, la persona ingeniería inversa a su código simplemente podría proporcionar un temporizador virtualizada que esconde el tiempo pasado en el depurador ... –

+0

... o simplemente elimine lo que sea que planee hacer al detectar la división lenta por 0 ... o simplemente elimine la división por cero en sí ... o simplemente lea el código desensamblado ... o no pierda su tiempo en la aplicación que realmente dudo que valga la ingeniería inversa. –

+2

Sí, no está del todo claro cuál es el problema al usar el enfoque obvio aquí y llamar a 'IsDebuggerPresent'. Alguien comentó sobre eso, pero el asker simplemente se enojó y lo llamó "nadie". –

3

No. Un atacante suficientemente determinado que simplemente alojar su proceso de en una máquina virtual y romper de esa manera.

Además, no necesita adjuntar un depurador para atacar un programa: tomar un minivolcado permitirá que un adversario inspeccione el estado de la memoria fuera de línea, o usando process explorer puede inspeccionar los mangos abiertos para determinar qué archivos son vulnerables.

Si va a utilizar una excepción para determinar si se adjuntó un depurador ingenuo, usaría personalmente INT_MIN/-1 para desencadenar una excepción de desbordamiento de enteros. La mayoría no sabe sobre eso.

+1

Cabe señalar que no es trivial (en C) realizar una división entre cero o 'INT_MIN/-1'. Como es UB, siempre que el compilador pueda detectar en tiempo de compilación que sucederá, es libre de optimizarlo o hacer lo que quiera ... A menudo necesitas saltar algunos aros para ocultar el comportamiento del compilador si en realidad quiere que la instrucción sea ejecutada por la CPU ... –

+0

En x86, se generará la misma excepción (#DE) para ambas divisiones entre 0 e INT_MIN/-1. –

+0

@R ..: almacena el numerador o el denominador en una variable volátil y la mayoría de los compiladores generan código para la división. –

Cuestiones relacionadas