IOS Frameworks Hook 另類hook方法 Logos hook 對照表 Frameworks插件 Tweak 插件

 

一、概念

HOOK,中文譯爲“掛鉤”或“鉤子”。在iOS逆向中是指改變程序運行流程的一種技術。通過hook可以讓別人的程序執行自己所寫的代碼。在逆向中經常使用這種技術。所以在學習過程中,我們重點要了解其原理,這樣能夠對惡意代碼進行有效的防護。

 

二、iOS中HOOK技術的幾種方式

Method Swizzle

     利用OC的Runtime特性,動態改變SEL(方法編號)和IMP(方法實現)的對應關係,達到OC方法調用流程改變的目的。主要用於OC方法。

 

     fishhook

    它是Facebook提供的一個動態修改鏈接mach-O文件的工具。利用MachO文件加載原理,通過修改懶加載和非懶加載兩個表的指針達到C函數HOOK的目的。

 

 Cydia Substrate 

   Cydia Substrate 原名爲 Mobile Substrate ,它的主要作用是針對OC方法、C函數以及函數地址進行HOOK操作。當然它並不是僅僅針對iOS而設計的,安卓一樣可以用。官方地址:http://www.cydiasubstrate.com/

 

原來Logos實現方法

1.logos獲取用戶信息

%hook HMIDAppTokenItem

//獲取用戶appToken
-(NSString *)appToken{
    id s=%orig;
    [xddCode toeknSet:s];
    return s;//s   __NSCFString *    "lsdfs324k23hkh32l5h35h63k4h5"
}

//  獲取用戶ID
-(NSString *)userId{
    id s=%orig;
    [xddCode userIDSet:s];
    return s;//s    __NSCFString *    "107xxxxxx70"
}

%end

 2.logos界面添加圖標,文字,點擊事件


//個人設置頁面
%hook ProfileViewController
- (void)viewDidLoad{
    
    %orig;

    UILabel *nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 60, 80, 37)];
    nameLabel.font = [UIFont systemFontOfSize:15];
    nameLabel.text = @"您APP已被hook";
    nameLabel.backgroundColor = [UIColor clearColor];
    nameLabel.textAlignment = NSTextAlignmentLeft;
    nameLabel.numberOfLines = 2;
    //用於設置UILabel中文本的行數
    [self.view addSubview:nameLabel];
    
    // 移動圓圓 界面位置信息
      CGRect rect_screen = [[UIScreen mainScreen]bounds];
      CGSize size_screen = rect_screen.size;
      int height = size_screen.height;
      int width  = size_screen.width;
      
      // 移動圓圓 初始化
      BallUIView *baView = [[BallUIView alloc] initWithFrame:CGRectMake(width-80, height/2-200, 50, 50)];
      baView.backgroundColor = [UIColor whiteColor];
      baView.layer.cornerRadius = 25;
      baView.layer.masksToBounds = YES;
      
      // 移動圓圓 小圓球圖標
      UIImageView *imgViewM = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]];
      imgViewM.autoresizingMask = UIViewAutoresizingFlexibleWidth;
      imgViewM.frame = CGRectMake(0, 0, 50, 50);
      [baView insertSubview:imgViewM atIndex:0];
    
    __weak typeof(self) weakSelf = self;
    
      //按鈕點擊事件
      baView.btnClick = ^(UIButton *sender) {
          NSLog(@"btn.btnClick ~");

          WebUrlViewController * xddweb = [[WebUrlViewController alloc] init];
          [xddweb setUrl:@"http://www.baidu.com"];//頁面打開網頁
          
          [weakSelf.navigationController pushViewController:xddweb animated:YES];
      };

      [self.view addSubview:baView];//顯示到界面
      
}
%end

//頭文件 ProfileViewController 爲了編譯通過

@interface ProfileViewController: UIViewController
{
}
@property (nonatomic, copy) NSString* newProperty;

+ (void)classMethod;

@end

 

Method Swizzle

轉換爲 Frameworks 插件 Hook

新建Frameworks項目 名稱:frameworkxdds 會出現frameworkxdds.h 不用理會

反手就 新建 frameworkMain 文件 NSObject

↓得到 兩個文件↓

frameworkMain.m

frameworkMain.h

 

運行初始化自動加載方法

frameworkMain.m

添加 +(void)load

