山东001在线

 找回密码
 立即注册
搜索
查看: 393|回复: 0

[美女] 说一说:关于thumb2指令下函数运行地址对齐问题及验证2023/3/25 21:10:36

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-22 14:51
  • 签到天数: 341 天

    [LV.8]以坛为家I

    发表于 2023-3-25 21:10:35 | 显示全部楼层 |阅读模式

    近期,在分析T2指令的一个固件文件时,发现T2指令集下执行函数的运行地址不对齐游戏逆向的具体问题可以到我们网站了解一下,也有业内领域专业的客服为您解答问题,为成功合作打下一个良好的开端!



    于是,为了分析一下原因,找了手头上现有的一款基于C3内核的一块板子来际执行看一下,结合编译后的H文件,通过IDA来进一步验证一下T2运行地址不对其的现象。


    ************************************************


    操作示例:


    1、固件代码


    找了一个FRTOS的示例工程,加入几行打印函数地址的日志:





    2、通过2将编译后的H文件转成二进制文件


    执行情况:





    3、通过打开文件备用,如下





    4、通过K-IDE加载测试代码,如下:


    通过IDE调试后,板子之后在内部时序逻辑的控制下,将000000000地址的内容读取到SP;将0000000地址的内容读取到PC。此时SP中存放的是栈高地址,PC中存放的是R_H复位处理函数地址。








    5、通过IDAP加载上述第二步生成的文件,配置过程如下:








    通过在示例工程中的配置,来定义加载到IDA中的内存及存储映地址,如下:








    6、加载后如下:





    7、顺利找到程序入口地址:














    进而找到函数的执行地址,发现通过加载到寄存器时的地址为函数真正地址+1;通过,也可以验证,如下:








    通过资料了解到ARM指令是4字节对齐的,T-2指令是2字节对齐的,所以这里函数和函数D_S的地址应该是2字节对齐的,但是打印出来的值却是:000BB1和00D9。函数的地址和函数的地址都成了奇数地址了。


    这个问题在于有些ARM处理器即能使用ARM指令,又能兼容T指令,同一个应用程序中可能同时存在ARM指令和T指令,这两者的处理方式肯定是大不相同的,所以为了切换ARM状态和T状态,在跳转到T指令编写的代码块的时候,将程序地址的比较低位置1(因为不管是ARM指令还是T指令,都至少是2字节对齐的,所以比较低位一定是0,所以比较低位可以拿来用于区分ARM状态和T状态),这样处理器识别到比较低位为1的话就会切换到T状态,否则则是ARM状态。T2指令集也是为了兼容以前的ARM状态和T状态所以这样做的。


    所以编译器编译STM32F1的程序的时候,会把函数的真地址加上1作为常量放在ROM空间(如果这个函数的地址有被用到的话),获取函数的指针的时候就会获取到比较低位被置1的一个地址。如下图,获取D_S的地址的时候,到0000BC4地址处读取到了000D9的值,这其就是D_S的真地址000D8+1得到的。





    程序,打印出的日志如下:








    比较后,在中固件文件中也找到了相应的D_S函数的入口地址,际在中的地址也是+1的,如下图:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Archiver|山东001在线 ( ICP11027147 )

    GMT+8, 2025-10-27 03:44 , Processed in 0.041058 second(s), 19 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表