cycript与Reveal怎么样寻找屏幕当前显示的UIViewController

以下面的微信Reveal截图为例,在cycript里怎么样把屏幕所显示的viewController对象找出来呢?

还有一个问题,cycript里,我想显示某个UIButton的text里的文字(中文)来找viewController,结果是显示的是\xe5\xbe\xae\xe4\xbf\xa1这类字符串,这是什么编码?该怎么样转码?或者可以让cycript显示中文吗?
对了,[UIApplication sharedApplication].keyWindow.rootViewController.visibleViewController 用这个方法cycript没输出内容

choose(UIViewController) //有很多个结果,无法定位
UIApp.windows[0].rootViewController//是微信的主界面那个MMTabBarController


非常好的问题,问到点子上来了。
MVC标准中的C是非常重要的环节,起到承上启下的作用,一般来说,拿到C,逆向工程就成功了一半。书的第二版所提炼出的方法论中,就把拿到C作为重要环节反复讲解,敬请期待!
具体到你的例子里,要拿到文字所在view的controller,方法是:

  1. 通过recursiveDescription找到文字所在view的地址(在Cycript里,中文以unicode编码显示);
  2. 通过“#地址”命令拿到view对象;
  3. 对view对象不断调用nextResponder,直到返回一个controller。

还有一个简单的,把所有viewController.title都改一遍,就知道哪个是当前显示的viewController了
我搜了一下,unicode是这样的啊\u670b\u53cb\u9a8c\u8bc1

走个捷径:victory:

cy# var a = UIApp.windows[0].rootViewController.childViewControllers

cy# [a[0].childViewControllers[0] setTitle:"the 0"]
cy# [a[1].childViewControllers[0] setTitle:"the 1"]
cy# [a[2].childViewControllers[0] setTitle:"the 2"]
cy# [a[3].childViewControllers[0] setTitle:"the 3"]


请问您用的什么转换工具将Unicode转为中文, cycript输出的内容为\xe8\xbe\x93\xe5\x85\xa5\xe9\xaa\x8c\xe8\xaf\x81\xe7\xa0\x81 网上找了不少转换工具找不到中文~

Python

解决了,3Q

我写了一个脚本,可以直接获取主window当前显示的控制器,自己用了很久基本没有问题。

function allWin() {
	return [UIApplication sharedApplication].windows
}

var allWindows=function () {
	return allWin()
}()

function presentedVCForVC(presentedViewController) {
	if ([presentedViewController isKindOfClass: [UINavigationController class]]) {
		var topVC = presentedViewController.topViewController;
		if (topVC.presentedViewController) {
			return presentedVCForVC(topVC.presentedViewController);
		}
		return topVC;
	}
	if ([presentedViewController isKindOfClass: [UITabBarController class]]) {
		var selectedVC = presentedViewController.selectedViewController;
		return presentedVCForVC(selectedVC);
	}
	return presentedViewController;
}

// 获取对应UIWindow的当前控制器
function currentWithWindow(win) {
	if (!win.rootViewController) {
		return "The window hadn't a root viewcontroller";
	}
	return presentedVCForVC(win.rootViewController);
}

// 打印keyWindow上的当前的控制器
function currentVCWithKeyWindow() {
	return currentWithWindow([UIApplication sharedApplication].keyWindow)
}

将其保存成.cy结尾的脚本,放到需要的位置后,在注入app时使用以下

cycript -p WeChat common.cy ; cycript -p WeChat

之后可以直接使用

currentVCWithKeyWindow ()

就可以获取到当前显示的控制器,如果当前显示的控制器是非主window的,那么可以使用

allWindows

获取当时所有的window,之后使用对应的window进行调用

currentWithWindow (#0x145fce5c0)
5 Likes

python shell:

>>> s=b'\xe8\xbe\x93\xe5\x85\xa5\xe9\xaa\x8c\xe8\xaf\x81\xe7\xa0\x81'
>>> print s
输入验证码
>>>
1 Like

恩恩已经解决过,不过还是非常感谢您的回答

恩,这里贴出来是为了后来者。

echo -e '\xe8\xbe\x93\xe5\x85\xa5\xe9\xaa\x8c\xe8\xaf\x81\xe7\xa0\x81'

1 Like

少年,把这段弄出来算我输:

"\xffffffe4\xffffffbb\xffffffa5\xffffffe5\xffffff8f\xffffffaf\xffffffe5\xffffffae\xffffff83\xffffffe4\xffffffbf\xffffffa1\xffffffe7\xffffff9a\xffffff84\xffffffe6\xffffff9c\xffffff89\xffffffe5\xffffffae\xffffffb6\xffffffe7\xffffffb3\xffffffbb\xffffffe7\xffffff9c\xffffff8b\xffffffe7\xffffff9a\xffffff84\xffffffe7\xffffff94\xffffffa8\xffffffe7\xffffffbb\xffffffad\xffffffe7\xffffffbb\xffffffa7a"

多谢分享

我一般先写一个tweak 到 app 里面,再做其他的工作, hook 的是 UIViewController的 ViewDidLoad,在里面获取然后存到本地,这样就可以实时的查看当前的控制器

请问编辑cy文件有没有什么编辑器,方便使用的,你是用的什么,xcode吗

你是说xm吧,我用atom编辑器,有个addon支持logos语法:)

cy不就是js

感谢大神,我是想像写OC代码或者JS 代码一样,可以边写cycript脚本,还可以很方便的调试,我看了大都是在命令行里写一句句代码,然后使用,这样很不方便,有没有什么IDE或者工具,可以一遍调试,一遍写cycript脚本的。