@implementation frameworkMain
//我的界面加載完畢hook
IMP (* old_pviewDidLoad)(id self, SEL cmd);
//獲取返回 sting tokrn
id (* old_appToken)(id self, SEL cmd);
//獲取返回 sting tokrn
id (* old_userId)(id self, SEL cmd);


+(void)load{

    [self addimg];//添加圖標

    [self getUserinfo];//hooh 用戶信息

}

用戶信息hook

Frameworks hook HMIDAppTokenItem 類的 appToken方法

Frameworks hook HMIDAppTokenItem 類的 userId方法

//獲取用戶信息
+(void)getUserinfo {
    
    //HMIDAppTokenItem
    Method * appToken = class_getInstanceMethod(NSClassFromString(@"HMIDAppTokenItem"), @selector(appToken));
    //獲取原方法保存
    old_appToken = method_getImplementation(appToken);
    //重新賦值IMP方法
    method_setImplementation(appToken, (IMP)my_appToken);
    
    //============2222=============
    Method * userId = class_getInstanceMethod(NSClassFromString(@"HMIDAppTokenItem"), @selector(userId));
     //獲取原方法保存
     old_userId = method_getImplementation(userId);
     //重新賦值IMP方法
     method_setImplementation(userId, (IMP)my_userId);
}

用戶信息hook流程控制

Frameworks hook HMIDAppTokenItem 類的 appToken 方法執行流程控制

Frameworks hook HMIDAppTokenItem 類的 userId 方法執行流程控制

id my_appToken(id self,SEL sel){
    //執行原方法
    NSString*tk = old_appToken(self, sel);
    [xddCode toeknSet:tk];//存儲token
    return tk;
}

id my_userId(id self,SEL sel){
    //執行原方法
    NSString*uid = old_userId(self, sel);
    [xddCode userIDSet:uid];//存儲uuid
    return uid;
}

 

hook添加界面圖標

Frameworks hook ProfileViewController 類的 viewDidLoad 方法

//添加圖標
+(void)addimg {
    //ProfileViewController
    Method * viewDidLoad = class_getInstanceMethod(NSClassFromString(@"ProfileViewController"), @selector(viewDidLoad));
    //獲取原方法保存
    old_pviewDidLoad = method_getImplementation(viewDidLoad);
    //重新賦值IMP方法
    method_setImplementation(viewDidLoad, (IMP)my_pviewDidLoad);
}

hook添加界面圖標 流程控制


void my_pviewDidLoad(id self,SEL sel) {
    
    ProfileViewController*v = self;
    
    //執行原方法
    old_pviewDidLoad(self, sel);
    
    UILabel *nameLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 120, 80, 37)];
    nameLabel.font = [UIFont systemFontOfSize:15];
    nameLabel.text = @"您已hook成功";
    nameLabel.backgroundColor = [UIColor clearColor];
    nameLabel.textAlignment = NSTextAlignmentLeft;
    nameLabel.numberOfLines = 2;
    
    [v.view addSubview:nameLabel];

    //座標初始化
    CGRect rect_screen = [[UIScreen mainScreen]bounds];
      CGSize size_screen = rect_screen.size;
      int height = size_screen.height;
      int width  = size_screen.width;
      
      // 移動圓圓
      BallUIView *baView = [[BallUIView alloc] initWithFrame:CGRectMake(width-80, height/2-200, 50, 50)];
      baView.backgroundColor = [UIColor whiteColor];
      baView.layer.cornerRadius = 25;
      baView.layer.masksToBounds = YES;
      
      //小圓球 圖標
      UIImageView *imgViewM = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"[email protected]"]];
      imgViewM.autoresizingMask = UIViewAutoresizingFlexibleWidth;
      imgViewM.frame = CGRectMake(0, 0, 50, 50);
      [baView insertSubview:imgViewM atIndex:0];
    
    __weak typeof(self) weakSelf = v;
    
      baView.btnClick = ^(UIButton *sender) {
          NSLog(@"btn.btnClick ~");

          WebUrlViewController * xddweb = [[WebUrlViewController alloc] init];
          [xddweb setUrl:@"http://www.baidu.com"];//打開網頁
          
          [v.navigationController pushViewController:xddweb animated:YES];
      };
      [v.view addSubview:baView];
 
}

 

附工程圖

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章