遇到一个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 个赞
Zhang
#2
bc有个改过的theos资磁。
懒得再折腾一次theos的话自己用mshookmessage
1 个赞
etund
(etund)
#9
厉害,居然可以用#define解决,开始反思]#define的作用-.-
1 个赞
其实,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
splanet
(splanet)
#16
这种骚操作可以,有个问题是 iosod --xcbp 是做什么用的?求科普
签名、打包、安装、具体可以看我修改过的MonkeyDev
可以打开 iosod 看一下,它是个shell脚本,干什么事应该就是大神@AlongMonkey说的。
用iOSOpenDev的目的之一,就是因为Xcode可分Group。而theos得把源码文件都往一个文件夹塞, 要不编译时各种header file not found。源码多了就不好看了,太乱,如梗在喉。
或许theos Makefile里能配置吧,只是我太菜了。
zjjno
(zjjno)
#20
如此说来 其实也不用写#define CN_CLASS 你丫的想HOOK我 随便编个classname 直接在.mm里批量替换就好