转到:http://BBS.pediy.com/showthread.PHP吗? p=1383668posted=1#post1383668
向后跳
001200F001F8bl.Lhelo
. Lhelo:
001805F0D1F7pld[r1,r5]
计算方法:
取上位f000,取下位11位=000
低位f801,低位11比特=001
计算:“00012”| (0011 )=2
该最高位符号位为0 .意味着向后方跳跃,所以保持该值2即可
然后计算出的目标地址是0x0012 4 2=0x0018
跳跃
00001164FFF7BEFFBL_Z4testv
_Z4testv
000010E407B5PUSH{R0-R2,LR}
计算方法:
取上位f7ff,取下位11位=7ff
取低位ffbe,取低位11比特=7be
计算: (7ff12 )|)|(7be1)=7fff7c
由于该最高有效位符号位为1意味着向前跳转,因此需要-1,相反的值为ff800084。 拿84就行了
然后,计算出的目标地址是0x1164 4-0x84=0x10e4
逆向过程:
标签
用BL指令得到的机器码算法:
offset=dstAddr-srcAddr;
offset=(offset-4 )0x007fffff;
high=offset12;
low=(offset0x00000fff ) 1;
machinecode=(0xff00|low ) 16 )|)|(0xF000|high );
BLXlabel
与BL相似,但计算机器码的算法略有不同
offset=dstAddr-srcAddr;
offset=(offset-4 )0x007fffff;
high=offset12;
low=(offset0x00000fff ) 1;
if(low%2!=0}{
行;
}
machinecode=(0xef00|low ) 16 )|)|(0xF000|high );