美文网首页
ios逆向日志--cast from pointer to sm

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

作者: 假_f89c | 来源:发表于2019-07-30 14:32 被阅读0次

    写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

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

    相关文章

      网友评论

          本文标题:ios逆向日志--cast from pointer to sm

          本文链接:https://www.haomeiwen.com/subject/pgcnrctx.html