昨天群里的提问。
惯例纯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更新的时候放出
类名
方法大致同上。只不过你需要修改不同的结构体所指向的字符串。如图所示