ios逆向日志--cast from pointer to sm
写tweak插件时,用logify直接导出一个头文件到tweak.xm中 里面有一句为hook为:
- (void)closeFolderAnimated:(BOOL)arg1 withCompletion:(CDUnknownBlockType)arg2 { %log; %orig; }
make时,提示错误:
Tweak.xm:25:5553: error: unknown type name 'CDUnknownBlockType' 于是手动在tweak头部增加显示定义:typedef void (^CDUnknownBlockType)(void);
其实对此种变量类型也可以在tweak中直接改成id即可;
P.S.:
如果是类未定义,则在头增加类定义如:@class SBDockView;即可;
如果有好几个类及其方法都提示未定义,则可以在tweak的目录下创建一个头文件,然后在头文件中定义类及其方法,如:
@interface ClassName
{
}
- (void)methodName:(float)arg1;
@end
然后在tweak中import此头文件即可编译通过。
然后再make出现错误提示:
==> Compiling Tweak.xm (arm64)…
Tweak.xm:9:301: error: cast from pointer to smaller type 'unsigned int' loses
information
...withCompletion:0x%x]', self, arg1, (unsigned int)arg2); _logos_orig$_ung...
^~~~~~~~~~~~~~~~~~
/opt/theos/vendor/include/_Prefix/HBLog.h:12:73: note: expanded from macro
'HBLogDebug'
...HB_LO G_INTERNAL(6, kCFLogLevelNotice, 'DEBUG', __VA_ARGS__)
^~~~~~~~~~~
/opt/theos/vendor/include/_Prefix/HBLog.h:9:186: note: expanded from macro
'HB_LOG_INTERNAL'
...type, (__bridge CFStringRef)[NSString stringWithFormat:__VA_ARGS__]);
^~~~~~~~~~~
发现在armv7下make通过,而在arm64下就显示以上错误,根据错误提示,很明显是因为转化精度变小的原因。因为指针在64位OS下点有8个字节的空间,而int点有4个字节的空间,这时候将8字节的指针转化成4字节的int就会发生精度损耗。而指针在32位下上点4个字节空间的,所以在armv7下make通过,而在arm64下make出错。
而且从下面的错误中,可以进一步的了解到,是因为logify.pl的%log打印参数的问题,问题出在将第2个参数为void指针的值强制转成unsigned int而造成的。
这时如果不需要打印第2个参数,可以直接把%log注释掉,然后自行写一句打印第一个参数的语句即可。
或者自己改写log打印为:
NSLog(@'arg1=%d,arg2=%ld',arg1,(intptr_t)arg2);
或写成:
NSLog(@'arg1=%d,arg2=0x%x',arg1,(unsigned int)(size_t)arg2);
//加多一次 size_t 的类型转换,因为 size_t 跟指针的位数为一致的,而 size_t 转换到 int 不会报错
或者更直接点,将参数改成id,然后%@打印即可;
后面在逛iOSRE论坛时,发现有类似的问题;张总回答说可以在makefile中增加相应的CFLAGS来屏蔽此类编译警告错误:http://bbs.iosre.com/t/topic/5073
于是去搜索makefile中cflags的写法,以及这个-Wno-后的xxxx要填写什么。
makefile中的cflags写法应该为:tweakName_CFLAGS=XXXX
然后上面显示的这个错误是因为将64位的下8字节指针转到4字节int而导致的转换错误;于是搜索到:
-Wno-pointer-to-int-cast (C and Objective-C only) Suppress warnings from casts from a pointer to an integer type of a different size.
(来自:http://blog.csdn.net/hust_keven/article/details/8943909)
于是补充makefile内空为:
THEOS_DEVICE_IP=192.168.0.151
ARCHS=arm64
TARGET=iphone:latest:8.0
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = DockViewTweak
DockViewTweak_FILES = Tweak.xm
DockViewTweak_CFLAGS=-Wno-pointer-to-int-cast
然后满怀希望地make,结果发现错误依旧,ios逆向日志--cast wbrfrom wbrpointer wbrto wbrsmaller wbrtype wbr'unsigned wbrint' wbrloses wbrinformation
难道是:DockViewTweak_CFLAGS=-Wno-int-to-pointer-cast
不对,难道是DockViewTweak_CFLAGS+=-Wno-pointer-to-int-cast,或DockViewTweak_CFLAGS+=-Wno-int-to-pointer-cast
或者先DockViewTweak_CFLAGS-=-Werror,然后再DockViewTweak_CFLAGS+=-Wno-pointer-to-int-cast
.....
搜索了好久,各种修改,测试,发现还是不行。ios逆向日志--cast wbrfrom wbrpointer wbrto wbrsmaller wbrtype wbr'unsigned wbrint' wbrloses wbrinformation
最后没办法,直接去论坛发贴问张总了,然望能有个答案.....