给编译完成的二进制里的ObjectiveC方法和类重新命名


#1


惯例纯PoC

#import <Foundation/Foundation.h>
#import <dlfcn.h>
#import <objc/runtime.h>
@implementation boop:NSObject
-(int)bar{
  NSLog(@"RE:I AM:%@",NSStringFromClass([self class]));
  return 2;
}
@end
int main(){
  [[boop new] bar];
  return 0;
}

编译。运行

4FDD5FA1-7EBB-496B-9BC0-840023E6F702.png1994x840 116 KB

方法名

定位结构体

直接定位

现在使用Hopper加载可执行文件。搜索 __objc_class_类名_methods (对于类方法而言我们需要__objc_metaclass_类名_methods)

根据方法定位

找到对应objc方法的xref,此处例子:

CE09EACE-8185-44F1-BC34-2A2C42E75ECC.png2878x1424 488 KB

双击跳转,同样降落在上述位置

3E1B6750-295B-4A8D-9E74-FB8DC1FA0B08.png1974x1360 311 KB

第一个结构体是类信息。后跟一个以上的struct __objc_method结构体
正如Hopper已经标记的那样。第一个成员即为该方法在runtime注册的名称

双击name,跳转到selref

976399C3-3F7E-4D36-8A59-D106B413B817.png2412x738 215 KB

选中bar,切换到16进制模式直接修改(注意末尾的\0x0)
我们这里修改sel为foo

1BAA75B3-7A69-4E39-B9E8-D0116FADB4B0.png2444x1020 1.03 MB

左上角file->produce new executable->保存到新文件hw2
正常执行:

FC61ED16-D313-4F68-853E-0BCF06F87CE7.png1018x86 17.7 KB

class-dump:

69F1009B-4A2E-41C5-8B9D-9EC6B6B759DE.png1392x812 110 KB

应用场景:
classdump默认build是不认非ascii字符串的。即使你修改了classdump的源码theos的%hook 也不认
你可以通过这个方法将各类乱码sel名称或中文sel名称重命名

缺点是全局对同一个sel的引用都会被修改。而某些sel引用你也许并不想更改

彩蛋: 类似的思路可以在llvm层玩各种把戏。等黑暗剑21更新的时候放出

类名

方法大致同上。只不过你需要修改不同的结构体所指向的字符串。如图所示