ios逆向日志--cast from pointer to sm

2019-07-30  本文已影响0人  假_f89c

写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

最后没办法,直接去论坛发贴问张总了,然望能有个答案.....

上一篇下一篇

猜你喜欢

热点阅读