我想弄清楚如何解决以下问题。我有两个具有相同功能的 ARM .SO 库(32 位和 64 位)。有一个返回 const char* 的方法,它在 ARM32 中看起来像这样:
.text:0006F264 PUSH {LR}
.text:0006F266 SUB SP, SP, #0xC
.text:0006F268 STR R0, [SP,#0x10+var_C]
.text:0006F26A LDR R3, =(dword_9A030 - 0x6F270)
.text:0006F26C ADD R3, PC ; dword_9A030
.text:0006F26E LDR.W R3, [R3,#(dword_9A250 - 0x9A030)]
.text:0006F272 LDR R0, [SP,#0x10+var_C]
.text:0006F274 BLX R3
.text:0006F276 MOV R3, R0
.text:0006F278 NOP
.text:0006F27A MOV R0, R3
.text:0006F27C ADD SP, SP, #0xC
.text:0006F27E LDR.W PC, [SP+4+var_4],#4
在 ARM64 中:
.text:0000000000079CAC SUB SP, SP, #0x20
.text:0000000000079CB0 STR X30, [SP,#0x20+var_20]
.text:0000000000079CB4 STR X0, [SP,#0x20+var_8]
.text:0000000000079CB8 ADRP X0, #dword_DE080@PAGE
.text:0000000000079CBC ADD X0, X0, #dword_DE080@PAGEOFF
.text:0000000000079CC0 LDR X1, [X0,#(qword_DE4C0 - 0xDE080)]
.text:0000000000079CC4 LDR X0, [SP,#0x20+var_8]
.text:0000000000079CC8 BLR X1
.text:0000000000079CCC NOP
.text:0000000000079CD0 LDR X30, [SP,#0x20+var_20]
.text:0000000000079CD4 ADD SP, SP, #0x20
.text:0000000000079CD8 RET
这是一个函数的 ASM 代码
const char* GetStatus ( const DetailsHandle obj )
此函数可以返回 3 个字符串值之一“abcd”、“kowewqzb”或“jvbrnbfghert”(作为 char*)。我希望它始终返回“kowewqzb”,而不管此函数中发生的调用如何,这会导致一大堆动态加载的函数。那我怎么能:
1)编写代码使其始终返回“kowewqzb”的地址(需要先将其放入内存中的某个位置)并且不进行任何其他调用(因此基本上除了SP操作之外的整个指令集都可以替换为其他说明
2)如果没有足够的空间让它直接在那里工作,我怎么能在不破坏现有代码的情况下注入一些新代码,.SO库中有没有合适的地方呢?例如,将 BL 放在一些未使用的区域(如何获得它们?)并在那里放置更多的代码片段。
理想情况下,如果这可以针对 ARM32 和 ARM64 进行概述,我会非常高兴。提前致谢!!!
