Commit 74316b18 authored by swift_gan's avatar swift_gan

Merge remote-tracking branch 'origin/master' into xposed_compat

parents c39baed1 ae558836
......@@ -92,8 +92,8 @@ namespace SandHook {
return (codeAddr & 0x1) == 0x1;
}
bool isThumb32(uint32_t code) {
return code >> 16 != 0;
bool isThumb32(uint16_t code) {
return ((code & 0xF000) == 0xF000) || ((code & 0xF800) == 0xE800);
}
void InstDecode::decode(void *codeStart, Size codeLen, InstVisitor *visitor) {
......@@ -103,13 +103,14 @@ namespace SandHook {
codeStart = Trampoline::getThumbCodeAddress(static_cast<Code>(codeStart));
Size codeAddr = reinterpret_cast<Size>(codeStart);
while (offset <= codeLen) {
uint16_t ram16 = *reinterpret_cast<uint16_t*>(codeAddr + offset);
uint32_t ram32 = *reinterpret_cast<uint32_t*>(codeAddr + offset);
if (isThumb32(ram32)) {
if (isThumb32(ram16)) {
//thumb32
inst = new InstThumb32(ram32);
} else {
//thumb16
inst = new InstThumb16(static_cast<uint16_t>(ram32));
inst = new InstThumb16(ram16);
}
if (!visitor->visit(inst, offset, codeLen)) {
delete inst;
......
......@@ -165,9 +165,7 @@ Java_com_swift_sandhook_SandHook_hookMethod(JNIEnv *env, jclass type, jobject or
}
if (SDK_INT >= ANDROID_P && BYTE_POINT == 4) {
isInlineHook = false;
} else if (origin->isAbstract()) {
if (origin->isAbstract()) {
isInlineHook = false;
} else if (!origin->isCompiled()) {
if (SDK_INT >= ANDROID_N) {
......
......@@ -6,6 +6,7 @@
#include "../includes/inst.h"
extern int SDK_INT;
#define SWITCH_SETX0 false
namespace SandHook {
......@@ -25,12 +26,23 @@ namespace SandHook {
public:
bool pcRelated = false;
bool canSafeBackup = true;
int instSize = 0;
bool visit(Inst *inst, Size offset, Size length) override {
instSize += inst->instLen();
if (inst->pcRelated()) {
pcRelated = true;
return false;
}
if (instSize > SIZE_DIRECT_JUMP_TRAMPOLINE) {
canSafeBackup = false;
}
return true;
}
};
......@@ -44,12 +56,12 @@ namespace SandHook {
}
}
//check pc relate inst
//check pc relate inst & backup inst len
PCRelatedCheckVisitor visitor;
InstDecode::decode(method->getQuickCodeEntry(), SIZE_DIRECT_JUMP_TRAMPOLINE, &visitor);
return !visitor.pcRelated;
return (!visitor.pcRelated) && visitor.canSafeBackup;
}
Code TrampolineManager::allocExecuteSpace(Size size) {
......@@ -103,7 +115,7 @@ namespace SandHook {
replacementHookTrampoline->setHookMethod(reinterpret_cast<Code>(hookMethod));
hookTrampoline->replacement = replacementHookTrampoline;
if (backupMethod != nullptr) {
if (SWITCH_SETX0 && backupMethod != nullptr) {
callOriginTrampoline = new CallOriginTrampoline();
checkThumbCode(callOriginTrampoline, getEntryCode(originMethod));
callOriginTrampoline->init();
......
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