UDN-企业互联网技术人气社区

板块导航

浏览  : 1357
回复  : 0

[干货] 听说你想撤回信息?

[复制链接]
舞操的头像 楼主
发表于 2017-1-5 14:05:45 | 显示全部楼层 |阅读模式
  趁着元旦假期,花了一天的时间了解了一下 iOS 和 Mac App 的逆向技术。第一次涉足逆向工程,原本只是打算了解一下逆向的知识,然后发现原来还可以利用逆向做点有趣的事,于是在完成之后记录一下下~

  实践结果

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

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

  前提条件

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

  前期准备

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

  class-dump

  Hopper

  iOSOpenDev

  insert_dylib

  MachOView

  iOS App Signer

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

  从 Mac 端微信开始

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

7.png

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

6.png

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

 
  1.  - (void)onRevokeMsg:(id)arg1;
复制代码


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

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

5.png

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

  整个过程为:

  Binary –> Assembly Language –> Modification –> Assembly Language –> Binary

  至于 iOS 端

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

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

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

4.png

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

  
  1. - (void)onRevokeMsg:(id)arg1;
复制代码


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

  1. @property(nonatomic) unsigned long hkStepCount;
  2. @property(nonatomic) unsigned long m7StepCount;
复制代码


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

3.png

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

  1. @class CMessageMgr;

  2. CHDeclareClass(CMessageMgr);

  3. CHOptimizedMethod(1, self, void, CMessageMgr, onRevokeMsg, id, value1) {
  4.        
  5. }

  6. @class WCDeviceStepObject;

  7. CHDeclareClass(WCDeviceStepObject);

  8. CHOptimizedMethod(0, self, unsigned long, WCDeviceStepObject, m7StepCount) {
  9.     return 66666;
  10. }

  11. CHOptimizedMethod(0, self, unsigned long, WCDeviceStepObject, hkStepCount) {
  12.     return 66666;
  13. }

  14. CHConstructor {
  15.         @autoreleasepool {
  16.         CHLoadLateClass(CMessageMgr);
  17.         CHLoadLateClass(WCDeviceStepObject);
  18.         
  19.         CHHook(1, CMessageMgr, onRevokeMsg);
  20.         CHHook(0, WCDeviceStepObject, m7StepCount);
  21.         CHHook(0, WCDeviceStepObject, hkStepCount);
  22.     }
  23. }
复制代码


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

 
  1.  /insert_dylib @executable_path/JustATry.dylib ~/Desktop/WeChat
复制代码

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

2.png

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

1.PNG

  整个过程:

  Decrypted Binary –> Insert dylib –> Resign

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

  至于迅雷的破解

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

  1. [UserController isVip]:
  2. [UserController isPlatinum];
  3. [UserController isDiamond];
  4. [UserController isLogined]
复制代码

  处理掉以上四个方法即可。

  到这吧。

原文作者:佚名  来源:开发者头条

相关帖子

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于我们
联系我们
  • 电话:010-86393388
  • 邮件:udn@yonyou.com
  • 地址:北京市海淀区北清路68号
移动客户端下载
关注我们
  • 微信公众号:yonyouudn
  • 扫描右侧二维码关注我们
  • 专注企业互联网的技术社区
版权所有:用友网络科技股份有限公司82041 京ICP备05007539号-11 京公网网备安1101080209224 Powered by Discuz!
快速回复 返回列表 返回顶部