请问中文名的Class怎么Hook呢?

遇到一个dylib,里面做了混淆,类名和方法名都用了中文,Orz… 。于是,我建个dylib想Hook它们中的一个类,编译时,Logos不让过啊,Orz… 。就如下面的:

#import <UIKit/UIKit.h>
#import "Undercover.h"

 %hook 你丫的想HOOK我

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
     NSLog("--->>>>>>").
}

%end


__attribute__((constructor))

static void start(void) {

    NSLog(@"Undercover initializer started");

}

Xcode里提示Error ‘Dangling %end’ .

如果把类名「你丫的想HOOK我」换成个英文的类名是能编译的,可是我就是想Hook 「你丫的想HOOK我」这个类呢。

3 个赞

bc有个改过的theos资磁。
懒得再折腾一次theos的话自己用mshookmessage

1 个赞

谢谢,另辟蹊径,用#define解决了。

8 个赞

这可以

还有这种骚操作

厉害了.

厉害了大兄弟

这办法6

厉害,居然可以用#define解决,开始反思]#define的作用-.-

1 个赞


个人觉得还是尽量少依赖logos

其实,logos都会被转成MSHook的了,可以在.mm里看到。追求一下效率,用一下它无妨。

鉴于有同学私信我说 #define 了还是Hook不到。首先你要看看 log 里 MS:Notice:给了你什么提示。 #define可以帮你解决了编译期间提示的Error,但是并不就完事了。

#define CN_CLASS 你丫的想HOOK我

当你make或者Xcode Build时,theos或者iOSOpendev会帮你转成这个样子:

Class _logos_classCN_CLASS = objc_getClass("CN_CLASS");

而正确的应该转成这样才对:

Class _logos_classCN_CLASS = objc_getClass("你丫的想HOOK我");

所以需要手动改。像我这种懒鬼是用iOSOpendev的,所以直接在.mm文件里面改了,再把iosod --xcbp注释掉,以免它又覆盖了我的修改过的.mm文件,重新⌘+B就好。

至于方法名是中文名是不会造成这样的问题,自己看.mm就知道了。

至于纯用theos环境编译的,自己可以去看看theos源码,修改一下达到你的目的。或者,问问一楼的大神怎么折腾的。

3 个赞

有错,不能编辑,应该是注释掉iosod --xcbp-logos

另,.xm转成.mm是什么样,可以直接命令查看:

[path_to_theos]/bin/logos.pl file.xm

这种骚操作可以,有个问题是 iosod --xcbp 是做什么用的?求科普

签名、打包、安装、具体可以看我修改过的MonkeyDev

可以打开 iosod 看一下,它是个shell脚本,干什么事应该就是大神@AlongMonkey说的。

用iOSOpenDev的目的之一,就是因为Xcode可分Group。而theos得把源码文件都往一个文件夹塞, 要不编译时各种header file not found。源码多了就不好看了,太乱,如梗在喉。

或许theos Makefile里能配置吧,只是我太菜了。

好,围观一发,用过你写的抢红包,灰常好用~

如此说来 其实也不用写#define CN_CLASS 你丫的想HOOK我 随便编个classname 直接在.mm里批量替换就好