首页
社区
课程
招聘
[注意]ndk编译器对“&”运算的一个坑
发表于: 2016-10-9 07:04 4718

[注意]ndk编译器对“&”运算的一个坑

2016-10-9 07:04
4718
我的本意是判断地址最低位是否为1来决定不同的处理方式
代码如下:
        int tmp = (int)pFuncstrstr;
        int change = ((int)pFuncstrstr) & 0xFFFFFFFE;
        printf("tmp & 0x1 = %d\r\n", tmp & 0x1);
        if(tmp & 0x1 != 0){
                printf("thumb pFuncstrstr:%p\r\n", pFuncstrstr);
                *(int*)change = 0x47f0; //thrumb blx lr
        }else{
                printf("arm pFuncstrstr:%p\r\n", pFuncstrstr);
                *(int*)change = 0xE12FFF3E;
        }

然后输出的效果如下:
tmp & 0x1 = 0
arm pFuncstrstr:0x400267b9
change:400267B8

这个结果让我很纠结,开始以为是没有push成功,试了几次后发现不是,然后用ida打开看了下,结果发现编译器直接把tmp & 0x1给替换成了0.
.text:0000860C loc_860C                                ; CODE XREF: .text:00008602j
.text:0000860C                 LDR             R0, =(aTmp0x1D - 0x8618)
.text:0000860E                 MOVS            R1, #0
.text:00008610                 BIC.W           R6, R5, #1
.text:00008614                 ADD             R0, PC  ; "tmp & 0x1 = %d\r\n"
.text:00008616                 BLX             printf

所以就想试试是不是只要看看是怎么回事,因为以前经常写的是没问题的。所以就尝试了一下:
        int ntest = (int)&socket;
        printf("ntest(%X) & 1 = %d\r\n", ntest, ntest & 1);

        printf("argc & 1 = %d\r\n", argc & 1);

然后汇编代码却是这个情况:
.text:00008758                 PUSH.W          {R4-R10,LR}
.text:0000875C                 MOV             R4, R0
.text:0000875E                 LDR.W           R10, =(__stack_chk_guard_ptr - 0x876C)
.text:00008762                 SUB             SP, SP, #0xF0
.text:00008764                 LDR             R0, =(aNtestX1D - 0x8774)
.text:00008766                 MOVS            R2, #0  ; 这里ntest & 1的值直接替换成了0
.text:00008768                 ADD             R10, PC ; __stack_chk_guard_ptr
.text:0000876A                 LDR.W           R10, [R10] ; __stack_chk_guard
.text:0000876E                 LDR             R1, =(socket_ptr - 0x877C)
.text:00008770                 ADD             R0, PC  ; "ntest(%X) & 1 = %d\r\n"
.text:00008772                 LDR             R5, =(aAndroid_log_te - 0x8780)
.text:00008774                 LDR.W           R3, [R10]
.text:00008778                 ADD             R1, PC ; socket_ptr
.text:0000877A                 LDR             R1, [R1] ; __imp_socket
.text:0000877C                 ADD             R5, PC  ; "android_log_test"
.text:0000877E                 STR             R3, [SP,#0x110+var_24]
.text:00008780                 BLX             printf
.text:00008784                 LDR             R0, =(aArgc1D - 0x878E)
.text:00008786                 AND.W           R1, R4, #1 ; 这里却进行了&运算
.text:0000878A                 ADD             R0, PC  ; "argc & 1 = %d\r\n"
.text:0000878C                 BLX             printf

不知道是不是只有我碰到了这种情况。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 7048
活跃值: (3527)
能力值: ( LV12,RANK:340 )
在线值:
发帖
回帖
粉丝
2
什么版本的NDK啊,感觉编译器不应该会出这种低级错误啊,是不是哪里弄错了。
2016-10-9 09:55
0
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
int tmp = (int)pFuncstrstr;
你先看看tmp
2016-10-9 10:53
0
雪    币: 2122
活跃值: (3854)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
4
android-ndk-r9d,我也不知道是哪里出了问题,配置文件是这样的,开了优化
Android.mk:
LOCAL_LDLIBS := -llog
LOCAL_CPPFLAGS := --std=c++11

LOCAL_C_INCLUDES += ${NDKROOT}/sources/cxx-stl/stlport/stlport

LOCAL_CFLAGS        := -O2 -ffunction-sections -fdata-sections
LOCAL_LDFLAGS        := -Wl,--gc-sections

LOCAL_CFLAGS := '-D_STLP_USE_NEWALLOC'

include $(BUILD_EXECUTABLE)
2016-10-9 18:53
0
雪    币: 2122
活跃值: (3854)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
5
单独看tmp的值就是正常的,下面那个就是我单独测试的时候写的,ntest的值它会却取值,但ntest & 1部分就直接替换成了0
2016-10-9 18:55
0
雪    币: 219
活跃值: (56)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
叼!耐性真好
2016-10-19 16:32
0
雪    币: 389
活跃值: (2662)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
if(tmp & 0x1 != 0){}   你这是不是少加了个括号 应该是if((tmp & 0x1) != 0){}  
“!=”的优先级比按位与“&”高
2023-7-8 10:23
1
雪    币: 29
活跃值: (5672)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8

pFuncstrstr是函数么,如果是你so内的函数,那么编译时编译器就能判断地址最后一位是否为1,例如thumb函数就为1,arm函数就为0等,因此会直接被优化掉,另外就是楼上说的,if那里漏括号了

最后于 2023-7-8 11:07 被不吃早饭编辑 ,原因:
2023-7-8 10:52
0
游客
登录 | 注册 方可回帖
返回
//