我的本意是判断地址最低位是否为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
不知道是不是只有我碰到了这种情况。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!