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