009——逆向之代码注入

代码注入过程

1、新建一个工程;
2、将微信Payload文件夹放入新建的工程中的APP文件夹里面;

$zip -ry WeChat.ipa Payload

3、在Build Phases里面添加New Run Script phase,将自动化脚本路径添加进去;


配置脚本文件

4、给自动化脚本权限

$chmod +x XcodeApp.sh

5、编译下工程,能正常通过;

6、在工程中添加一个target framework并添加一个ColinHook类;

@implementation ColinHook

+ (void)load {
    NSLog(@"恭喜你代码注入成功了🍺🍺");
}

@end

7、将工程target和framework target关联;


这时编译运行是没问题的,但是没有不会打印我们写的代码的。

8、将注入的framework库添加到MachO文件里面;

这时需要用到一个工具yololib,并将它放到Mac电脑的/usr/local/bin里面。

$yololib WeChat Frameworks/colinHookFrameWork.framework/colinHookFrameWork

9、用MachOView工具查看WeChat的MachO文件,查看加入的framework路径;


10、将第9步的WeChat的MachO文件放到工程根目录的APP文件夹/Payload/WeChat.app里面,执行第2步,并编译运行工程,到此代码就注入成功了;

Dylib库注入过程

1、新建一个工程;
2、将微信Payload文件夹放入新建的工程中的APP文件夹里面;

$zip -ry WeChat.ipa Payload

3、在Build Phases里面添加New Run Script phase,将自动化脚本路径添加进去;

自动化shell脚本

4、添加Dylib库

a、这个是在Mac里面使用的动态库

b、证书也是Mac Developer证书

c、在Debug模式下Build后,Dylib动态库的路径和App包放的路径不一样

image.png

5、新建的工程和Dylib库进行关联

关联的意义就是为了后续在工程Build的时候将Dylib库添加到app里面去。

6、修改Build Setting -> Per-configuration Intermediate Build Files Path

7、修改Dylib库的架构配置(Base SDK改成iOS配置即可)

8、将Dylib注入到MachO文件

# 注入我们编写的动态库
echo "开始注入"
# 需要注入的动态库的路径  动态库的名称!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libColinHook.dylib"
#
## 通过工具实现注入
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"

9、在Dylib中写注入代码,并编译运行

方法交换

MethodSwizzleManager.h

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface MethodSwizzleManager : NSObject

+(void)HookClass:(Class)class withOldMethod:(SEL)oldMethod withNewMethod:(SEL)newMethod;

@end

MethodSwizzleManager.m

#import "MethodSwizzleManager.h"

@implementation MethodSwizzleManager

+(void)HookClass:(Class)class withOldMethod:(SEL)oldMethod withNewMethod:(SEL)newMethod {

    Method old = class_getInstanceMethod(class, oldMethod);
    Method new = class_getInstanceMethod(class, newMethod);

    method_exchangeImplementations(old, new);
}

@end

Hook自己工程中交换实例方法和类方法的实现

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //交换实例方法实现
//    [MethodSwizzleManager HookClass:self.class withOldMethod:@selector(oldMethod) withNewMethod:@selector(newMethod)];

    //交互类方法实现
    [MethodSwizzleManager HookClass:object_getClass(self.class) withOldMethod:@selector(oldClassMethod) withNewMethod:@selector(newClassMethod)];
}

+ (void)newClassMethod {
    NSLog(@"newClassMethod被调用");
}

+ (void)oldClassMethod {
    NSLog(@"oldClassMethod被调用");
}

- (void)newMethod {
    NSLog(@"newMethod被调用");
}

- (void)oldMethod {
    NSLog(@"oldMethod被调用");
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
//    [self oldMethod];
    [ViewController oldClassMethod];
}

Hook微信的注册方法

1、使用注入Framework库的工程来做这份案例

2、修改shell脚本,将Framework库添加到MachO文件

# ---------------------------------------------------
# 7. 注入我们编写的动态库
echo "开始注入"
# 需要注入的动态库的路径  需要修改动态库的名称!
INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/colinHookFrameWork.framework/colinHookFrameWork"
#INJECT_FRAMEWORK_RELATIVE_PATH="Frameworks/libColinHook.dylib"
#
## 通过工具实现注入
# yololib MachO名称
yololib "$TARGET_APP_PATH/$APP_BINARY" "$INJECT_FRAMEWORK_RELATIVE_PATH"
echo "注入完成"

3、运行工程,查看微信注册按钮

Target <WCAccountLoginControlLogic: 0x104de42344>
Action onFirstViewRegester
微信注册按钮

4、将微信的头文件导出,查看WCAccountLoginControlLogic类

class-dump -H WeChat -o /Users/yaoqi/Desktop/Headers

将Headers文件夹拖到一个编译工具,不建议是xcode,因为文件太多导入xcode中很慢,然后我们只需要找到WCAccountLoginControlLogic.h文件

微信注册按钮的类

5、运行工程,Hook微信注册方法

Hook微信注册方法

总结

  • 利用动态库注入(Framework库、Dylib库)
  • 注入进APP(工程和动态库有关联关系)
  • 修改MachO文件的Load Commands
  • 在注入的动态库中,写上自己想要注入的代码
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容