iOS越獄檢測

說多了都是淚,我說說我的情況,我們公司使用內購進行的產品購買,我全是按照網上(基本都一樣)的流程進行了內購支付。支付成功后蘋果公司會給一個回調代碼,我根據回調成功的代碼進行了公司的邏輯處理(就是開會員)。測試中,沒什么問題,支付很愉快,沒毛病,也看見了到賬。

結果問題來了,接下來幾個月有正常充值成功的,也有開會員接口調用成功的,但錢,沒到賬。也是就在開發者網址里沒有記錄。這尼瑪錢哪里去了?

我查了一些資料,有說是越獄手機會偽造,繞過內購,于是我就寫了今天的文章....
不知道有沒有相同經歷的人,來分享下經驗,或者幫我分析下什么原因,(公司沒有充值是一個借口,刷新就調用一次,完全沒回調)

為了避免越獄的手機能獲得下載的數據,我有擔心越獄手機會影響內購的使用。于是我禁止了越獄手機進行內購。

參考文章

#import <UIKit/UIKit.h>

/**

 作用:用于檢測設備是否越獄

 */

@interface UIDevice (Helper)

-(BOOL)isJailbroken;

@end
#import "UIDevice+Helper.h"

#import <sys/stat.h>

#import <dlfcn.h>

#import <mach-o/dyld.h>

@implementation UIDevice (Helper)

-(BOOL)isJailbroken

{

    BOOL jailbroken = NO;

    NSString *cydiaPath = @"/Applications/Cydia.app";

    NSString *aptPath = @"/private/var/lib/apt/";

    NSString *applications = @"/User/Applications/";

    NSString *Mobile = @"/Library/MobileSubstrate/MobileSubstrate.dylib";

    NSString *bash = @"/bin/bash";

    NSString *sshd =@"/usr/sbin/sshd";

    NSString *sd = @"/etc/apt";

    

    if([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) {

        jailbroken = YES;

    }

    if([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) {

        jailbroken = YES;

    }

    if ([[NSFileManager defaultManager] fileExistsAtPath:applications]){

        jailbroken = YES;

    }

    if ([[NSFileManager defaultManager] fileExistsAtPath:Mobile]){

        jailbroken = YES;

    }

    if ([[NSFileManager defaultManager] fileExistsAtPath:bash]){

        jailbroken = YES;

    }

    if ([[NSFileManager defaultManager] fileExistsAtPath:sshd]){

        jailbroken = YES;

    }

    if ([[NSFileManager defaultManager] fileExistsAtPath:sd]){

        jailbroken = YES;

        

    }

    

    //使用stat系列函數檢測Cydia等工具

    struct stat stat_info;

    if (0 == stat("/Applications/Cydia.app", &stat_info)) {

        jailbroken = YES;

    }

    

    //你可以看看stat是不是出自系統庫,有沒有被攻擊者換掉:如果結果不是 /usr/lib/system/libsystem_kernel.dylib 的話,那就100%被攻擊了。

    //如果 libsystem_kernel.dylib 都是被攻擊者替換掉的……

    

    int ret;

    Dl_info dylib_info;

    int (*func_stat)(const char *, struct stat *) = stat;

    if ((ret = dladdr(func_stat, &dylib_info))) {

        NSString *str = [NSString stringWithFormat:@"%s",dylib_info.dli_fname];

        if (![str isEqualToString:@"/usr/lib/system/libsystem_kernel.dylib"]) {

            jailbroken = YES;

        }

    }

    

    //通常情況下,會包含越獄機的輸出結果會包含字符串: Library/MobileSubstrate/MobileSubstrate.dylib 。

    uint32_t count = _dyld_image_count();

    for (uint32_t i = 0 ; i < count; ++i) {

        NSString *name = [[NSString alloc]initWithUTF8String:_dyld_get_image_name(i)];

        if ([name containsString:@"Library/MobileSubstrate/MobileSubstrate.dylib"]) {

            jailbroken = YES;

        }

    }

    

    //未越獄設備返回結果是null,越獄設備就各有各的精彩了,尤其是老一點的iOS版本越獄環境。

    char *env = getenv("DYLD_INSERT_LIBRARIES");

    if(env){

        jailbroken = YES;

    }

    

    

    return jailbroken;

}
 if ([UIDevice currentDevice].isJailbroken) {

        [LYCalendarTool showAlertViewWithViewController:self title:@"溫馨提示" message:@"為了你的財產安全,越獄的設備禁止使用內購" confirmBtnTitle:nil cancelBtnTitle:@"知道了" confirmHandler:nil cancelHandler:nil];

         return;

    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 前段時間公司讓做了個對越獄設備的檢測和攔截,下面是綜合自己的開發和網上一些帖子的總結,總體來說做起來還是比較簡單的...
    Yaso閱讀 8,964評論 3 27
  • iOS越獄檢測 檢測當前程序運行的環境變量: 未越獄設備返回結果是null,越獄設備就各有各的精彩了,尤其是老一點...
    H了個L閱讀 739評論 0 0
  • 《非銀行支付機構網絡支付業務管理辦法》條款釋義 - 中國支付網 - 中國支付行業第一門戶網站2016年7月1日...
    菜菜苔閱讀 7,647評論 1 44
  • ▼導讀 作為全球頂級IT投資人和創業家,LinkedIn創始人里德·霍夫曼提出全球格局下的個人戰略:每個人都應該具...
    郭亞羅閱讀 1,302評論 1 1
  • 等,也是一種享受,享受著愛 享受著孤獨,享受著彼此之間那點滴 享受著,我想你,想我的樣子 跳動的心不為等待而彷徨 ...
    舊時雨m閱讀 192評論 0 3