Application implements anti-debug techniques
L'application implémente des techniques anti-débogage
Description
Le débogage et l'exploration dynamique de l'application sont des techniques courantes lors de l'ingénierie inverse. Par exemple, les ingénieurs inverses peuvent tracer l'exécution de l'application, espionner les données sensibles, et modifier la mémoire pour altérer son comportement.
Pour compliquer la tâche d'analyse dynamique de l'application, celle-ci doit implémenter des techniques anti-débogage.
Recommandation
Pour implémenter des techniques anti-débogage, utilisez plusieurs de ces approches :
ptrace : Utilisez l'appel système ptrace avec le drapeau PT_DENY_ATTACH pour empêcher les débogueurs de s'attacher au processus. Cet appel système ne fait pas partie de l'API publique d'iOS et nécessite l'utilisation de la fonction dlsym pour obtenir un pointeur de fonction afin de l'appeler.
#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 : Cette fonction peut être utilisée pour récupérer des informations sur le processus en cours, y compris déterminer si l'application est en cours de débogage.
#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 : L'application iOS peut vérifier le PID parent pour détecter si l'application a été démarrée avec un débogueur.