如何获得ViewController的名字

通过class dump将app所有的头文件全部导出来了。
进入到某一个界面进行操作,怎么才能获取到当前界面ViewController的类名呢?
1,在头文件里搜索,没有找到相关的名字
2,对UIViewController做了hook,打印出当前的类名

%hook UIViewController
-(void)viewDidLoad
{
%orig;
NSLog(@"controllerName=%@",NSStringFromClass([self class]));
}
%end

打印出当前的ViewController的类名,但是这个类在头文件里却搜索不到。
另外写一个xm文件hook这个类,发现也没有调用到。
请问下 怎么对指定页面进行hook操作,通过在UIViewController里获取到的类名,为什么不能hook呢?

用Reveal辅助

我用Reavel只能获取到当前的UIView,但是拿不到它所在的ViewController。

[#内存地址 nextResponder]不断调用,总能知道这个view的controller。。

1 个赞

第二版第170页。
在cycript中,通过页面view不断调用nextResponder获得。同楼上。

我看了这篇帖子 http://bbs.iosre.com/t/iosrelottery/46
我用cycript或者hook住UIViewDidLoad得到controller类名是相同的。比如得到的类名是testViewController。为什么我class-dump出的头文件中没有这个类。
并且我去hook testViewController的viewDidLoad方法,也并没有效果

可能这个类不在你classdump的文件中。
参考170页。
grep -r XXXXController /System/Library/
grep -r XXXXController /Some Directory

多谢 我去找找

还想到一个问题。我已经打印出当前的congroller名字了,虽然在头文件里没有找到它,但这个类应该是确实存在的。我去hook这个类,和有没有头文件也没有关系,为什么会调用不到呢?

hook的哪个方法

viewDidLoad方法

那最好贴出代码来看

UIViewController.xm
@interface UIViewController(Extension)
-(void)log;
@end

@implementation UIViewController(Extension)
-(void)log
{
  NSLog(@"controllerName=%@",NSStringFromClass([self class]));
}
@end


%hook UIViewController
-(void)viewDidLoad
{
  %orig;
  [self log];
}

%end

通过上面的方法查看日志 controllerName=XSDKLoginController
然后hook这个类

XSDKLoginController.xm
%hook XSDKLoginController
-(void)viewDidLoad
{
%orig;
NSLog(@"XSDKLoginController viewDidLoad");
}
%end

然后重新运行程序,发现viewDidLoad方法没有被调用到

新增方法,不能用extension(应该是不能)。
需要用%new。

例如这个

%hook XXXXXController

%new

  • (void)evt_alert:(id)msg{
    // todo
    }

%end

我是给UIViewController添加的类别,类别里的日志是打印出来的。所以添加类别是可以用的。打印出了 XSDKLoginController这个名字。
XSDKLoginController是继承自UIViewController,那么理论上,在XSDKLoginController的viewDidLoad方法里应该打印出两条日志才对。但现在只是打印出父类的日志。即XSDKLoginController类还是没有被调用到。这个情况感觉特别困惑

另外我去掉类别,结果是一样的

哦这个意思。
如果不去hook UIViewController 的viewDidLoad,直接hook XSDKLoginController的呢?

不知道这里的Hook能否叠加。找时间我也试试。

我测试过了,只去hook XSDKLoginController就看不到viewDidLoad的日志了。
这个问题觉得挺奇怪的,刚学习逆向一段时间,觉得会很多东西,现在出了这个问题,都有点怀疑自己了,不知道是自己理解的不对,还是这个工程太nb了

hook是可以叠加的,这个我写了个测试工程测试过了,其实就是一个继承的关系

先去hook个别的app,别只在这个上使劲呀。
或者你这个app,能告诉我么,我也研究研究

手头刚好有这个企业版的app,省去了砸壳嘛,就试试 叫战龙之刃
我再去试试别的