-
-
【Mac】对某软件限制使用的分析
-
发表于: 2021-3-5 01:52 2810
-
限制使用 具体表现在:程序位置必须在应用程序目录,不能为其他目录
有图有真相,先看图
然后看看真相后面隐藏了什么,上代码图
- 先说说applicationWillFinishLaunching这个函数是干嘛的,是载入程序时调用的,看字面意思也看得出来,注意,只有正常加载完这个函数程序才会正常启动。
- 再来说是下面他干的事情
1 2 3 4 5 6 7 8 | v3 = objc_msgSend(&OBJC_CLASS___NSBundle, "mainBundle" , a3); v4 = (void * )objc_retainAutoreleasedReturnValue(v3); v5 = v4; v6 = objc_msgSend(v4, "bundlePath" ); v7 = (void * )objc_retainAutoreleasedReturnValue(v6); v8 = v7; v9 = objc_msgSend(v7, "stringByDeletingLastPathComponent" ); v10 = (void * )objc_retainAutoreleasedReturnValue(v9); |
这几句话就是获取当前程序的运行目录
1 2 3 | v11 = objc_msgSend(v10, "lowercaseString" ); v12 = (void * )objc_retainAutoreleasedReturnValue(v11); v13 = (unsigned __int64)objc_msgSend(v12, "isEqualToString:" , CFSTR( "/applications" )); |
上面这几句呢,是把获取到的目录转成小写,在和/applications比较是否一致
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | if ( v13 ) { if ( (unsigned __int8) + [NeatNsUtils wasLaunchedAsLoginItem](&OBJC_CLASS___NeatNsUtils, "wasLaunchedAsLoginItem" ) && !(unsigned __int8) + [NeatNsUtils getSettingAutoStart](&OBJC_CLASS___NeatNsUtils, "getSettingAutoStart" ) ) { objc_msgSend(NSApp, "terminate:" , 0LL ); } } else { + [NeatNsUtils showMessage:description:]( &OBJC_CLASS___NeatNsUtils, "showMessage:description:" , CFSTR( "NeatDownloadManager should run from Applications folder." ), CFSTR( "Please Copy NeatDownloadManager.app to \r\n /Applications folder and then run it." )); objc_msgSend(NSApp, "terminate:" , 0LL ); } |
如果对比是在应用程序目录,就进行一系列的操作,这里我就不展开了
重点是,如果对比结果为否,就是不在应用程序目录,那就弹窗
CFSTR("NeatDownloadManager should run from Applications folder."),
CFSTR("Please Copy NeatDownloadManager.app to \r\n /Applications folder and then run it."));
这就是上面第一张图的结果了,至于解除限制也简单,把最后这个跳转NOP掉就好了
赞赏
赞赏
雪币:
留言: