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.