Commit 03d6721e authored by swift_gan's avatar swift_gan Committed by swift_gan

[NativeHook]fix ldr align of arm32

parent 71e2bf79
...@@ -57,6 +57,10 @@ void AssemblerA32::Mov(RegisterA32 &rd, U32 imm32) { ...@@ -57,6 +57,10 @@ void AssemblerA32::Mov(RegisterA32 &rd, U32 imm32) {
Movt(rd, immH); Movt(rd, immH);
} }
void AssemblerA32::Ldr(RegisterA32 &rt, Off offset) {
Emit(reinterpret_cast<Unit<Base>*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, offset)));
}
void AssemblerA32::Ldr(RegisterA32 &rt, Label *label) { void AssemblerA32::Ldr(RegisterA32 &rt, Label *label) {
Emit(reinterpret_cast<Unit<Base>*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, *label))); Emit(reinterpret_cast<Unit<Base>*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, *label)));
} }
......
...@@ -10,6 +10,11 @@ ...@@ -10,6 +10,11 @@
#include "inst_t16.h" #include "inst_t16.h"
#include "inst_t32.h" #include "inst_t32.h"
#define ALIGN_FOR_LDR \
if ((Addr) __ getPC() % 4 != 0) { \
__ Nop16(); \
}
using namespace SandHook::AsmA32; using namespace SandHook::AsmA32;
namespace SandHook { namespace SandHook {
...@@ -35,6 +40,8 @@ namespace SandHook { ...@@ -35,6 +40,8 @@ namespace SandHook {
void Mov(RegisterA32 &rd, U32 imm32); void Mov(RegisterA32 &rd, U32 imm32);
void Mov(RegisterA32 &rd, RegisterA32 &rm); void Mov(RegisterA32 &rd, RegisterA32 &rm);
void Ldr(RegisterA32 &rt, Off offset);
void Ldr(RegisterA32 &rt, Label* label); void Ldr(RegisterA32 &rt, Label* label);
void Ldrb(RegisterA32 &rt, Label* label); void Ldrb(RegisterA32 &rt, Label* label);
void Ldrh(RegisterA32 &rt, Label* label); void Ldrh(RegisterA32 &rt, Label* label);
......
...@@ -41,6 +41,7 @@ void *InlineHookArm32Android::inlineHook(void *origin, void *replace) { ...@@ -41,6 +41,7 @@ void *InlineHookArm32Android::inlineHook(void *origin, void *replace) {
#define __ assemblerInline. #define __ assemblerInline.
if (!changeMode) { if (!changeMode) {
Label *target_addr_label = new Label(); Label *target_addr_label = new Label();
ALIGN_FOR_LDR
__ Ldr(PC, target_addr_label); __ Ldr(PC, target_addr_label);
__ Emit(target_addr_label); __ Emit(target_addr_label);
__ Emit((Addr) replace); __ Emit((Addr) replace);
...@@ -55,8 +56,11 @@ void *InlineHookArm32Android::inlineHook(void *origin, void *replace) { ...@@ -55,8 +56,11 @@ void *InlineHookArm32Android::inlineHook(void *origin, void *replace) {
CodeRelocateA32 relocate = CodeRelocateA32(assemblerBackup); CodeRelocateA32 relocate = CodeRelocateA32(assemblerBackup);
backup = relocate.relocate(origin, codeContainerInline->size(), nullptr); backup = relocate.relocate(origin, codeContainerInline->size(), nullptr);
#define __ assemblerBackup. #define __ assemblerBackup.
__ Mov(IP ,(Addr) getThumbPC(reinterpret_cast<void *>((Addr)originCode + relocate.curOffset))); Label* origin_addr_label = new Label();
__ Bx(IP); ALIGN_FOR_LDR
__ Ldr(PC, origin_addr_label);
__ Emit(origin_addr_label);
__ Emit((Addr) getThumbPC(reinterpret_cast<void *>(reinterpret_cast<Addr>(originCode) + relocate.curOffset)));
__ finish(); __ finish();
#undef __ #undef __
...@@ -92,8 +96,11 @@ bool InlineHookArm32Android::breakPoint(void *origin, void (*callback)(REG *)) { ...@@ -92,8 +96,11 @@ bool InlineHookArm32Android::breakPoint(void *origin, void (*callback)(REG *)) {
CodeRelocateA32 relocate = CodeRelocateA32(assemblerBackup); CodeRelocateA32 relocate = CodeRelocateA32(assemblerBackup);
backup = relocate.relocate(origin, changeMode ? (4 * 2 + 2) : (4 * 2), nullptr); backup = relocate.relocate(origin, changeMode ? (4 * 2 + 2) : (4 * 2), nullptr);
#define __ assemblerBackup. #define __ assemblerBackup.
__ Mov(IP ,(Addr) getThumbPC(reinterpret_cast<void *>((Addr)originCode + relocate.curOffset))); Label* origin_addr_label = new Label();
__ Bx(IP); ALIGN_FOR_LDR
__ Ldr(PC, origin_addr_label);
__ Emit(origin_addr_label);
__ Emit((Addr) getThumbPC(reinterpret_cast<void *>(reinterpret_cast<Addr>(originCode) + relocate.curOffset)));
__ finish(); __ finish();
#undef __ #undef __
...@@ -106,6 +113,7 @@ bool InlineHookArm32Android::breakPoint(void *origin, void (*callback)(REG *)) { ...@@ -106,6 +113,7 @@ bool InlineHookArm32Android::breakPoint(void *origin, void (*callback)(REG *)) {
#define __ assemblerInline. #define __ assemblerInline.
if (!changeMode) { if (!changeMode) {
Label *target_addr_label = new Label(); Label *target_addr_label = new Label();
ALIGN_FOR_LDR
__ Ldr(PC, target_addr_label); __ Ldr(PC, target_addr_label);
__ Emit(target_addr_label); __ Emit(target_addr_label);
__ Emit((Addr) trampoline); __ Emit((Addr) trampoline);
......
...@@ -103,6 +103,7 @@ IMPL_RELOCATE(T16, B_COND) { ...@@ -103,6 +103,7 @@ IMPL_RELOCATE(T16, B_COND) {
if (inst->condition == al) { if (inst->condition == al) {
Label* target_label = new Label; Label* target_label = new Label;
ALIGN_FOR_LDR
__ Ldr(PC, target_label); __ Ldr(PC, target_label);
__ Emit(target_label); __ Emit(target_label);
__ Emit(targetAddr); __ Emit(targetAddr);
...@@ -113,6 +114,7 @@ IMPL_RELOCATE(T16, B_COND) { ...@@ -113,6 +114,7 @@ IMPL_RELOCATE(T16, B_COND) {
__ B(inst->condition, true_label); __ B(inst->condition, true_label);
__ B(false_label); __ B(false_label);
__ Emit(true_label); __ Emit(true_label);
ALIGN_FOR_LDR
__ Ldr(PC, target_label); __ Ldr(PC, target_label);
__ Emit(target_label); __ Emit(target_label);
__ Emit(targetAddr); __ Emit(targetAddr);
...@@ -131,6 +133,7 @@ IMPL_RELOCATE(T16, B) { ...@@ -131,6 +133,7 @@ IMPL_RELOCATE(T16, B) {
Addr targetAddr = inst->getImmPCOffsetTarget(); Addr targetAddr = inst->getImmPCOffsetTarget();
Label* target_label = new Label(); Label* target_label = new Label();
ALIGN_FOR_LDR
__ Ldr(PC, target_label); __ Ldr(PC, target_label);
__ Emit(target_label); __ Emit(target_label);
__ Emit((Addr) getThumbPC(reinterpret_cast<void *>(targetAddr))); __ Emit((Addr) getThumbPC(reinterpret_cast<void *>(targetAddr)));
...@@ -162,6 +165,7 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { ...@@ -162,6 +165,7 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) {
__ Emit(reinterpret_cast<Instruction<Base>*>(inst)); __ Emit(reinterpret_cast<Instruction<Base>*>(inst));
__ B(false_label); __ B(false_label);
__ Emit(true_label); __ Emit(true_label);
ALIGN_FOR_LDR
__ Ldr(PC, target_label); __ Ldr(PC, target_label);
__ Emit(target_label); __ Emit(target_label);
__ Emit((Addr) getThumbPC(reinterpret_cast<void *>(targetAddr))); __ Emit((Addr) getThumbPC(reinterpret_cast<void *>(targetAddr)));
......
...@@ -17,12 +17,13 @@ void *AndroidCodeBuffer::getBuffer(U32 size) { ...@@ -17,12 +17,13 @@ void *AndroidCodeBuffer::getBuffer(U32 size) {
Addr exeSpace = 0; Addr exeSpace = 0;
if (executeSpaceList.size() == 0) { if (executeSpaceList.size() == 0) {
goto label_alloc_new_space; goto label_alloc_new_space;
} else if (executePageOffset + size > currentExecutePageSize) { } else if (executePageOffset + size + 4> currentExecutePageSize) {
goto label_alloc_new_space; goto label_alloc_new_space;
} else { } else {
exeSpace = reinterpret_cast<Addr>(executeSpaceList.back()); exeSpace = reinterpret_cast<Addr>(executeSpaceList.back());
Addr retSpace = exeSpace + executePageOffset; //4 字节对齐
executePageOffset += size; Addr retSpace = RoundUp(exeSpace + executePageOffset, 4);
executePageOffset = retSpace + size - exeSpace;
return reinterpret_cast<void *>(retSpace); return reinterpret_cast<void *>(retSpace);
} }
label_alloc_new_space: label_alloc_new_space:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment