最近有一个笔试人员对我们的应用进行了审核,其中一个发现是越狱设备的人可以附加本地调试器。
他们建议的解决方案是启用 PT_DENY_ATTACH
当启动应用程序时。这在原生应用程序中是相当容易做到的,但我一直无法用我们的Xamarin应用程序(不是表单)来解决这个问题。
我试过在Xcode中创建一个objc框架,绑定它并将其拉进来。我也试过创建一个共享的c++库,但在VS Mac中是不可能的。
我知道 PT_DENY_ATTACH
已经被规避了,但我还是想知道如何实现。
谢谢!
事实证明,我的objc框架表现得很正常,只是没有按照我预期的方式。出于某种原因,我仍然能够附加Visual Studio调试器,但当我转移到Xcode并尝试附加它的调试器时,当框架被调用时,它失败了。
为了回答我的问题。
在Xcode中,我用一个类创建了一个新的静态库。
GDBManager.h
#import <Foundation/Foundation.h>
@interface GDBManager : NSObject
+(void)DisableGDB;
@end
GDBManager.m
#import "GDBManager.h"
#import <dlfcn.h>
#import <sys/types.h>
@implementation GDBManager
typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);
#define PT_DENY_ATTACH 31
+(void)DisableGDB {
void* handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);
ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");
ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);
dlclose(handle);
}
@end
我按照这些说明为我的库创建了一个胖文件,并在一个绑定项目中使用它。
https:/docs.microsoft.comen-usxamariniosplatformbinding-objective-cwalkthrough。
然后我将生成的dll添加到我的Xamarin.iOS项目中,并调用上面的内容 UIApplication.Main(args, null, "AppDelegate");
在 Main.cs