BL指令如何跳转到无效指令仍能正常工作

Posted

技术标签:

【中文标题】BL指令如何跳转到无效指令仍能正常工作【英文标题】:How does BL instruction jump to invalid instruction still manage to work corretly 【发布时间】:2021-08-28 13:56:55 【问题描述】:

我正在练习对 il2cpp 统一项目进行逆向工程

我做过的事情:

获取apk 使用Apktool提取文件 用Ghidra打开libunity.so(或者IDA也可以)

我发现了一个有线指令块,例如:

        004ac818 f4 0f 1e f8     str        x20,[sp, #local_20]!
        004ac81c f3 7b 01 a9     stp        x19,x30,[sp, #local_10]
        004ac820 e1 03 1f 2a     mov        w1,wzr
        004ac824 77 b5 00 94     bl         FUN_004d9e00                                    

我关注bl FUN_004d9e00,我发现:

FUN_004d9e00

        004d9e00 6e              ??         6Eh    n
        004d9e01 97              ??         97h
        004d9e02 85              ??         85h
        004d9e03 60              ??         60h    `
        004d9e04 6d              ??         6Dh    m

但问题是,FUN_004d9e00 中的指令不是有效的。 libunity.so 怎么还能正常工作

【问题讨论】:

以后会填充内存吗?查找对该地址的其他引用。 我对这个领域完全陌生..您是否建议有一种方法可以在运行时覆盖现有代码或什么? 我的 RE 经验是使用恶意软件分析,而不是合法软件,但是当我看到一个内存区域被调用,并且内存区域包含垃圾时,可以在代码中的其他地方找到它函数的内存是在运行时填充的。是的,在代码开始运行后,其他一些代码可能正在写入该内存。检查保存函数的内存区域是否可写。 我不记得 Ghidra 中的快捷方式,但请它查找对 004d9e00 地址的引用。除非该地址是在运行时计算的,否则您可能能够找到写入发生的位置。 非常感谢,这很可能已经完成了,因为我正在尝试在一个被混淆的 il2cpp 统一项目上练习这个。顺便说一句,这并不违法,只是有人给我的作业,软件是他开发的 【参考方案1】:

也许地址 0x004ac824 有一个重定位符号?在这种情况下,链接器会在加载 libunity.so 时修改指令,最终会调用不同的地址(可能在不同的共享库中)。

【讨论】:

以上是关于BL指令如何跳转到无效指令仍能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

与基于51系列与基于ARM处理器的控制系统开发有何异同。

使用 gdb 跳转到下一个“指令”

arm为啥要分两种工作状态:arm和thumb

20145309信息安全系统设计基础第7周学习总结上

JNB, JBE, JGE, JLE指令

3.3-常用汇编指令