Я пытаюсь понять, как реализовать антиотладку, начав с простейшего метода PT_DENY_ATTACH и попытавшись отладить его с помощью lldb. Но я понятия не имею, в какой части моей задачи-с мне нужно ее реализовать.
Я написал простой код Objective-C для страницы входа.
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) NSString *username;
@property (nonatomic, strong) NSString *password;
@property (weak, nonatomic) IBOutlet UITextField *usernameTextField;
@property (weak, nonatomic) IBOutlet UITextField *passwordTextField;
@property (weak, nonatomic) IBOutlet UILabel *notificationLabel;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.username = @"Sally";
self.password = @"password123";
self.passwordTextField.secureTextEntry = YES;
}
- (IBAction)loginWasPressed:(id)sender {
BOOL isUsersEqual = [self.username isEqualToString:[self.usernameTextField text]];
BOOL isPasswordEqual = [self.password isEqualToString:[self.passwordTextField text]];
if (isUsersEqual && isPasswordEqual) {
NSLog(@"SUCCESS!");
[self.notificationLabel setText:@"Logged In!"];
}
else {
NSLog(@"FAILURE!");
[self.notificationLabel setText:@"Incorrect!"];
}
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}
@end
Как реализовать антиотладку?





Во-первых, ptrace() не является частью общедоступного API на iOS. В соответствии с политикой публикации AppStore использование непубличных API запрещено, и их использование может привести к отклонению приложения из AppStore, поэтому нам нужно вызывать его через указатель на функцию с помощью dlsym.
Полный код:
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#import <dlfcn.h>
#import <sys/types.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
}
int main(int argc, char * argv[]) {
#ifndef DEBUG
anti_debug();
#endif
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
Затем вы можете изменить целевую конфигурацию сборки на Release и проверить, отключен ли Xcode. Надеюсь, это поможет!
@CarolWard Я обновил свой ответ полным кодом, проверьте это, он должен работать правильно.
он говорит: «Неявное объявление функции ptrace недопустимо в C99». Означает ли это, что ptrace устарел?