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指令如何跳转到无效指令仍能正常工作的主要内容,如果未能解决你的问题,请参考以下文章