2010-02-04 4 views
2

Я пытаюсь обнаружить ли мой процесс запущен в отладчике или нет, и, в то время как в Windows, есть много решений и в Linux я использую:Обнаружение отладчика на Mac OS X

ptrace(PTRACE_ME,0,0,0) 

и проверить его возвращаемое значение, мне не удалось выполнить ту же самую базовую проверку на Mac OS X. Я пытался использовать вызов

ptrace(PT_TRACE_ME,0,0,0) 

но это всегда возвращает 0, даже при запуске под управлением GDB.

Если я меняю запрос на PT_DENY_ATTACH, он правильно останавливает отладку, но этого я не хочу достичь. Есть идеи?

+1

Вы видели это? http://unixjunkie.blogspot.com/2006/01/darwin-ptrace-and-registers.html – slf

+0

Да, я наткнулся на это уже, но это было не то, что я искал, к сожалению. Спасибо в любом случае – Alienpenguin

ответ

5

Вы можете просто вызвать функцию AmIBeingDebugged().

См Apple Technical Q&A QA1361

+0

Спасибо, этот маленький код работал просто отлично, я все еще не могу понять, почему ptrace потерпела неудачу, хотя. – Alienpenguin

+0

@Alienpenguin 'ptrace' [сильно искалечен] (http://uninformed.org/index.cgi?v=4&a=3&p=14) на OS X, вы не можете использовать его для отладки. –

+0

@IgorSkochinsky: эта статья была написана в 2006 году - как вы думаете, ситуация может улучшиться с тех пор? –

4
#include <mach/task.h> 
#include <mach/mach_init.h> 
#include <stdbool.h> 

static bool amIAnInferior(void) 
{ 
    mach_msg_type_number_t count = 0; 
    exception_mask_t masks[EXC_TYPES_COUNT]; 
    mach_port_t ports[EXC_TYPES_COUNT]; 
    exception_behavior_t behaviors[EXC_TYPES_COUNT]; 
    thread_state_flavor_t flavors[EXC_TYPES_COUNT]; 

    exception_mask_t mask = EXC_MASK_ALL & ~(EXC_MASK_RESOURCE | EXC_MASK_GUARD); 
    kern_return_t result = task_get_exception_ports(mach_task_self(), mask, masks, &count, ports, behaviors, flavors); 
    if (result == KERN_SUCCESS) 
    { 
     for (mach_msg_type_number_t portIndex = 0; portIndex < count; portIndex++) 
     { 
      if (MACH_PORT_VALID(ports[portIndex])) 
      { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Это выглядит и видит, если есть активный обработчик исключений в нашем процессе (для EXC_BREAKPOINT, EXC_BAD_ACCESS и т.д.). Ptrace не требуется для этого в отладчике, поэтому полагаться только на установленный флаг ptrace не совсем идеален.

Этот подход упоминается в http://reverse.put.as/wp-content/uploads/2012/07/Secuinside-2012-Presentation.pdf

Мои blog post описывает это более подробно.

 Смежные вопросы

  • Нет связанных вопросов^_^