破解InterfaceInspector的3种方法

这个是用于浏览mac os app页面布局的利器。
下载地址:

http://www.interface-inspector.com/

软件是收费的,当然也可以破解。作者没有做特别复杂的防逆向手段,这里提供3种破解思路。对于其他类似应用,大家可以举一反三。

1.注入破解

内容如下:

#import "Main.h"
#import <objc/runtime.h>
#import <objc/message.h>

@implementation NSObject (InterfaceInspectorFramework)
    
#pragma mark - SMLicenseManager
- (BOOL)hook_isLicensed {
    return YES;
}
#pragma mark - NSBundle
- (int)hook_codeSignState {
    return 0x02;
}

@end

static void __attribute__((constructor)) initialize(void) {
    CBHookInstanceMethod(SMLicenseManager, @selector(isLicensed), @selector(hook_isLicensed));
    CBHookInstanceMethod(NSBundle, @selector(codeSignState), @selector(hook_codeSignState));
}

注入之后,发现软件虽然已经授权了,但是却没有办法正常attach应用。
看下系统日志


是interface-inspector依赖了一个注入库,注入库里的一个方法过时了(在mac OS Sierra下)。
具体看这个帖子:

http://www.th7.cn/system/mac/201611/188607.shtml

去github上下载一份源码编译一下。

https://github.com/rentzsch/mach_inject

编译出mach_inject_bundle.framework文件放在/Library/Frameworks/mach_inject_bundle.framework目录下,替换掉旧的。

好了,再次使用interface-inspector注入app,成功了。

2.利用静态patch方式破解

下载app,将Interface Inspector.app/Contents/MacOS/Interface Inspector 这个二进制拖进hopper。

先去掉签名校验
在hopper的搜索框里输入finishL ,找到


我们需要干掉的2个地方就这这2个函数里。
先进void -[SMAppDelegate applicationWillFinishLaunching:]

看下下图圈起来的位置:


就是调用codeSignState 方法,返回值与0x2比较。
jne就是 jump not equal,不等于0x02,就跳往 loc_100024851

loc_100024851 是什么?就是签名不对的错误消息。

接下来就是把这段逻辑干掉,方法很多。可以吧jne改成je,我这里是直接把跳转语句nop掉了。
操作过程:鼠标选中jne loc_100024851这条汇编

hopper上面菜单选择Modify->NOP Region

处理完签名校验,接下来处理Licence
很容易在 -[SMAppDelegate applicationDidFinishLaunching:]:中找到这一段:

调用了:[[SMLicenseManager sharedInstance]isLicensed]
我们只需要改isLicensed 这个方法,让他返回true就行了。
搜索SMLicenseManager这个类,找到isLicensed函数。

选中汇编,修改为 mov rax,0x01,然后把不需要的代码nop掉。



然后选中刚才nop的位置,Modify->Assemble instruction



修改为:

把多出来的4个点也nop掉。


最终

将修改后的可执行文件,导出,替换旧的。如果有弹出框移除签名,点移除。

点击执行替换后的app,成功了!

3,打内存补丁

原理是先注入模块,然后在main函数开始之前,用静态函数搜索内存里的目标位置,把相应的二进制patch掉。
方法如下:

#import <dlfcn.h>
#import <stdlib.h>
#import <string.h>
#import <sys/types.h>
#import <mach-o/dyld.h>
#import <mach-o/loader.h>
#import <mach-o/nlist.h>
#include <sys/sysctl.h>
#include <mach/mach.h>


//patch_mem(g_xxAddr,0x00000000);
static void patch_mem(uintptr_t p,unsigned int data){//patch 8字节
    int page = getpagesize();
    uintptr_t address = (uintptr_t)(p);
    uintptr_t base = address/page * page;
    mach_port_t self = mach_task_self();
    kern_return_t error;
    if((page - (uintptr_t)(p) - base)<12){
        page *= 2;
    }
    if((error = vm_protect(self,base,page,FALSE ,VM_PROT_READ|VM_PROT_WRITE|VM_PROT_COPY))){
        return;
    }
    
    *(unsigned int *) p = data;
    if((error = vm_protect(self,base,page,FALSE,VM_PROT_READ|VM_PROT_EXECUTE))){
        return;
    }
}

static void __attribute__((constructor)) initialize_mem_patch(void) {
    const struct mach_header *mhp = _dyld_get_image_header(0);
    BOOL is64bit = mhp->magic == MH_MAGIC_64 || mhp->magic == MH_CIGAM_64;
//    uintptr_t module_base_cursor = (uintptr_t)mhp + (is64bit ? sizeof(struct mach_header_64) : sizeof(struct mach_header));
    uintptr_t module_base_cursor = (uintptr_t)mhp;
    if (is64bit) {
        uintptr_t targetCursor = module_base_cursor + 0x2447E;
        patch_mem(targetCursor,0x441f0f66);//将baseModel偏移0x2447E的位置nop掉。
        uintptr_t licenceTarget = module_base_cursor + 0x10fe7b;
        patch_mem(licenceTarget,  0x01c0c748);//mov rax,0x01
    }
}

参考文章:
http://iosre.com/t/mac-app-ui-interface-inspector-reveal-mac/3453
http://www.th7.cn/system/mac/201611/188607.shtml

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容