Saltar a contenido

Application implements anti-debug techniques

La aplicación implementa técnicas antidépuración (anti-debug)

Descripción

La depuración y la exploración dinámica de la aplicación es una técnica común durante la ingeniería inversa. Por ejemplo, los ingenieros inversos pueden rastrear la ejecución de la aplicación, espiar datos confidenciales y modificar la memoria para alterar su comportamiento.

Para complicar la tarea de analizar la aplicación dinámicamente, la aplicación debe implementar técnicas antidépuración.

Recomendación

Para implementar técnicas antidépuración, utilice varias de estas técnicas:

ptrace: Utilice la llamada al sistema ptrace con el flag PT_DENY_ATTACH para evitar que los depuradores se adjunten al proceso. La llamada al sistema no forma parte de la API pública de iOS y requiere el uso de la función dlsym para obtener un puntero de función para llamarla.

#import <dlfcn.h>
#import <sys/types.h>
#import <stdio.h>
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
void anti_debug() {
  ptrace_ptr_t ptrace_ptr = (ptrace_ptr_t)dlsym(RTLD_SELF, "ptrace");
  ptrace_ptr(31, 0, 0, 0); // PTRACE_DENY_ATTACH = 31
}

sysctl: La función se puede utilizar para recuperar información sobre el proceso actual, lo que incluye determinar si la aplicación está siendo depurada.

#include <assert.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/sysctl.h>

static bool AmIBeingDebugged(void)
    // Returns true if the current process is being debugged (either
    // running under the debugger or has a debugger attached post facto).
{
    int                 junk;
    int                 mib[4];
    struct kinfo_proc   info;
    size_t              size;

    // Initialize the flags so that, if sysctl fails for some bizarre
    // reason, we get a predictable result.

    info.kp_proc.p_flag = 0;

    // Initialize mib, which tells sysctl the info we want, in this case
    // we're looking for information about a specific process ID.

    mib[0] = CTL_KERN;
    mib[1] = KERN_PROC;
    mib[2] = KERN_PROC_PID;
    mib[3] = getpid();

    // Call sysctl.

    size = sizeof(info);
    junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
    assert(junk == 0);

    // We're being debugged if the P_TRACED flag is set.

    return ( (info.kp_proc.p_flag & P_TRACED) != 0 );
}

getppid: La aplicación iOS puede comprobar el PID principal (parent) para detectar si la aplicación se ha iniciado con un depurador.

Enlaces