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

昨天群里的提问。
惯例纯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;
}

编译。运行

方法名

定位结构体

直接定位

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

根据方法定位

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


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

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

双击name,跳转到selref

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

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

class-dump:

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

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

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

类名

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

5 个赞

这个我在课程里面也讲了

不是每个人都买得起你的课程的。比如我这种穷屌

先膜了,再学习

膜 收藏

膜 学习了

什么课程

请问是什么交流群,我可以加入吗

这个又什么应用场景吗

比如说方法和类名被混淆过了Logos语法没法Hook的时候

1 个赞

https://www.bilibili.com/video/av22872801

彩蛋啥事更新? 张总

时代太久远了我已经忘了当时准备发啥了

什么课程?

如何进群啊