听说你想撤回信息?

趁着元旦假期,花了一天的时间了解了一下 iOS 和 Mac App 的逆向技术。第一次涉足逆向工程,原本只是打算了解一下逆向的知识,然后发现原来还可以利用逆向做点有趣的事,于是在完成之后记录一下下~

实践结果

通过这次逆向,最终我实现了 iOS 端微信消息的防撤回运动步数的修改 以及 Mac 端微信消息的防撤回迅雷的免登陆免会员使用离线下载 功能 。

当然,软件的权利应当受到保护,逆向的技术亦不应被非法利用。因此本文并非为了破解任何的软件,只是取一些常用的 App 作例子,从技术的角度阐述一下逆向的知识点。

前提条件

由于我的 iOS 设备都系统都在 9.3.5 以上(手动捂脸),因此本次逆向的前提条件是在非越狱的设备上运行的。

前期准备

想要实现 Mac 系(macOS、iOS) Apps 的逆向,首先需要一些工具的协助:

如果有越狱的设备,则还需要 dumpdecrypted 对应用进行 “敲壳” 。由于前提条件,这次就不谈论这个了。

从 Mac 端微信开始

鉴于 Mac 端微信的逆向比较简单,这次就先从这开始吧。这次我们的目标是使得对方的撤回功能失效,即即使对方撤回了消息,我们还能看到对方的消息。那先用 class-dump ,导出微信的头文件吧。

看了一下,40+M 的二进制文件竟然包含了 2000+ 的头文件。好吧,那得 search 一下了。既然是撤回消息,应该其方法名称就包含 ”撤回“ 了吧。Search 一下,目标瞬间缩小成个位数了。

然后我关注到了 MessageService 中有一个方法:

- (void)onRevokeMsg:(id)arg1;

猜测应该就是收到 ”撤回消息“ 这一条消息的时候要执行的方法了,于是试一下吧。

把微信的 Mach-O 文件扔进 Hopper ,然后修改一下其汇编指令,让它不执行任何操作直接返回吧。

重新生成可执行文件之后直接替换掉原来的文件,然后重新运行微信,发现就成功了:)

整个过程为:

Binary --> Assembly Language --> Modification --> Assembly Language --> Binary

至于 iOS 端

同样的功能,在 iOS 端上要实现看起来就要麻烦多了。由于 未越狱的 iOS 并不允许运行未经签名的应用 ,因此在修改之后还需要对 app 进行 重新签名 。同时,在 App Store 里下载到的应用都是经过加密的,因此不能直接就 dump 出其头文件。(同时由于前提条件无法自行敲壳)于是只好直接去 PP助手 下载一个越狱版的 ipa 了。

这次要实现的是 消息防撤回修改微信运动步数 两个功能,于是我们利用 method-swizzling hook 一下,通过动态修改其本该调用的方法来实现。

在得到了已敲壳的 ipa 之后,就能 dump 出头文件了。在 dump 出来之后,我收到了惊吓。。。竟然有高达 8000 个头文件。。。 真是一个好庞大的工程啊。

好吧,然后结果发现 iOS 版的微信 ”撤回“ 功能在 CMessageMgr 中,方法同样是这个呢。

- (void)onRevokeMsg:(id)arg1;

然后用上面同样的方法,在 WCDeviceStepObject 里找到了对应步数的两个属性:

@property(nonatomic) unsigned long hkStepCount;
@property(nonatomic) unsigned long m7StepCount;

猜一下,这里应该就是根据 HealthKit 是否可用然后去取不同的属性吧。那把他们两个的 get 方法都替换了就好~ 利用 iOSOpenDev 创建一个 hook 的模板,就连手动调用 method-swizzling 的代码也省了。

然后加入对应要的 hook 的三个方法,让 onRevokeMsg 不执行任何操作,让 getters 直接返回想要的数值:

@class CMessageMgr;

CHDeclareClass(CMessageMgr);

CHOptimizedMethod(1, self, void, CMessageMgr, onRevokeMsg, id, value1) {
    
}

@class WCDeviceStepObject;

CHDeclareClass(WCDeviceStepObject);

CHOptimizedMethod(0, self, unsigned long, WCDeviceStepObject, m7StepCount) {
    return 66666;
}

CHOptimizedMethod(0, self, unsigned long, WCDeviceStepObject, hkStepCount) {
    return 66666;
}

CHConstructor {
    @autoreleasepool {
        CHLoadLateClass(CMessageMgr);
        CHLoadLateClass(WCDeviceStepObject);
        
        CHHook(1, CMessageMgr, onRevokeMsg); 
        CHHook(0, WCDeviceStepObject, m7StepCount);
        CHHook(0, WCDeviceStepObject, hkStepCount);
    }
}

这样就好了,build 一下生成 .dylib ,再用 dylib_insert 把动态库的地址注入 Mach-O 就会生成一个新的 Mach-O 文件。

/insert_dylib @executable_path/JustATry.dylib  ~/Desktop/WeChat

MachOView 就能看到新的动态库已经被注入了:

最后把这个文件改名重新改回 WeChat ,再连同动态库放入原 WeChat.app 并替换原来的文件,再用 iOS App Signer 对其进行重新签名。搞定。

整个过程:

Decrypted Binary --> Insert dylib --> Resign

由于 Objective-C 动态的特性,这次我们可以不用对二进制文件进行反编译,然后再对汇编指令进行修改,只需要直接添加一个动态库就能实现功能的更改了。

至于迅雷的破解

其实迅雷的破解跟 Mac 版微信的破解思路是类似的。

[UserController isLogined];
[UserController isVip]:
[UserController isPlatinum];
[UserController isDiamond];
[LocalTask isValidLixianTask];

让以上五个方法全部返回 YES 即可。

到这吧。


2017-1-28

结尾再送个彩蛋。关于某度云客户端对非会员用户默默地实行最高 80k 的下载速度的事情。原本可以通过使用旧版本 "XX同步盘" 来免受速度的限制,而后来 "XX同步盘" 在启动后检查版本的时候加入了更新提醒并自动退出了程序。而新版的 "XX网盘" 貌似是用 swift 和 objective-c 混编的。

于是直接对旧版 "XX同步盘" 的检查更新方法处理一下就可以继续使用咯。


2017-2-4 再更。

刚发现上述同步盘的彩蛋已失效。原本其通过强制升级来禁止用户使用,而如今改成了在用户登录的时候加入了版本的检测,若使用了旧版本的应用,则会提示登录失败。通过查看 errorMsg 得知是 tpl 的错误:

对比一下旧版本与新版本的请求后发现 tpl 从 mybox 改成 netdisk 了。

旧版本

新版本

当然,由于还有请求签名的存在,这次就不能再仅仅通过动态库修改 tpl 来绕过了。

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

推荐阅读更多精彩内容