From 21256c168a8cb525baac3f9f84317e70bc4890cf Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Thu, 27 Jun 2019 18:06:20 +0800 Subject: [PATCH 1/9] [Reconstitution]init --- app/build.gradle | 2 +- .../main/java/com/swift/sandhook/MyApp.java | 5 +- nativehook/CMakeLists.txt | 1 + nativehook/build.gradle | 2 +- .../arm/arm32/assembler/assembler_arm32.cpp | 6 +- .../archs/arm/arm32/decoder/decoder_arm32.cpp | 5 +- .../archs/arm/arm32/decoder/decoder_arm32.h | 3 +- .../cpp/archs/arm/arm32/hook/hook_arm32.cpp | 4 +- .../cpp/archs/arm/arm32/hook/hook_arm32.h | 4 +- .../cpp/archs/arm/arm32/inst/arm32_base.h | 19 +- .../cpp/archs/arm/arm32/inst/inst_arm32.cpp | 18 +- .../cpp/archs/arm/arm32/inst/inst_arm32.h | 15 +- .../archs/arm/arm32/inst/inst_code_arm32.h | 13 +- .../archs/arm/arm32/inst/inst_struct_a32.h | 8 +- .../archs/arm/arm32/inst/inst_struct_t16.h | 13 +- .../archs/arm/arm32/inst/inst_struct_t32.h | 7 +- .../cpp/archs/arm/arm32/inst/inst_t16.cpp | 180 ++--- .../main/cpp/archs/arm/arm32/inst/inst_t16.h | 141 ++-- .../cpp/archs/arm/arm32/inst/inst_t32.cpp | 148 ++-- .../main/cpp/archs/arm/arm32/inst/inst_t32.h | 52 +- .../archs/arm/arm32/register/register_arm32.h | 9 +- .../arm/arm32/register/register_list_arm32.h | 7 +- .../arm32/relocate/code_relocate_arm32.cpp | 66 +- .../arm/arm32/relocate/code_relocate_arm32.h | 7 +- .../arm/arm64/assembler/assembler_arm64.cpp | 36 +- .../arm/arm64/assembler/assembler_arm64.h | 15 +- .../archs/arm/arm64/decoder/decoder_arm64.cpp | 13 +- .../archs/arm/arm64/decoder/decoder_arm64.h | 10 +- .../cpp/archs/arm/arm64/hook/hook_arm64.cpp | 16 +- .../cpp/archs/arm/arm64/hook/hook_arm64.h | 19 +- .../cpp/archs/arm/arm64/inst/inst_arm64.cpp | 681 ++++++++---------- .../cpp/archs/arm/arm64/inst/inst_arm64.h | 448 +++++------- .../archs/arm/arm64/inst/inst_code_arm64.h | 9 +- .../arm/arm64/inst/inst_struct_aarch64.h | 9 +- .../arm/arm64/register/register_arm64.cpp | 4 +- .../archs/arm/arm64/register/register_arm64.h | 34 +- .../arm64/register/register_list_arm64.cpp | 2 +- .../arm/arm64/register/register_list_arm64.h | 9 +- .../arm64/relocate/code_relocate_arm64.cpp | 74 +- .../arm/arm64/relocate/code_relocate_arm64.h | 11 +- nativehook/src/main/cpp/archs/arm/arm_base.h | 53 +- .../src/main/cpp/archs/arm/shellcode_arm.h | 7 +- .../src/main/cpp/archs/x86/place_holder.h | 6 +- nativehook/src/main/cpp/asm/cpu.h | 5 +- nativehook/src/main/cpp/asm/data.h | 28 +- nativehook/src/main/cpp/asm/imme.h | 33 - nativehook/src/main/cpp/asm/instruction.h | 72 +- nativehook/src/main/cpp/asm/label.h | 36 +- .../src/main/cpp/asm/{memory.h => ram.h} | 5 +- nativehook/src/main/cpp/asm/register.h | 55 +- nativehook/src/main/cpp/asm/unit.h | 106 ++- .../src/main/cpp/assembler/assembler.cpp | 30 +- nativehook/src/main/cpp/buffer/code_buffer.h | 5 +- nativehook/src/main/cpp/decoder/decoder.cpp | 2 +- nativehook/src/main/cpp/elf/elf.cpp | 55 +- nativehook/src/main/cpp/includes/assembler.h | 9 +- nativehook/src/main/cpp/includes/base.h | 71 +- .../src/main/cpp/includes/code_relocate.h | 9 +- nativehook/src/main/cpp/includes/compiler.h | 7 +- nativehook/src/main/cpp/includes/decoder.h | 20 +- nativehook/src/main/cpp/includes/elf.h | 22 +- nativehook/src/main/cpp/includes/hook.h | 5 +- .../src/main/cpp/relocate/code_relocate.cpp | 2 +- nativehook/src/main/cpp/sandhook_native.cpp | 140 +++- nativehook/src/main/cpp/sandhook_native.h | 7 +- nativehook/src/main/cpp/utils/lock.h | 7 +- nativehook/src/main/cpp/utils/log.h | 7 +- nativehook/src/main/cpp/utils/platform.h | 7 +- settings.gradle | 2 +- 69 files changed, 1394 insertions(+), 1544 deletions(-) delete mode 100644 nativehook/src/main/cpp/asm/imme.h rename nativehook/src/main/cpp/asm/{memory.h => ram.h} (60%) diff --git a/app/build.gradle b/app/build.gradle index 4f02766a..a0a18cd7 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,7 +27,7 @@ dependencies { androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' implementation project(':hooklib') - //implementation project(':nativehook') + implementation project(':nativehook') implementation project(':xposedcompat') //implementation project(':xposedcompat_new') } diff --git a/app/src/main/java/com/swift/sandhook/MyApp.java b/app/src/main/java/com/swift/sandhook/MyApp.java index bc0dcae8..7e261b2c 100644 --- a/app/src/main/java/com/swift/sandhook/MyApp.java +++ b/app/src/main/java/com/swift/sandhook/MyApp.java @@ -5,6 +5,7 @@ import android.os.Build; import android.util.Log; +import com.swift.sandhook.nativehook.NativeHook; import com.swift.sandhook.test.TestClass; import com.swift.sandhook.testHookers.ActivityHooker; import com.swift.sandhook.testHookers.CtrHook; @@ -22,7 +23,7 @@ public class MyApp extends Application { - //if you want test Android Q, please set true, because SDK_INT of Android Q is still 28 + //if you want test Android Q, please Set true, because SDK_INT of Android Q is still 28 public final static boolean testAndroidQ = false; @Override @@ -36,6 +37,8 @@ public void onCreate() { SandHookConfig.SDK_INT = 29; } + NativeHook.test(); + SandHook.disableVMInline(); SandHook.tryDisableProfile(getPackageName()); SandHook.disableDex2oatInline(false); diff --git a/nativehook/CMakeLists.txt b/nativehook/CMakeLists.txt index 764adeed..ad2bbc38 100644 --- a/nativehook/CMakeLists.txt +++ b/nativehook/CMakeLists.txt @@ -71,6 +71,7 @@ include_directories( src/main/cpp/archs/arm/arm32/decoder src/main/cpp/archs/arm/arm32/hook src/main/cpp/archs/arm/arm32/relocate + src/main/cpp/antihook ) # Searches for a specified prebuilt library and stores the path as a diff --git a/nativehook/build.gradle b/nativehook/build.gradle index 839a63ff..fd4dea25 100644 --- a/nativehook/build.gradle +++ b/nativehook/build.gradle @@ -17,7 +17,7 @@ android { cmake { arguments '-DBUILD_TESTING=OFF' cppFlags "-frtti -fexceptions -Wpointer-arith" - abiFilters 'armeabi-v7a', 'arm64-v8a' + abiFilters 'arm64-v8a' } } } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp index 925804f4..6fcde175 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp @@ -146,7 +146,7 @@ void AssemblerA32::Add(RegisterA32 &rd, RegisterA32 &rn, RegisterA32 &rm) { } void AssemblerA32::Cmp(RegisterA32 &rd, RegisterA32 &rn) { - if (rd.getCode() < 8 && rn.getCode() < 8) { + if (rd.Code() < 8 && rn.Code() < 8) { Emit(reinterpret_cast*>(new INST_T16(CMP_REG)(rd, rn))); } else { Emit(reinterpret_cast*>(new INST_T16(CMP_REG_EXT)(rd, rn))); @@ -154,7 +154,7 @@ void AssemblerA32::Cmp(RegisterA32 &rd, RegisterA32 &rn) { } void AssemblerA32::Pop(RegisterA32 &rt) { - if (rt.getCode() < 8 || rt == PC) { + if (rt.Code() < 8 || rt == PC) { Emit(reinterpret_cast*>(new INST_T16(POP)(RegisterList(rt)))); } else { throw ErrorCodeException("error pop inst"); @@ -162,7 +162,7 @@ void AssemblerA32::Pop(RegisterA32 &rt) { } void AssemblerA32::Push(RegisterA32 &rt) { - if (rt.getCode() < 8 || rt == PC) { + if (rt.Code() < 8 || rt == PC) { Emit(reinterpret_cast*>(new INST_T16(PUSH)(RegisterList(rt)))); } else { throw ErrorCodeException("error pop inst"); diff --git a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp index 42dc3cac..a3ce7835 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp @@ -23,7 +23,8 @@ goto label_matched; \ Arm32Decoder* Arm32Decoder::instant = new Arm32Decoder(); -void Arm32Decoder::decode(void *codeStart, Addr codeLen, InstVisitor &visitor, bool onlyPcRelInst) { +void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) { bool thumb = isThumbCode(reinterpret_cast(codeStart)); if (thumb) { codeStart = getThumbCodeAddress(codeStart); @@ -74,7 +75,7 @@ void Arm32Decoder::decode(void *codeStart, Addr codeLen, InstVisitor &visitor, b if (!visitor.visit(unit, pc)) { break; } - pc = reinterpret_cast((Addr)pc + unit->size()); + pc = reinterpret_cast((Addr)pc + unit->Size()); unit = nullptr; } } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h index 4e440f1c..01fbdc37 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h @@ -12,7 +12,8 @@ namespace SandHook { class Arm32Decoder : public InstDecoder { public: - void decode(void *codeStart, Addr codeLen, InstVisitor &visitor, bool onlyPcRelInst) override; + void Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) override; public: static Arm32Decoder* instant; }; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp index 04588538..3a1f8b23 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp @@ -17,7 +17,7 @@ using namespace SandHook::Utils; #include "assembler_arm32.h" using namespace SandHook::RegistersA32; -void *InlineHookArm32Android::inlineHook(void *origin, void *replace) { +void *InlineHookArm32Android::InlineHook(void *origin, void *replace) { AutoLock lock(hookLock); void* originCode; @@ -73,7 +73,7 @@ void *InlineHookArm32Android::inlineHook(void *origin, void *replace) { IMPORT_SHELLCODE(BP_SHELLCODE) IMPORT_LABEL(callback_addr_s, Addr) IMPORT_LABEL(origin_addr_s, Addr) -bool InlineHookArm32Android::breakPoint(void *origin, void (*callback)(REG *)) { +bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) { AutoLock lock(hookLock); void* originCode; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h index 55b4c0ad..b1d41d52 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h @@ -18,9 +18,9 @@ namespace SandHook { inline ~InlineHookArm32Android() { delete hookLock; } - void *inlineHook(void *origin, void *replace) override; + void *InlineHook(void *origin, void *replace) override; - bool breakPoint(void *point, void (*callback)(REG *)) override; + bool BreakPoint(void *point, void (*callback)(REG *)) override; protected: std::mutex* hookLock; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h index 24c4f5f9..73178bfd 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h @@ -2,16 +2,15 @@ // Created by swift on 2019/5/16. // -#ifndef SANDHOOK_ARM32_BASE_H -#define SANDHOOK_ARM32_BASE_H +#pragma once #include #include "arm_base.h" #include "register_list_arm32.h" #include "instruction.h" -#define DECODE_OFFSET(bits, ext) signExtend32(bits + ext, COMBINE(get()->imm##bits, 0, ext)) -#define ENCODE_OFFSET(bits, ext) get()->imm##bits = TruncateToUint##bits(offset >> ext) +#define DECODE_OFFSET(bits, ext) SignExtend32(bits + ext, COMBINE(Get()->imm##bits, 0, ext)) +#define ENCODE_OFFSET(bits, ext) Get()->imm##bits = TruncateToUint##bits(offset >> ext) #define CODE_OFFSET(I) I->offset + (I->instType() == A32 ? 2 * 4 : 2 * 2) @@ -47,8 +46,8 @@ namespace SandHook { bool IsPostIndex() const { return addr_mode == PostIndex; } public: - RegisterA32* rn; // base - RegisterA32* rm; // register offset + RegisterA32* rn; // base_ + RegisterA32* rm; // register offset_ S32 offset; // valid if rm_ == no_reg Shift shift; Sign sign; @@ -126,10 +125,10 @@ namespace SandHook { private: static U16 RegisterToList(RegisterA32& reg) { - if (reg.getCode() == UnknowRegiser.getCode()) { + if (reg.Code() == UnknowRegiser.Code()) { return 0; } else { - return static_cast(UINT16_C(1) << reg.getCode()); + return static_cast(UINT16_C(1) << reg.Code()); } } @@ -165,6 +164,4 @@ namespace SandHook { std::ostream& operator<<(std::ostream& os, RegisterList registers); } -} - -#endif //SANDHOOK_ARM32_BASE_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp index f32e2beb..066cb315 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp @@ -8,7 +8,7 @@ //A64_STR_IMM::A64_STR_IMM() {} // //A64_STR_IMM::A64_STR_IMM(STRUCT_A64(STR_IMM) *inst) : InstructionA64(inst) { -// decode(inst); +// DisAssembler(inst); //} // //A64_STR_IMM::A64_STR_IMM(RegisterA64 &rt, const MemOperand &operand) : rt(&rt), operand(operand) {} @@ -17,11 +17,11 @@ // : condition(condition), rt(&rt), operand(operand) {} // //AddrMode A64_STR_IMM::decodeAddrMode() { -// if (get()->P == 1 && get()->W == 0) { +// if (Get()->P == 1 && Get()->W == 0) { // return Offset; -// } else if (get()->P == 0 && get()->W == 0) { +// } else if (Get()->P == 0 && Get()->W == 0) { // return PostIndex; -// } else if (get()->P == 1 && get()->W == 1) { +// } else if (Get()->P == 1 && Get()->W == 1) { // return PreIndex; // } else { // valid = false; @@ -29,20 +29,20 @@ // } //} // -//void A64_STR_IMM::decode(STRUCT_A64(STR_IMM) *inst) { +//void A64_STR_IMM::DisAssembler(STRUCT_A64(STR_IMM) *inst) { // imm32 = zeroExtend32(12, inst->imm12); // condition = Condition(inst->cond); -// operand.addr_mode = decodeAddrMode(); +// operand.addr_mode_ = decodeAddrMode(); // index = inst->P == 1; // wback = inst->P == 1 || inst->W == 0; // add = inst->U == 0; // rt = XReg(static_cast(inst->rt)); -// operand.base = XReg(static_cast(inst->rn)); -// operand.offset = add ? imm32 : -imm32; +// operand.base_ = XReg(static_cast(inst->rn)); +// operand.offset_ = add ? imm32 : -imm32; //} // // -//void A64_STR_IMM::assembler() { +//void A64_STR_IMM::Assembler() { // INST_DCHECK(condition, Condition::nv) // //} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h index cd0172fe..7c2f4bd1 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/12. // -#ifndef SANDHOOK_NH_INST_ARM32_H -#define SANDHOOK_NH_INST_ARM32_H +#pragma once namespace SandHook { @@ -20,16 +19,16 @@ namespace SandHook { // // DEFINE_IS_EXT(STR_IMM, TEST_INST_FIELD(opcode, OPCODE_A64(STR_IMM)) && TEST_INST_FIELD(unkown1_0, 0) && TEST_INST_FIELD(unkown2_0, 0)) // -// inline U32 instCode() override { +// inline U32 InstCode() override { // return STR_x; // } // -// void decode(STRUCT_A64(STR_IMM) *inst) override; +// void DisAssembler(STRUCT_A64(STR_IMM) *inst) override; // -// void assembler() override; +// void Assembler() override; // // AddrMode getAddrMode() { -// return operand.addr_mode; +// return operand.addr_mode_; // } // // private: @@ -46,6 +45,4 @@ namespace SandHook { // bool index; //}; } -} - -#endif //SANDHOOK_NH_INST_ARM32_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_code_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_code_arm32.h index 5737a538..bfccd633 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_code_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_code_arm32.h @@ -2,14 +2,13 @@ // Created by swift on 2019/5/16. // -#ifndef SANDHOOK_INST_CODE_ARM32_H -#define SANDHOOK_INST_CODE_ARM32_H +#pragma once -enum class InstCodeA32 { +enum class InstCodeA32 : InstCode { }; -enum class InstCodeT16 { +enum class InstCodeT16 : InstCode { UNKNOW, BASE_SASMC, DATA_PROC, @@ -33,7 +32,7 @@ enum class InstCodeT16 { ADD_REG_RDN }; -enum class InstCodeT32 { +enum class InstCodeT32 : InstCode { UNKNOW, B32, LDR_LIT, @@ -41,6 +40,4 @@ enum class InstCodeT32 { LDR_UIMM, MOV_MOVT_IMM, SUB_IMM, -}; - -#endif //SANDHOOK_INST_CODE_ARM32_H +}; \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_a32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_a32.h index d0fffc63..29490fd7 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_a32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_a32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/12. // -#ifndef SANDHOOK_NH_INST_STRUCT_ARM32_H -#define SANDHOOK_NH_INST_STRUCT_ARM32_H +#pragma once #include "instruction.h" @@ -26,7 +25,4 @@ DEFINE_STRUCT_A32(STR_IMM) { InstA64 P:1; InstA64 opcode:3; InstA64 cond:4; -}; - - -#endif //SANDHOOK_NH_INST_STRCUT_ARM32_H +}; \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t16.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t16.h index 12dc198f..1923806d 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t16.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t16.h @@ -2,9 +2,7 @@ // Created by swift on 2019/5/12. // -#ifndef SANDHOOK_NH_INST_STRUCT_T16_H -#define SANDHOOK_NH_INST_STRUCT_T16_H - +#pragma once #include "instruction.h" #include "inst_code_arm32.h" @@ -19,7 +17,7 @@ InstT16 opcode_base:w_base; -//Shift (immediate), add, subtract, move, and compare +//Shift (immediate_), add, subtract, Move, and compare //opcode_base == 0b00 DEFINE_OPCODE_T16(BASE_SASMC, 0b00) //Data-processing @@ -34,7 +32,7 @@ DEFINE_OPCODE_T16(MISC, 0b1011) #define T16_REG_WIDE 3 -//unknow inst +//Unknow inst DEFINE_STRUCT_T16(UNKNOW) { InstT16 raw; }; @@ -156,7 +154,4 @@ DEFINE_STRUCT_T16(PUSH) { InstT16 regs:8; InstT16 M:1; InstT16 opcode:7; -}; - - -#endif //SANDHOOK_NH_INST_STRUCT_T16_H +}; \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t32.h index aa648c5c..e4c86c7e 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_struct_t32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/12. // -#ifndef SANDHOOK_NH_INST_STRUCT_T32_H -#define SANDHOOK_NH_INST_STRUCT_T32_H +#pragma once #include "instruction.h" @@ -16,7 +15,7 @@ #define T32_REG_WIDE 4 -//unknow inst +//Unknow inst DEFINE_STRUCT_T32(UNKNOW) { InstT32 raw; }; @@ -96,5 +95,3 @@ DEFINE_STRUCT_T32(SUB_IMM) { InstT32 imm3:3; InstT32 opcode2:1; }; - -#endif //SANDHOOK_NH_INST_STRUCT_T32_H diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp index bb8cd398..f6c8362f 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp @@ -6,10 +6,10 @@ #include "arm32_base.h" #include "register_list_arm32.h" -#define SET_BASE_OPCODE(X) get()->opcode_base = OPCODE_T16(X) +#define SET_BASE_OPCODE(X) Get()->opcode_base = OPCODE_T16(X) -#define SET_OPCODE(X) get()->opcode = OPCODE_T16(X) -#define SET_OPCODE_MULTI(X, INDEX) get()->opcode##INDEX = OPCODE_T16(X##_##INDEX) +#define SET_OPCODE(X) Get()->opcode = OPCODE_T16(X) +#define SET_OPCODE_MULTI(X, INDEX) Get()->opcode##INDEX = OPCODE_T16(X##_##INDEX) using namespace SandHook::AsmA32; using namespace SandHook::RegistersA32; @@ -18,44 +18,44 @@ using namespace SandHook::RegistersA32; //Unknow T16_UNKNOW::T16_UNKNOW(STRUCT_T16(UNKNOW) &inst) : InstructionT16(&inst) { - decode(&inst); + Disassembler(&inst); } -void T16_UNKNOW::decode(T16_STRUCT_UNKNOW *inst) { +void T16_UNKNOW::Disassembler(T16_STRUCT_UNKNOW *inst) { inst_backup = *inst; } -void T16_UNKNOW::assembler() { - set(inst_backup); +void T16_UNKNOW::Assembler() { + Set(inst_backup); } //B T16_B::T16_B() {} T16_B::T16_B(T16_STRUCT_B *inst) : T16_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T16_B::T16_B(Off offset) : offset(offset) {} T16_B::T16_B(Label &label) { - bindLabel(label); + BindLabel(label); } -Off T16_B::getImmPCOffset() { +Off T16_B::GetImmPCOffset() { return DECODE_OFFSET(11, 1); } -void T16_B::decode(T16_STRUCT_B *inst) { - offset = getImmPCOffset(); +void T16_B::Disassembler(T16_STRUCT_B *inst) { + offset = GetImmPCOffset(); } -void T16_B::assembler() { +void T16_B::Assembler() { SET_OPCODE(B); DECODE_OFFSET(11, 1); } -void T16_B::onOffsetApply(Off offset) { +void T16_B::OnOffsetApply(Off offset) { this->offset = offset; DECODE_OFFSET(11, 1); } @@ -66,32 +66,32 @@ void T16_B::onOffsetApply(Off offset) { T16_B_COND::T16_B_COND() {} T16_B_COND::T16_B_COND(STRUCT_T16(B_COND) *inst) : T16_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T16_B_COND::T16_B_COND(Condition condition, Off offset) : condition(condition), offset(offset) {} T16_B_COND::T16_B_COND(Condition condition, Label &label) { - bindLabel(label); + BindLabel(label); } -void T16_B_COND::decode(STRUCT_T16(B_COND) *inst) { +void T16_B_COND::Disassembler(STRUCT_T16(B_COND) *inst) { DECODE_COND; - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void T16_B_COND::assembler() { +void T16_B_COND::Assembler() { SET_OPCODE(B_COND); ENCODE_COND; ENCODE_OFFSET(8, 1); } -void T16_B_COND::onOffsetApply(Off offset) { +void T16_B_COND::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(8, 1); } -Off T16_B_COND::getImmPCOffset() { +Off T16_B_COND::GetImmPCOffset() { return DECODE_OFFSET(8, 1); } @@ -101,15 +101,15 @@ Off T16_B_COND::getImmPCOffset() { T16_BX_BLX::T16_BX_BLX(T16_BX_BLX::OP op, RegisterA32 &rm) : op(op), rm(&rm) {} T16_BX_BLX::T16_BX_BLX(T16_STRUCT_BX_BLX *inst) : T16_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } -void T16_BX_BLX::decode(STRUCT_T16(BX_BLX) *inst) { +void T16_BX_BLX::Disassembler(STRUCT_T16(BX_BLX) *inst) { DECODE_OP; DECODE_RM(Reg); } -void T16_BX_BLX::assembler() { +void T16_BX_BLX::Assembler() { SET_OPCODE_MULTI(BX_BLX, 1); SET_OPCODE_MULTI(BX_BLX, 2); ENCODE_OP; @@ -119,7 +119,7 @@ void T16_BX_BLX::assembler() { //CBZ CBNZ T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_STRUCT_CBZ_CBNZ *inst) : T16_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_CBZ_CBNZ::OP op, Off offset, RegisterA32 &rn) : op(op), offset(offset), @@ -128,22 +128,22 @@ T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_CBZ_CBNZ::OP op, Off offset, RegisterA32 &rn) : o T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_CBZ_CBNZ::OP op, Label& label, RegisterA32 &rn) : op(op), rn(&rn) { - bindLabel(label); + BindLabel(label); } -Off T16_CBZ_CBNZ::getImmPCOffset() { - return COMBINE(get()->i, get()->imm5, 5) << 2; +Off T16_CBZ_CBNZ::GetImmPCOffset() { + return COMBINE(Get()->i, Get()->imm5, 5) << 2; } -void T16_CBZ_CBNZ::decode(T16_STRUCT_CBZ_CBNZ *inst) { - offset = getImmPCOffset(); +void T16_CBZ_CBNZ::Disassembler(T16_STRUCT_CBZ_CBNZ *inst) { + offset = GetImmPCOffset(); DECODE_RN(Reg); DECODE_OP; } -void T16_CBZ_CBNZ::assembler() { +void T16_CBZ_CBNZ::Assembler() { SET_OPCODE_MULTI(CBZ_CBNZ, 1); SET_OPCODE_MULTI(CBZ_CBNZ, 2); SET_OPCODE_MULTI(CBZ_CBNZ, 3); @@ -152,7 +152,7 @@ void T16_CBZ_CBNZ::assembler() { ENCODE_OFFSET(5, 2); } -void T16_CBZ_CBNZ::onOffsetApply(Off offset) { +void T16_CBZ_CBNZ::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(5, 2); } @@ -160,32 +160,32 @@ void T16_CBZ_CBNZ::onOffsetApply(Off offset) { //LDR_LIT T16_LDR_LIT::T16_LDR_LIT(T16_STRUCT_LDR_LIT *inst) : T16_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T16_LDR_LIT::T16_LDR_LIT(Off offset, RegisterA32 &rt) : offset(offset), rt(&rt) { } -Off T16_LDR_LIT::getImmPCOffset() { - return get()->imm8 << 2; +Off T16_LDR_LIT::GetImmPCOffset() { + return Get()->imm8 << 2; } -Addr T16_LDR_LIT::getImmPCOffsetTarget() { +Addr T16_LDR_LIT::GetImmPCOffsetTarget() { return ALIGN((Addr) getPC() + offset, 4); } -void T16_LDR_LIT::onOffsetApply(Off offset) { +void T16_LDR_LIT::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(8, 2); } -void T16_LDR_LIT::decode(T16_STRUCT_LDR_LIT *inst) { +void T16_LDR_LIT::Disassembler(T16_STRUCT_LDR_LIT *inst) { DECODE_RT(Reg); - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void T16_LDR_LIT::assembler() { +void T16_LDR_LIT::Assembler() { SET_OPCODE(LDR_LIT); ENCODE_RT; ENCODE_OFFSET(8, 2); @@ -194,22 +194,22 @@ void T16_LDR_LIT::assembler() { //ADD IMM RD = RN T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(T16_STRUCT_ADD_IMM_RDN *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(RegisterA32 *rdn, U8 imm8) : rdn(rdn), imm8(imm8) {} -void T16_ADD_IMM_RDN::decode(T16_STRUCT_ADD_IMM_RDN *inst) { +void T16_ADD_IMM_RDN::Disassembler(T16_STRUCT_ADD_IMM_RDN *inst) { rdn = Reg(inst->rdn); imm8 = inst->imm8; } -void T16_ADD_IMM_RDN::assembler() { +void T16_ADD_IMM_RDN::Assembler() { SET_OPCODE(ADD_IMM_RDN); - get()->imm8 = imm8; - get()->rdn = rdn->getCode(); + Get()->imm8 = imm8; + Get()->rdn = rdn->Code(); } @@ -217,56 +217,56 @@ void T16_ADD_IMM_RDN::assembler() { //ADR T16_ADR::T16_ADR(T16_STRUCT_ADR *inst) : T16_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T16_ADR::T16_ADR(RegisterA32 &rd, Off offset) : rd(&rd), offset(offset) {} T16_ADR::T16_ADR(RegisterA32 &rd, Label &label) : rd(&rd) { - bindLabel(label); + BindLabel(label); } -Off T16_ADR::getImmPCOffset() { - return COMBINE(get()->imm8, 0 ,2); +Off T16_ADR::GetImmPCOffset() { + return COMBINE(Get()->imm8, 0 ,2); } -Addr T16_ADR::getImmPCOffsetTarget() { +Addr T16_ADR::GetImmPCOffsetTarget() { return RoundDown((Addr) getPC() + offset, 4); } -void T16_ADR::onOffsetApply(Off offset) { +void T16_ADR::OnOffsetApply(Off offset) { this->offset = offset; - get()->imm8 = (U32)offset >> 2; + Get()->imm8 = (U32)offset >> 2; } -void T16_ADR::decode(T16_STRUCT_ADR *inst) { - offset = getImmPCOffset(); +void T16_ADR::Disassembler(T16_STRUCT_ADR *inst) { + offset = GetImmPCOffset(); DECODE_RD(Reg); } -void T16_ADR::assembler() { +void T16_ADR::Assembler() { SET_OPCODE(ADR); ENCODE_RD; - get()->imm8 = (U32)offset >> 2; + Get()->imm8 = (U32)offset >> 2; } T16_CMP_REG::T16_CMP_REG() {} T16_CMP_REG::T16_CMP_REG(T16_STRUCT_CMP_REG *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_CMP_REG::T16_CMP_REG(RegisterA32 &rm, RegisterA32 &rn) : rm(&rm), rn(&rn) {} -void T16_CMP_REG::decode(T16_STRUCT_CMP_REG *inst) { +void T16_CMP_REG::Disassembler(T16_STRUCT_CMP_REG *inst) { DECODE_RM(Reg); DECODE_RN(Reg); } -void T16_CMP_REG::assembler() { +void T16_CMP_REG::Assembler() { SET_BASE_OPCODE(DATA_PROC); SET_OPCODE(CMP_REG); ENCODE_RM; @@ -277,24 +277,24 @@ void T16_CMP_REG::assembler() { //MOV REG T16_MOV_REG::T16_MOV_REG(T16_STRUCT_MOV_REG *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_MOV_REG::T16_MOV_REG(RegisterA32 &rd, RegisterA32 &rm) : rm(&rm), rd(&rd) { } -void T16_MOV_REG::decode(T16_STRUCT_MOV_REG *inst) { +void T16_MOV_REG::Disassembler(T16_STRUCT_MOV_REG *inst) { DECODE_RM(Reg); rd = Reg(static_cast(COMBINE(inst->D, inst->rd, 3))); } -void T16_MOV_REG::assembler() { +void T16_MOV_REG::Assembler() { SET_BASE_OPCODE(DATA_PROC); SET_OPCODE(MOV_REG); ENCODE_RM; - get()->rd = BITS(rd->getCode(), 0, 2); - get()->D = BIT(rd->getCode(), 3); + Get()->rd = BITS(rd->Code(), 0, 2); + Get()->D = BIT(rd->Code(), 3); } bool T16_MOV_REG::pcRelate() { @@ -306,23 +306,23 @@ bool T16_MOV_REG::pcRelate() { T16_ADD_REG::T16_ADD_REG() {} T16_ADD_REG::T16_ADD_REG(T16_STRUCT_ADD_REG *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_ADD_REG::T16_ADD_REG(RegisterA32 *rd, RegisterA32 *rn, RegisterA32 *rm) : rd(rd), rn(rn), rm(rm) {} -void T16_ADD_REG::decode(T16_STRUCT_ADD_REG *inst) { +void T16_ADD_REG::Disassembler(T16_STRUCT_ADD_REG *inst) { DECODE_RD(Reg); DECODE_RN(Reg); DECODE_RM(Reg); } -void T16_ADD_REG::assembler() { +void T16_ADD_REG::Assembler() { SET_OPCODE(ADD_REG); - INST_ASSERT(rd->getCode() > 7); - INST_ASSERT(rn->getCode() > 7); - INST_ASSERT(rm->getCode() > 7); + INST_ASSERT(rd->Code() > 7); + INST_ASSERT(rn->Code() > 7); + INST_ASSERT(rm->Code() > 7); ENCODE_RD; ENCODE_RN; ENCODE_RM; @@ -331,65 +331,65 @@ void T16_ADD_REG::assembler() { T16_CMP_REG_EXT::T16_CMP_REG_EXT(T16_STRUCT_CMP_REG_EXT *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_CMP_REG_EXT::T16_CMP_REG_EXT(RegisterA32 &rn, RegisterA32 &rm) : rn(&rn), rm(&rm) {} -void T16_CMP_REG_EXT::decode(T16_STRUCT_CMP_REG_EXT *inst) { +void T16_CMP_REG_EXT::Disassembler(T16_STRUCT_CMP_REG_EXT *inst) { rn = Reg(COMBINE(inst->N, inst->rn, 3)); DECODE_RM(Reg); } -void T16_CMP_REG_EXT::assembler() { +void T16_CMP_REG_EXT::Assembler() { SET_OPCODE(CMP_REG_EXT); ENCODE_RM; - get()->rn = BITS(rn->getCode(), 0, 2); - get()->N = BIT(rn->getCode(), 3); + Get()->rn = BITS(rn->Code(), 0, 2); + Get()->N = BIT(rn->Code(), 3); } //POP T16_POP::T16_POP(T16_STRUCT_POP *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_POP::T16_POP(const RegisterList ®isterList) : registerList(registerList) {} -void T16_POP::decode(T16_STRUCT_POP *inst) { +void T16_POP::Disassembler(T16_STRUCT_POP *inst) { registerList.SetList(COMBINE(inst->P << 7, inst->regs, 8)); } -void T16_POP::assembler() { +void T16_POP::Assembler() { SET_OPCODE(POP); U16 regs = registerList.GetList(); - get()->regs = BITS(regs, 0, 7); - get()->P = BIT(regs, 15); + Get()->regs = BITS(regs, 0, 7); + Get()->P = BIT(regs, 15); } //PUSH T16_PUSH::T16_PUSH(T16_STRUCT_PUSH *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_PUSH::T16_PUSH(const RegisterList ®isterList) : registerList(registerList) {} -void T16_PUSH::decode(T16_STRUCT_PUSH *inst) { +void T16_PUSH::Disassembler(T16_STRUCT_PUSH *inst) { registerList.SetList(COMBINE(inst->M << 6, inst->regs, 8)); } -void T16_PUSH::assembler() { +void T16_PUSH::Assembler() { SET_OPCODE(PUSH); U16 regs = registerList.GetList(); - get()->regs = BITS(regs, 0, 7); - get()->M = BIT(regs, 14); + Get()->regs = BITS(regs, 0, 7); + Get()->M = BIT(regs, 14); } -// Add reg rdn T2 +// Add reg_ rdn T2 T16_ADD_REG_RDN::T16_ADD_REG_RDN(T16_STRUCT_ADD_REG_RDN *inst) : InstructionT16(inst) { - decode(inst); + Disassembler(inst); } T16_ADD_REG_RDN::T16_ADD_REG_RDN(RegisterA32 &rdn, RegisterA32 &rm) : rdn(&rdn), rm(&rm) {} @@ -398,13 +398,13 @@ bool T16_ADD_REG_RDN::pcRelate() { return *rm == PC; } -void T16_ADD_REG_RDN::decode(T16_STRUCT_ADD_REG_RDN *inst) { +void T16_ADD_REG_RDN::Disassembler(T16_STRUCT_ADD_REG_RDN *inst) { DECODE_RM(Reg); rdn = Reg(inst->rdn); } -void T16_ADD_REG_RDN::assembler() { +void T16_ADD_REG_RDN::Assembler() { SET_OPCODE(ADD_REG_RDN); ENCODE_RM; - get()->rdn = rdn->getCode(); + Get()->rdn = rdn->Code(); } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h index 8869b963..7a4b81e9 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/16. // -#ifndef SANDHOOK_INST_T16_H -#define SANDHOOK_INST_T16_H +#pragma once #include "arm_base.h" #include "register_list_arm32.h" @@ -13,10 +12,10 @@ #define INST_T16(X) T16_##X -#define IS_OPCODE_T16(RAW, OP) INST_T16(OP)::is(RAW) +#define IS_OPCODE_T16(RAW, OP) INST_T16(OP)::Is(RAW) #define DEFINE_IS_EXT(X, COND) \ -inline static bool is(InstT16& inst) { \ +inline static bool Is(InstT16& inst) { \ union { \ InstT16 raw; \ STRUCT_T16(X) inst; \ @@ -44,62 +43,52 @@ namespace SandHook { namespace AsmA32 { - template - class InstructionT16 : public Instruction { + template + class InstructionT16 : public Instruction { public: InstructionT16() {} - InstructionT16(Inst *inst) : Instruction(inst) {} + InstructionT16(void *inst) : Instruction(inst) {} - Inst mask(Inst raw) { - return raw & *(this->get()); - } - - U32 size() override { + INLINE U32 Size() override { return 2; } - void *getPC() override { - return reinterpret_cast((Addr) Instruction::getPC() + 2 * 2); - } - - Addr getVPC() override { - return Instruction::getVPC() + 2 * 2; + INLINE void *GetPC() override { + return reinterpret_cast((Addr) Instruction::GetPC() + 2 * 2); } - static inline S32 signExtend32(unsigned int bits, U32 value) { - return ExtractSignedBitfield32(bits - 1, 0, value); + INLINE Addr GetVPC() override { + return Instruction::GetVPC() + 2 * 2; } - InstType instType() override { + INLINE InstType InstType() override { return thumb16; } - Arch arch() override { + INLINE Arch Arch() override { return arm32; } }; - template - class T16_INST_PC_REL : public InstructionT16 { + template + class T16_INST_PC_REL : public InstructionT16 { public: - T16_INST_PC_REL() {}; + T16_INST_PC_REL(void *inst) : InstructionT16(inst) {}; - T16_INST_PC_REL(Inst *inst) : InstructionT16(inst) {}; - - virtual Off getImmPCOffset() { + INLINE virtual Off GetImmPCOffset() { return 0; }; - virtual Addr getImmPCOffsetTarget() { - return (Addr) this->getPC() + getImmPCOffset(); + INLINE virtual Addr GetImmPCOffsetTarget() { + return (Addr) this->GetPC() + GetImmPCOffset(); }; - inline bool pcRelate() override { + INLINE bool PcRelate() override { return true; }; @@ -111,15 +100,13 @@ namespace SandHook { T16_UNKNOW(STRUCT_T16(UNKNOW) &inst); - DEFINE_INST_CODE(UNKNOW) - inline bool unknow() override { return true; } - void decode(T16_STRUCT_UNKNOW *inst) override; + void Disassembler(T16_STRUCT_UNKNOW *inst) override; - void assembler() override; + void Assembler() override; private: STRUCT_T16(UNKNOW) inst_backup; @@ -140,13 +127,13 @@ namespace SandHook { DEFINE_INST_CODE(B) - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void decode(STRUCT_T16(B) *inst) override; + void Disassembler(STRUCT_T16(B) *inst) override; - void assembler() override; + void Assembler() override; public: Off offset; @@ -167,13 +154,13 @@ namespace SandHook { DEFINE_INST_CODE(B_COND) - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - void decode(STRUCT_T16(B_COND) *inst) override; + void Disassembler(STRUCT_T16(B_COND) *inst) override; - void assembler() override; + void Assembler() override; public: Condition condition; @@ -197,9 +184,9 @@ namespace SandHook { DEFINE_INST_CODE(BX_BLX) - void decode(T16_STRUCT_BX_BLX *inst) override; + void Disassembler(T16_STRUCT_BX_BLX *inst) override; - void assembler() override; + void Assembler() override; public: OP op; @@ -226,13 +213,13 @@ namespace SandHook { DEFINE_INST_CODE(CBZ_CBNZ) - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void decode(T16_STRUCT_CBZ_CBNZ *inst) override; + void Disassembler(T16_STRUCT_CBZ_CBNZ *inst) override; - void assembler() override; + void Assembler() override; public: OP op; @@ -251,15 +238,15 @@ namespace SandHook { DEFINE_INST_CODE(LDR_LIT) - Addr getImmPCOffsetTarget() override; + Addr GetImmPCOffsetTarget() override; - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - void decode(T16_STRUCT_LDR_LIT *inst) override; + void Disassembler(T16_STRUCT_LDR_LIT *inst) override; - void assembler() override; + void Assembler() override; public: Off offset; @@ -277,9 +264,9 @@ namespace SandHook { DEFINE_INST_CODE(ADD_IMM_RDN) - void decode(T16_STRUCT_ADD_IMM_RDN *inst) override; + void Disassembler(T16_STRUCT_ADD_IMM_RDN *inst) override; - void assembler() override; + void Assembler() override; public: RegisterA32 *rdn; @@ -299,15 +286,15 @@ namespace SandHook { DEFINE_INST_CODE(ADR) - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - Addr getImmPCOffsetTarget() override; + Addr GetImmPCOffsetTarget() override; - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - void decode(T16_STRUCT_ADR *inst) override; + void Disassembler(T16_STRUCT_ADR *inst) override; - void assembler() override; + void Assembler() override; public: RegisterA32 *rd; @@ -328,9 +315,9 @@ namespace SandHook { DEFINE_IS_EXT(CMP_REG, TEST_INST_FIELD(opcode_base, OPCODE_T16(DATA_PROC)) && TEST_INST_FIELD(opcode, OPCODE_T16(CMP_REG))) - void decode(T16_STRUCT_CMP_REG *inst) override; + void Disassembler(T16_STRUCT_CMP_REG *inst) override; - void assembler() override; + void Assembler() override; public: RegisterA32 *rm; @@ -350,9 +337,9 @@ namespace SandHook { DEFINE_IS_EXT(MOV_REG, TEST_INST_FIELD(opcode_base, OPCODE_T16(DATA_PROC)) && TEST_INST_FIELD(opcode, OPCODE_T16(MOV_REG))) - void decode(T16_STRUCT_MOV_REG *inst) override; + void Disassembler(T16_STRUCT_MOV_REG *inst) override; - void assembler() override; + void Assembler() override; bool pcRelate() override; @@ -374,9 +361,9 @@ namespace SandHook { DEFINE_INST_CODE(ADD_REG) - void decode(T16_STRUCT_ADD_REG *inst) override; + void Disassembler(T16_STRUCT_ADD_REG *inst) override; - void assembler() override; + void Assembler() override; public: RegisterA32 *rd; @@ -396,9 +383,9 @@ namespace SandHook { DEFINE_INST_CODE(CMP_REG_EXT) - void decode(T16_STRUCT_CMP_REG_EXT *inst) override; + void Disassembler(T16_STRUCT_CMP_REG_EXT *inst) override; - void assembler() override; + void Assembler() override; public: @@ -417,9 +404,9 @@ namespace SandHook { DEFINE_INST_CODE(POP) - void decode(T16_STRUCT_POP *inst) override; + void Disassembler(T16_STRUCT_POP *inst) override; - void assembler() override; + void Assembler() override; public: RegisterList registerList; @@ -436,9 +423,9 @@ namespace SandHook { DEFINE_INST_CODE(PUSH) - void decode(T16_STRUCT_PUSH *inst) override; + void Disassembler(T16_STRUCT_PUSH *inst) override; - void assembler() override; + void Assembler() override; public: RegisterList registerList; @@ -459,9 +446,9 @@ namespace SandHook { bool pcRelate() override; - void decode(T16_STRUCT_ADD_REG_RDN *inst) override; + void Disassembler(T16_STRUCT_ADD_REG_RDN *inst) override; - void assembler() override; + void Assembler() override; public: RegisterA32* rdn; @@ -475,6 +462,4 @@ namespace SandHook { #undef DEFINE_IS #undef TEST_INST_FIELD #undef TEST_INST_OPCODE -#undef DEFINE_INST_CODE - -#endif //SANDHOOK_INST_T16_H +#undef DEFINE_INST_CODE \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp index eeb09f2d..6432f8b8 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp @@ -6,10 +6,10 @@ #include "inst_struct_t32.h" -#define SET_BASE_OPCODE(X) get()->opcode_base = OPCODE_T32(X) +#define SET_BASE_OPCODE(X) Get()->opcode_base = OPCODE_T32(X) -#define SET_OPCODE(X) get()->opcode = OPCODE_T32(X) -#define SET_OPCODE_MULTI(X, INDEX) get()->opcode##INDEX = OPCODE_T32(X##_##INDEX) +#define SET_OPCODE(X) Get()->opcode = OPCODE_T32(X) +#define SET_OPCODE_MULTI(X, INDEX) Get()->opcode##INDEX = OPCODE_T32(X##_##INDEX) using namespace SandHook::Asm; using namespace SandHook::AsmA32; @@ -19,78 +19,78 @@ using namespace SandHook::AsmA32; //Unknow T32_UNKNOW::T32_UNKNOW(STRUCT_T32(UNKNOW) &inst) : InstructionT32(&inst) { - decode(&inst); + Disassembler(&inst); } -void T32_UNKNOW::decode(T32_STRUCT_UNKNOW *inst) { +void T32_UNKNOW::Disassembler(T32_STRUCT_UNKNOW *inst) { inst_backup = *inst; } -void T32_UNKNOW::assembler() { - set(inst_backup); +void T32_UNKNOW::Assembler() { + Set(inst_backup); } T32_B32::T32_B32(T32_STRUCT_B32 *inst) : T32_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T32_B32::T32_B32(T32_B32::OP op, T32_B32::X x, Off offset) : op(op), x(x), offset(offset) {} T32_B32::T32_B32(T32_B32::OP op, T32_B32::X x, Label &label) : op(op), x(x) { - bindLabel(label); + BindLabel(label); } -Off T32_B32::getImmPCOffset() { - U32 S = get()->S; - U32 imm21 = COMBINE(get()->imm10, get()->imm11, 11); - if (get()->X == 0 && op == BL) { +Off T32_B32::GetImmPCOffset() { + U32 S = Get()->S; + U32 imm21 = COMBINE(Get()->imm10, Get()->imm11, 11); + if (Get()->X == 0 && op == BL) { imm21 &= ~(1 << 0); } - U32 i1 = !(get()->J1 ^ S); - U32 i2 = !(get()->J2 ^ S); + U32 i1 = !(Get()->J1 ^ S); + U32 i2 = !(Get()->J2 ^ S); U32 i1i2 = COMBINE(i1, i2, 1); U32 Si1i2 = COMBINE(-S, i1i2, 2); - return signExtend32(25, COMBINE(Si1i2, imm21, 21) << 1); + return SignExtend32(25, COMBINE(Si1i2, imm21, 21) << 1); } -void T32_B32::decode(T32_STRUCT_B32 *inst) { +void T32_B32::Disassembler(T32_STRUCT_B32 *inst) { DECODE_OP; x = X(inst->X); - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void T32_B32::assembler() { +void T32_B32::Assembler() { SET_OPCODE(B32); ENCODE_OP; - get()->X = x; + Get()->X = x; U32 imm24 = TruncateToUint25(offset) >> 1; - get()->imm11 = BITS(imm24, 0, 10); - get()->imm10 = BITS(imm24, 11, 20); - if (get()->X == 0) { - get()->imm11 |= (1 << 0); + Get()->imm11 = BITS(imm24, 0, 10); + Get()->imm10 = BITS(imm24, 11, 20); + if (Get()->X == 0) { + Get()->imm11 |= (1 << 0); } - get()->S = BIT(imm24, 23); + Get()->S = BIT(imm24, 23); U32 i1 = BIT(imm24, 22); U32 i2 = BIT(imm24, 21); if (i1 == 1) { - get()->J1 = get()->S; + Get()->J1 = Get()->S; } else { - get()->J1 = !get()->S; + Get()->J1 = !Get()->S; } if (i2 == 1) { - get()->J2 = get()->S; + Get()->J2 = Get()->S; } else { - get()->J2 = !get()->S; + Get()->J2 = !Get()->S; } } -Addr T32_B32::getImmPCOffsetTarget() { +Addr T32_B32::GetImmPCOffsetTarget() { if (x == arm && op == BL) { void* base = reinterpret_cast(ALIGN((Addr) getPC(), 4)); return offset + reinterpret_cast(base); } else { - return T32_INST_PC_REL::getImmPCOffsetTarget(); + return T32_INST_PC_REL::GetImmPCOffsetTarget(); } } @@ -100,67 +100,67 @@ T32_LDR_UIMM::T32_LDR_UIMM(T32_STRUCT_LDR_UIMM *inst) : InstructionT32(inst) {} T32_LDR_UIMM::T32_LDR_UIMM(RegisterA32 &rt, RegisterA32 &rn, U32 offset) : rt(&rt), rn(&rn), offset(offset) {} -void T32_LDR_UIMM::decode(T32_STRUCT_LDR_UIMM *inst) { +void T32_LDR_UIMM::Disassembler(T32_STRUCT_LDR_UIMM *inst) { DECODE_RN(Reg); DECODE_RT(Reg); INST_ASSERT(rn == &PC); offset = inst->imm12; } -void T32_LDR_UIMM::assembler() { +void T32_LDR_UIMM::Assembler() { SET_OPCODE(LDR_UIMM); ENCODE_RN; ENCODE_RT; INST_ASSERT(rn == &PC); - get()->imm12 = offset; + Get()->imm12 = offset; } T32_LDR_LIT::T32_LDR_LIT() {} T32_LDR_LIT::T32_LDR_LIT(T32_STRUCT_LDR_LIT *inst) : T32_INST_PC_REL(inst) { - decode(inst); + Disassembler(inst); } T32_LDR_LIT::T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Off offset) : op(op), s(s), rt(&rt), offset(offset) {} T32_LDR_LIT::T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Label& label) : op(op), s(s), rt(&rt) { - bindLabel(label); + BindLabel(label); } -Off T32_LDR_LIT::getImmPCOffset() { - return get()->U == add ? get()->imm12 : -get()->imm12; +Off T32_LDR_LIT::GetImmPCOffset() { + return Get()->U == add ? Get()->imm12 : -Get()->imm12; } -void T32_LDR_LIT::onOffsetApply(Off offset) { +void T32_LDR_LIT::OnOffsetApply(Off offset) { this->offset = offset; if (offset >= 0) { - get()->U = add; - get()->imm12 = static_cast(offset); + Get()->U = add; + Get()->imm12 = static_cast(offset); } else { - get()->U = cmp; - get()->imm12 = static_cast(-offset); + Get()->U = cmp; + Get()->imm12 = static_cast(-offset); } } -void T32_LDR_LIT::decode(T32_STRUCT_LDR_LIT *inst) { +void T32_LDR_LIT::Disassembler(T32_STRUCT_LDR_LIT *inst) { DECODE_OP; DECODE_RT(Reg); s = S(inst->S); - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void T32_LDR_LIT::assembler() { +void T32_LDR_LIT::Assembler() { SET_OPCODE(LDR_LIT); ENCODE_OP; ENCODE_RT; - get()->S = s; + Get()->S = s; if (offset >= 0) { - get()->U = add; - get()->imm12 = static_cast(offset); + Get()->U = add; + Get()->imm12 = static_cast(offset); } else { - get()->U = cmp; - get()->imm12 = static_cast(-offset); + Get()->U = cmp; + Get()->imm12 = static_cast(-offset); } } @@ -168,14 +168,14 @@ void T32_LDR_LIT::assembler() { T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM() {} T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM(T32_STRUCT_MOV_MOVT_IMM *inst) : InstructionT32(inst) { - decode(inst); + Disassembler(inst); } T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM(T32_MOV_MOVT_IMM::OP op, RegisterA32 &rd, U16 imm16) : op(op), rd(&rd), imm16(imm16) {} -void T32_MOV_MOVT_IMM::decode(T32_STRUCT_MOV_MOVT_IMM *inst) { +void T32_MOV_MOVT_IMM::Disassembler(T32_STRUCT_MOV_MOVT_IMM *inst) { DECODE_OP; DECODE_RD(Reg); U16 imm4i = COMBINE(inst->imm4, inst->i, 1); @@ -183,27 +183,27 @@ void T32_MOV_MOVT_IMM::decode(T32_STRUCT_MOV_MOVT_IMM *inst) { imm16 = COMBINE(imm4i, imm38, 11); } -void T32_MOV_MOVT_IMM::assembler() { +void T32_MOV_MOVT_IMM::Assembler() { SET_OPCODE_MULTI(MOV_MOVT_IMM, 1); SET_OPCODE_MULTI(MOV_MOVT_IMM, 2); ENCODE_OP; ENCODE_RD; - get()->imm8 = BITS(imm16, 0, 7); - get()->imm3 = BITS(imm16, 8 ,10); - get()->i = BIT(imm16, 11); - get()->imm4 = BITS(imm16, 12, 15); + Get()->imm8 = BITS(imm16, 0, 7); + Get()->imm3 = BITS(imm16, 8 ,10); + Get()->i = BIT(imm16, 11); + Get()->imm4 = BITS(imm16, 12, 15); } T32_LDR_IMM::T32_LDR_IMM(T32_STRUCT_LDR_IMM *inst) : InstructionT32(inst) { - decode(inst); + Disassembler(inst); } T32_LDR_IMM::T32_LDR_IMM(T32_LDR_IMM::OP op, RegisterA32 &rt, const MemOperand &operand) : op(op), rt(&rt), operand(operand) {} -void T32_LDR_IMM::decode(T32_STRUCT_LDR_IMM *inst) { +void T32_LDR_IMM::Disassembler(T32_STRUCT_LDR_IMM *inst) { DECODE_OP; DECODE_RT(Reg); operand.rn = Reg(static_cast(inst->rn)); @@ -219,31 +219,31 @@ void T32_LDR_IMM::decode(T32_STRUCT_LDR_IMM *inst) { operand.offset = inst->U == 0 ? -inst->imm8 : inst->imm8; } -void T32_LDR_IMM::assembler() { +void T32_LDR_IMM::Assembler() { SET_OPCODE_MULTI(LDR_IMM, 1); SET_OPCODE_MULTI(LDR_IMM, 2); ENCODE_OP; - get()->rn = operand.rn->getCode(); + Get()->rn = operand.rn->Code(); if (operand.offset < 0) { - get()->imm8 = static_cast(-operand.offset); - get()->U = 0; + Get()->imm8 = static_cast(-operand.offset); + Get()->U = 0; } else { - get()->imm8 = static_cast(operand.offset); - get()->U = 1; + Get()->imm8 = static_cast(operand.offset); + Get()->U = 1; } switch (operand.addr_mode) { case Offset: - get()->P = 1; - get()->U = 0; - get()->W = 0; + Get()->P = 1; + Get()->U = 0; + Get()->W = 0; break; case PostIndex: - get()->P = 0; - get()->W = 1; + Get()->P = 0; + Get()->W = 1; break; case PreIndex: - get()->P = 1; - get()->W = 1; + Get()->P = 1; + Get()->W = 1; break; default: valid = false; @@ -253,5 +253,5 @@ void T32_LDR_IMM::assembler() { T32_SUB_IMM::T32_SUB_IMM(T32_STRUCT_SUB_IMM *inst) : InstructionT32(inst) { - decode(inst); + DisAssembler(inst); } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h index 8d5bc692..43303858 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h @@ -2,8 +2,8 @@ // Created by swift on 2019/5/16. // -#ifndef SANDHOOK_INST_T32_H -#define SANDHOOK_INST_T32_H +#pragma once + #include "arm_base.h" #include "arm32_base.h" @@ -54,7 +54,7 @@ namespace SandHook { InstructionT32(Inst *inst) : Instruction(inst) {} Inst mask(Inst raw) { - return raw & *(this->get()); + return raw & *(this->Get()); } U32 size() override { @@ -62,14 +62,14 @@ namespace SandHook { } void *getPC() override { - return reinterpret_cast((Addr) Instruction::getPC() + 2 * 2); + return reinterpret_cast((Addr) Instruction::GetPC() + 2 * 2); } Addr getVPC() override { - return Instruction::getVPC() + 2 * 2; + return Instruction::GetVPC() + 2 * 2; } - static inline S32 signExtend32(unsigned int bits, U32 value) { + static inline S32 SignExtend32(unsigned int bits, U32 value) { return ExtractSignedBitfield32(bits - 1, 0, value); } @@ -92,12 +92,12 @@ namespace SandHook { T32_INST_PC_REL(Inst *inst) : InstructionT32(inst) {}; - virtual Off getImmPCOffset() { + virtual Off GetImmPCOffset() { return 0; }; - virtual Addr getImmPCOffsetTarget() { - return (Addr) this->getPC() + getImmPCOffset(); + virtual Addr GetImmPCOffsetTarget() { + return (Addr) this->GetPC() + GetImmPCOffset(); }; inline bool pcRelate() override { @@ -118,9 +118,9 @@ namespace SandHook { return true; } - void decode(T32_STRUCT_UNKNOW *inst) override; + void Disassembler(T32_STRUCT_UNKNOW *inst) override; - void assembler() override; + void Assembler() override; private: STRUCT_T32(UNKNOW) inst_backup; @@ -150,13 +150,13 @@ namespace SandHook { DEFINE_IS_EXT(B32, TEST_INST_FIELD(opcode, OPCODE_T32(B32)) && (TEST_INST_FIELD(op, B) || TEST_INST_FIELD(op, BL))) - Addr getImmPCOffsetTarget() override; + Addr GetImmPCOffsetTarget() override; - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void decode(T32_STRUCT_B32 *inst) override; + void Disassembler(T32_STRUCT_B32 *inst) override; - void assembler() override; + void Assembler() override; public: OP op; @@ -174,9 +174,9 @@ namespace SandHook { DEFINE_IS(LDR_UIMM) - void decode(T32_STRUCT_LDR_UIMM *inst) override; + void Disassembler(T32_STRUCT_LDR_UIMM *inst) override; - void assembler() override; + void Assembler() override; public: RegisterA32* rt; @@ -216,13 +216,13 @@ namespace SandHook { DEFINE_INST_CODE(LDR_LIT) - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - void decode(T32_STRUCT_LDR_LIT *inst) override; + void Disassembler(T32_STRUCT_LDR_LIT *inst) override; - void assembler() override; + void Assembler() override; public: OP op; @@ -250,9 +250,9 @@ namespace SandHook { DEFINE_INST_CODE(MOV_MOVT_IMM) - void decode(T32_STRUCT_MOV_MOVT_IMM *inst) override; + void Disassembler(T32_STRUCT_MOV_MOVT_IMM *inst) override; - void assembler() override; + void Assembler() override; public: OP op; @@ -280,9 +280,9 @@ namespace SandHook { DEFINE_INST_CODE(LDR_IMM) - void decode(T32_STRUCT_LDR_IMM *inst) override; + void Disassembler(T32_STRUCT_LDR_IMM *inst) override; - void assembler() override; + void Assembler() override; public: OP op; @@ -315,5 +315,3 @@ namespace SandHook { #undef TEST_INST_FIELD #undef TEST_INST_OPCODE #undef DEFINE_INST_CODE - -#endif //SANDHOOK_INST_T32_H diff --git a/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h index 46cbe906..a8f3f6c1 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/12. // -#ifndef SANDHOOK_NH_REGISTER_A32_H -#define SANDHOOK_NH_REGISTER_A32_H +#pragma once #include "base.h" #include "register.h" @@ -36,7 +35,7 @@ namespace SandHook { U8 getWide() override; virtual bool isUnkonw () { - return getCode() == 38; + return Code() == 38; } static RegisterA32* get(U8 code) { @@ -47,6 +46,4 @@ namespace SandHook { static RegisterA32* registers[]; }; } -} - -#endif //SANDHOOK_NH_REGISTER_A32_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/register/register_list_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/register/register_list_arm32.h index 78a90c6f..36eb8df8 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/register/register_list_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/register/register_list_arm32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/8. // -#ifndef SANDHOOK_NH_REGISTER_LIST_A32_H -#define SANDHOOK_NH_REGISTER_LIST_A32_H +#pragma once #include "register_arm32.h" @@ -30,6 +29,4 @@ namespace RegistersA32 { extern RegisterA32 PC; extern RegisterA32 UnknowRegiser; }} -#define Reg(N) RegisterA32::get(N) - -#endif //SANDHOOK_NH_REGISTER_LIST_A32_H +#define Reg(N) RegisterA32::get(N) \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp index 219e6495..b2b65814 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp @@ -26,8 +26,8 @@ CodeRelocateA32::CodeRelocateA32(AssemblerA32 &assembler) : CodeRelocate(assembl bool CodeRelocateA32::visit(Unit *unit, void *pc) { relocate(reinterpret_cast *>(unit), __ getPC()); - curOffset += unit->size(); - if (unit->refcount() == 0) { + curOffset += unit->Size(); + if (unit->RefCount() == 0) { delete unit; } return true; @@ -44,7 +44,7 @@ void* CodeRelocateA32::relocate(void *startPc, Addr len, void *toPc = nullptr) t __ allocBufferFirst(static_cast(len * 8)); void* curPc = __ getPC(); if (toPc == nullptr) { - Disassembler::get()->decode(startPc, len, *this, true); + Disassembler::Get()->Disassembler(startPc, len, *this, true); } else { //TODO } @@ -54,25 +54,25 @@ void* CodeRelocateA32::relocate(void *startPc, Addr len, void *toPc = nullptr) t void* CodeRelocateA32::relocate(Instruction *instruction, void *toPc) throw(ErrorCodeException) { void* curPc = __ getPC(); - //insert later bind labels + //insert later AddBind labels __ Emit(getLaterBindLabel(curOffset)); if (!instruction->pcRelate()) { __ Emit(instruction); - instruction->ref(); + instruction->Ref(); return curPc; } - if (instruction->instType() == thumb32) { - switch (instruction->instCode()) { + if (instruction->InstType() == thumb32) { + switch (instruction->InstCode()) { CASE(T32, B32) CASE(T32, LDR_LIT) default: __ Emit(instruction); - instruction->ref(); + instruction->Ref(); } - } else if (instruction->instType() == thumb16) { - switch (instruction->instCode()) { + } else if (instruction->InstType() == thumb16) { + switch (instruction->InstCode()) { CASE(T16, B) CASE(T16, B_COND) CASE(T16, BX_BLX) @@ -82,11 +82,11 @@ void* CodeRelocateA32::relocate(Instruction *instruction, void *toPc) thro CASE(T16, ADD_REG_RDN) default: __ Emit(instruction); - instruction->ref(); + instruction->Ref(); } } else { __ Emit(instruction); - instruction->ref(); + instruction->Ref(); } return curPc; } @@ -99,7 +99,7 @@ IMPL_RELOCATE(T16, B_COND) { return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); if (inst->condition == al) { Label* target_label = new Label; @@ -130,7 +130,7 @@ IMPL_RELOCATE(T16, B) { return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); Label* target_label = new Label(); ALIGN_FOR_LDR @@ -142,26 +142,26 @@ IMPL_RELOCATE(T16, B) { IMPL_RELOCATE(T16, BX_BLX) { __ Emit(reinterpret_cast*>(inst)); - inst->ref(); + inst->Ref(); } IMPL_RELOCATE(T16, CBZ_CBNZ) { - inst->ref(); + inst->Ref(); if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { - inst->bindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); __ Emit(reinterpret_cast*>(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); Label* true_label = new Label; Label* false_label = new Label; Label* target_label = new Label(); - inst->bindLabel(*true_label); + inst->BindLabel(*true_label); __ Emit(reinterpret_cast*>(inst)); __ B(false_label); __ Emit(true_label); @@ -176,13 +176,13 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { IMPL_RELOCATE(T16, LDR_LIT) { if (inRelocateRange(CODE_OFFSET(inst), inst->rt->getWide())) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->Ref(); + inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); __ Emit(reinterpret_cast*>(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); __ Mov(*inst->rt, targetAddr); __ Ldr(*inst->rt, MemOperand(inst->rt, 0)); @@ -191,13 +191,13 @@ IMPL_RELOCATE(T16, LDR_LIT) { IMPL_RELOCATE(T16, ADR) { if (inRelocateRange(CODE_OFFSET(inst), inst->rd->getWide())) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->Ref(); + inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); __ Emit(reinterpret_cast*>(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); __ Mov(*inst->rd, targetAddr); @@ -206,7 +206,7 @@ IMPL_RELOCATE(T16, ADR) { IMPL_RELOCATE(T16, ADD_REG_RDN) { if (*inst->rm != PC) { - inst->ref(); + inst->Ref(); __ Emit(reinterpret_cast*>(inst)); return; } @@ -223,13 +223,13 @@ IMPL_RELOCATE(T16, ADD_REG_RDN) { IMPL_RELOCATE(T32, B32) { if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->Ref(); + inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); __ Emit(reinterpret_cast *>(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); if (inst->x == T32_B32::thumb) { @@ -248,13 +248,13 @@ IMPL_RELOCATE(T32, B32) { IMPL_RELOCATE(T32, LDR_LIT) { if (inRelocateRange(CODE_OFFSET(inst), sizeof(Addr))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->Ref(); + inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); __ Emit(reinterpret_cast*>(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); __ Mov(*inst->rt, targetAddr); switch (inst->op) { @@ -276,7 +276,7 @@ IMPL_RELOCATE(T32, LDR_LIT) { } break; default: - inst->ref(); + inst->Ref(); __ Emit(reinterpret_cast*>(inst)); } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h index 19e86f2f..12e41431 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/23. // -#ifndef SANDHOOK_CODE_RELOCATE_ARM32_H -#define SANDHOOK_CODE_RELOCATE_ARM32_H +#pragma once #include #include @@ -55,6 +54,4 @@ namespace SandHook { } } -#undef DEFINE_RELOCATE - -#endif //SANDHOOK_CODE_RELOCATE_ARM32_H +#undef DEFINE_RELOCATE \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp index aadc6ab6..bbb7ef96 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp @@ -12,19 +12,19 @@ AssemblerA64::AssemblerA64(CodeBuffer* codeBuffer) { codeContainer.setCodeBuffer(codeBuffer); } -void *AssemblerA64::getPC() { +void *AssemblerA64::GetPC() { return reinterpret_cast(codeContainer.curPc); } -void *AssemblerA64::getStartPC() { +void *AssemblerA64::GetStartPC() { return reinterpret_cast(codeContainer.startPc); } -void AssemblerA64::allocBufferFirst(U32 size) { +void AssemblerA64::AllocBufferFirst(U32 size) { codeContainer.allocBufferFirst(size); } -void *AssemblerA64::finish() { +void *AssemblerA64::Finish() { codeContainer.commit(); return reinterpret_cast(codeContainer.startPc); } @@ -95,7 +95,7 @@ void AssemblerA64::B(Off offset) { } void AssemblerA64::B(Label *label) { - Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::B, *label))); + Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::B, label))); } void AssemblerA64::Bl(Off offset) { @@ -103,7 +103,7 @@ void AssemblerA64::Bl(Off offset) { } void AssemblerA64::Bl(Label *label) { - Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::BL, *label))); + Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::BL, label))); } void AssemblerA64::B(Condition condition, Off offset) { @@ -111,11 +111,11 @@ void AssemblerA64::B(Condition condition, Off offset) { } void AssemblerA64::B(Condition condition, Label *label) { - Emit(reinterpret_cast *>(new INST_A64(B_COND)(condition, *label))); + Emit(reinterpret_cast *>(new INST_A64(B_COND)(condition, label))); } void AssemblerA64::Tbz(RegisterA64 &rt, U32 bit, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBZ, rt, bit, *label)))); + Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBZ, rt, bit, label)))); } void AssemblerA64::Tbz(RegisterA64 &rt, U32 bit, Off offset) { @@ -127,7 +127,7 @@ void AssemblerA64::Tbnz(RegisterA64 &rt, U32 bit, Off offset) { } void AssemblerA64::Tbnz(RegisterA64 &rt, U32 bit, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBNZ, rt, bit, *label)))); + Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBNZ, rt, bit, label)))); } @@ -136,7 +136,7 @@ void AssemblerA64::Cbz(RegisterA64 &rt, Off offset) { } void AssemblerA64::Cbz(RegisterA64 &rt, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBZ, *label, rt)))); + Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBZ, label, rt)))); } @@ -146,11 +146,11 @@ void AssemblerA64::Cbnz(RegisterA64 &rt, Off offset) { } void AssemblerA64::Cbnz(RegisterA64 &rt, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBNZ, *label, rt)))); + Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBNZ, label, rt)))); } void AssemblerA64::Str(RegisterA64 &rt, const MemOperand& memOperand) { - if (memOperand.addr_mode == Offset) { + if (memOperand.addr_mode_ == Offset) { Emit(reinterpret_cast *>(new INST_A64(STR_UIMM)(rt, memOperand))); } else { Emit(reinterpret_cast *>(new INST_A64(STR_IMM)(rt, memOperand))); @@ -158,7 +158,7 @@ void AssemblerA64::Str(RegisterA64 &rt, const MemOperand& memOperand) { } void AssemblerA64::Ldr(RegisterA64 &rt, const MemOperand &memOperand) { - if (memOperand.addr_mode == Offset && memOperand.offset >= 0) { + if (memOperand.addr_mode_ == Offset && memOperand.offset_ >= 0) { Emit(reinterpret_cast *>(new INST_A64(LDR_UIMM)(rt, memOperand))); } else { Emit(reinterpret_cast *>(new INST_A64(LDR_IMM)(rt, memOperand))); @@ -166,15 +166,15 @@ void AssemblerA64::Ldr(RegisterA64 &rt, const MemOperand &memOperand) { } void AssemblerA64::Ldr(RegisterA64 &rt, Label* label) { - Emit(reinterpret_cast *>(new INST_A64(LDR_LIT)(rt.isX() ? INST_A64(LDR_LIT)::LDR_X : INST_A64(LDR_LIT)::LDR_W, rt, *label))); + Emit(reinterpret_cast *>(new INST_A64(LDR_LIT)(rt.isX() ? INST_A64(LDR_LIT)::LDR_X : INST_A64(LDR_LIT)::LDR_W, rt, label))); } void AssemblerA64::Ldrsw(RegisterA64 &rt, Label* label) { - Emit(reinterpret_cast *>(new INST_A64(LDR_LIT)(INST_A64(LDR_LIT)::LDR_SW, rt, *label))); + Emit(reinterpret_cast *>(new INST_A64(LDR_LIT)(INST_A64(LDR_LIT)::LDR_SW, rt, label))); } void AssemblerA64::Ldrsw(XRegister &rt, const MemOperand& memOperand) { - if (memOperand.addr_mode == Offset) { + if (memOperand.addr_mode_ == Offset) { Emit(reinterpret_cast *>(new INST_A64(LDRSW_UIMM)(rt, memOperand))); } else { Emit(reinterpret_cast *>(new INST_A64(LDRSW_IMM)(rt, memOperand))); @@ -182,7 +182,7 @@ void AssemblerA64::Ldrsw(XRegister &rt, const MemOperand& memOperand) { } // If the current stack pointer is sp, then it must be aligned to 16 bytes -// on entry and the total size of the specified registers must also be a +// on entry and the total Size of the specified registers must also be a // multiple of 16 bytes. void AssemblerA64::Pop(RegisterA64 &rd) { if (rd.isX()) { @@ -193,7 +193,7 @@ void AssemblerA64::Pop(RegisterA64 &rd) { } // If the current stack pointer is sp, then it must be aligned to 16 bytes -// on entry and the total size of the specified registers must also be a +// on entry and the total Size of the specified registers must also be a // multiple of 16 bytes. void AssemblerA64::Push(RegisterA64 &rt) { if (rt.isX()) { diff --git a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h index af76b3d5..ccb8ef48 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/11. // -#ifndef SANDHOOK_NH_ASSEMBLER_A64_H -#define SANDHOOK_NH_ASSEMBLER_A64_H +#pragma once #include "assembler.h" #include "register_arm64.h" @@ -19,10 +18,10 @@ namespace SandHook { public: AssemblerA64(CodeBuffer* codeBuffer); - void allocBufferFirst(U32 size); - void* getStartPC(); - void* getPC(); - void* finish(); + void AllocBufferFirst(U32 size); + void* GetStartPC(); + void* GetPC(); + void* Finish(); void Emit(U32 data32); void Emit(U64 data64); @@ -99,6 +98,4 @@ namespace SandHook { }; } -} - -#endif //SANDHOOK_NH_ASSEMBLER_A64_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp index 9f1c6727..08bc962d 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp @@ -10,14 +10,14 @@ using namespace SandHook::AsmA64; #define CASE(X) \ if (IS_OPCODE_A64(*pc, X)) { \ -STRUCT_A64(X) *s = reinterpret_cast(pc); \ -unit = reinterpret_cast *>(new INST_A64(X)(*s)); \ +unit = reinterpret_cast(new INST_A64(X)(pc)); \ goto label_matched; \ } Arm64Decoder* Arm64Decoder::instant = new Arm64Decoder(); -void Arm64Decoder::decode(void *codeStart, Addr codeLen, InstVisitor &visitor, bool onlyPcRelInst) { +void Arm64Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) { InstA64 *pc = reinterpret_cast(codeStart); Addr endAddr = (Addr) codeStart + codeLen; Unit* unit = nullptr; @@ -48,12 +48,13 @@ void Arm64Decoder::decode(void *codeStart, Addr codeLen, InstVisitor &visitor, b label_matched: if (unit == nullptr) { - unit = reinterpret_cast *>(new INST_A64(UNKNOW)(*reinterpret_cast(pc))); + unit = reinterpret_cast(new INST_A64(UNKNOW)(pc)); } - if (!visitor.visit(unit, pc)) { + reinterpret_cast(unit)->Disassembler(); + if (!visitor.Visit(unit, pc)) { break; } - pc = reinterpret_cast((Addr)pc + unit->size()); + pc = reinterpret_cast((Addr)pc + unit->Size()); unit = nullptr; } } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h index 9a47edee..b237d0cd 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/6. // -#ifndef SANDHOOK_NH_DECODER_ARM64_H -#define SANDHOOK_NH_DECODER_ARM64_H +#pragma once #include "decoder.h" @@ -12,12 +11,11 @@ namespace SandHook { class Arm64Decoder : public InstDecoder { public: - void decode(void *codeStart, Addr codeLen, InstVisitor &visitor, bool onlyPcRelInst) override; + void Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) override; public: static Arm64Decoder* instant; }; } -} - -#endif //SANDHOOK_NH_DECODER_ARM64_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp index c3ff9430..bb870ce2 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp @@ -15,7 +15,7 @@ using namespace SandHook::Utils; #include "assembler_arm64.h" #include "code_relocate_arm64.h" using namespace SandHook::RegistersA64; -void *InlineHookArm64Android::inlineHook(void *origin, void *replace) { +void *InlineHookArm64Android::Hook(void *origin, void *replace) { AutoLock lock(hookLock); void* backup = nullptr; @@ -43,15 +43,15 @@ void *InlineHookArm64Android::inlineHook(void *origin, void *replace) { __ Br(IP1); __ Emit(origin_addr_label); __ Emit((Addr) origin + codeContainerInline->size()); - __ finish(); + __ Finish(); #undef __ //commit inline trampoline - assemblerInline.finish(); + assemblerInline.Finish(); return backup; } -bool InlineHookArm64Android::breakPoint(void *point, void (*callback)(REG regs[])) { +bool InlineHookArm64Android::BreakPoint(void *point, void (*callback)(REG regs[])) { AutoLock lock(hookLock); void* backup = nullptr; @@ -71,7 +71,7 @@ bool InlineHookArm64Android::breakPoint(void *point, void (*callback)(REG regs[] __ Br(IP1); __ Emit(origin_addr_label); __ Emit((Addr) point + 4 * 4); - __ finish(); + __ Finish(); #undef __ @@ -114,11 +114,11 @@ bool InlineHookArm64Android::breakPoint(void *point, void (*callback)(REG regs[] __ Mov(IP1, (Addr) backup); __ Br(IP1); - __ finish(); + __ Finish(); #undef __ - void* secondTrampoline = assemblerTrampoline.getStartPC(); + void* secondTrampoline = assemblerTrampoline.GetStartPC(); //build inline trampoline #define __ assemblerInline. Label* target_addr_label = new Label(); @@ -126,7 +126,7 @@ bool InlineHookArm64Android::breakPoint(void *point, void (*callback)(REG regs[] __ Br(IP1); __ Emit(target_addr_label); __ Emit((Addr) secondTrampoline); - __ finish(); + __ Finish(); #undef __ return true; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.h index 6a35c3ba..a5c252be 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/23. // -#ifndef SANDHOOK_HOOK_ARM64_H -#define SANDHOOK_HOOK_ARM64_H +#pragma once #include "hook.h" @@ -11,20 +10,8 @@ namespace SandHook { namespace Hook { class InlineHookArm64Android : public InlineHook { public: - inline InlineHookArm64Android() { - hookLock = new std::mutex(); - }; - inline ~InlineHookArm64Android() { - delete hookLock; - } - void *inlineHook(void *origin, void *replace) override; - - bool breakPoint(void *point, void (*callback)(REG[])) override; - - protected: - std::mutex* hookLock; + void *Hook(void *origin, void *replace) override; + bool BreakPoint(void *point, void (*callback)(REG[])) override; }; } } - -#endif //SANDHOOK_HOOK_ARM64_H diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp index 3215c67e..94e9cb5b 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp @@ -4,121 +4,95 @@ #include "inst_arm64.h" -#define SET_OPCODE(X) get()->opcode = OPCODE_A64(X) -#define SET_OPCODE_MULTI(X, INDEX) get()->opcode##INDEX = OPCODE_A64(X##_##INDEX) +#define SET_OPCODE(X) Get()->opcode = OPCODE_A64(X) +#define SET_OPCODE_MULTI(X, INDEX) Get()->opcode##INDEX = OPCODE_A64(X##_##INDEX) -#define DECODE_OFFSET(bits, ext) signExtend64(bits + ext, COMBINE(get()->imm##bits, 0, ext)) -#define ENCODE_OFFSET(bits, ext) get()->imm##bits = TruncateToUint##bits(offset >> ext) +#define DECODE_OFFSET(bits, ext) SignExtend64(bits + ext, COMBINE(Get()->imm##bits, 0, ext)) +#define ENCODE_OFFSET(bits, ext) Get()->imm##bits = TruncateToUint##bits(offset >> ext) using namespace SandHook::Asm; using namespace SandHook::AsmA64; -template -U32 InstructionA64::size() { - return sizeof(InstA64); -} - - -//Unknow - -A64_UNKNOW::A64_UNKNOW(STRUCT_A64(UNKNOW) &inst) : InstructionA64(&inst) { - decode(&inst); -} - -void A64_UNKNOW::decode(A64_STRUCT_UNKNOW *inst) { - inst_backup = *inst; -} +//PC Rel Inst -void A64_UNKNOW::assembler() { - set(inst_backup); +template +Addr A64_INST_PC_REL::GetImmPCOffsetTarget() { + return this->GetImmPCOffset() + reinterpret_cast(this->GetPC()); } -//PC Rel Inst - -template -A64_INST_PC_REL::A64_INST_PC_REL(Inst *inst):InstructionA64(inst) { +template +bool A64_INST_PC_REL::PcRelate() { + return true; } -template -A64_INST_PC_REL::A64_INST_PC_REL() {} +template +A64_INST_PC_REL::A64_INST_PC_REL() {} -template -Addr A64_INST_PC_REL::getImmPCOffsetTarget() { - return this->getImmPCOffset() + reinterpret_cast(this->getPC()); -} +template +A64_INST_PC_REL::A64_INST_PC_REL(void *inst) : InstructionA64(inst) { -template -bool A64_INST_PC_REL::pcRelate() { - return true; } //ADR ADRP -A64_ADR_ADRP::A64_ADR_ADRP() {} -A64_ADR_ADRP::A64_ADR_ADRP(STRUCT_A64(ADR_ADRP) &inst) : A64_INST_PC_REL(&inst) { - decode(&inst); -} +A64_ADR_ADRP::A64_ADR_ADRP(void *inst) : A64_INST_PC_REL(inst) {} A64_ADR_ADRP::A64_ADR_ADRP(A64_ADR_ADRP::OP op, XRegister &rd, S64 offset) : op(op), rd(&rd), offset(offset) { } -A64_ADR_ADRP::A64_ADR_ADRP(A64_ADR_ADRP::OP op, XRegister &rd, Label &label) { - bindLabel(label); +A64_ADR_ADRP::A64_ADR_ADRP(A64_ADR_ADRP::OP op, XRegister &rd, Label *label) { + BindLabel(label); } -Off A64_ADR_ADRP::getImmPCOffset() { - U32 hi = get()->immhi; - U32 lo = get()->immlo; +Off A64_ADR_ADRP::GetImmPCOffset() { + U32 hi = Get()->immhi; + U32 lo = Get()->immlo; U64 imm = COMBINE(hi, lo, IMM_LO_W); - if (isADRP()) { - return signExtend64(IMM_HI_W + IMM_LO_W + PAGE_OFFSET, imm << PAGE_OFFSET); + if (IsADRP()) { + return SignExtend64(IMM_HI_W + IMM_LO_W + PAGE_OFFSET, imm << PAGE_OFFSET); } else { - return signExtend64(IMM_HI_W + IMM_LO_W, imm); + return SignExtend64(IMM_HI_W + IMM_LO_W, imm); } } -Addr A64_ADR_ADRP::getImmPCOffsetTarget() { - void* base = AlignDown(getPC(), P_SIZE); +Addr A64_ADR_ADRP::GetImmPCOffsetTarget() { + void* base = AlignDown(GetPC(), P_SIZE); return offset + reinterpret_cast(base); } -void A64_ADR_ADRP::assembler() { +void A64_ADR_ADRP::Assembler() { SET_OPCODE(ADR_ADRP); } -void A64_ADR_ADRP::decode(STRUCT_A64(ADR_ADRP) *inst) { - offset = getImmPCOffset(); +void A64_ADR_ADRP::Disassembler() { + offset = GetImmPCOffset(); DECODE_RD(XReg); DECODE_OP; } //Mov Wide -A64_MOV_WIDE::A64_MOV_WIDE() {} - -A64_MOV_WIDE::A64_MOV_WIDE(STRUCT_A64(MOV_WIDE) &inst) : InstructionA64(&inst) { - decode(&inst); -} +A64_MOV_WIDE::A64_MOV_WIDE(void* inst) : InstructionA64(inst) {} A64_MOV_WIDE::A64_MOV_WIDE(A64_MOV_WIDE::OP op,RegisterA64* rd, U16 imme, U8 shift) : shift(shift), op(op), imme(imme), rd(rd) {} -void A64_MOV_WIDE::assembler() { +void A64_MOV_WIDE::Assembler() { SET_OPCODE(MOV_WIDE); - get()->imm16 = imme; - get()->hw = static_cast(shift / 16); + Get()->imm16 = imme; + Get()->hw = static_cast(shift / 16); ENCODE_OP; - get()->sf = rd->isX() ? 1 : 0; + Get()->sf = rd->isX() ? 1 : 0; ENCODE_RD; } -void A64_MOV_WIDE::decode(STRUCT_A64(MOV_WIDE) *inst) { - imme = static_cast(inst->imm16); - shift = static_cast(inst->hw * 16); - op = OP(inst->op); - if (inst->sf == 1) { +void A64_MOV_WIDE::Disassembler() { + imme = static_cast(Get()->imm16); + shift = static_cast(Get()->hw * 16); + op = OP(Get()->op); + if (Get()->sf == 1) { DECODE_RD(XReg); } else { DECODE_RD(WReg); @@ -129,34 +103,31 @@ void A64_MOV_WIDE::decode(STRUCT_A64(MOV_WIDE) *inst) { //B BL -A64_B_BL::A64_B_BL() {} - -A64_B_BL::A64_B_BL(STRUCT_A64(B_BL) &inst) : A64_INST_PC_REL(&inst) { - decode(&inst); +A64_B_BL::A64_B_BL(void *inst) : A64_INST_PC_REL(inst) { } A64_B_BL::A64_B_BL(A64_B_BL::OP op, Off offset) : op(op), offset(offset) { } -A64_B_BL::A64_B_BL(A64_B_BL::OP op, Label &l) : op(op) { - bindLabel(l); +A64_B_BL::A64_B_BL(A64_B_BL::OP op, Label *l) : op(op) { + BindLabel(l); } -Off A64_B_BL::getImmPCOffset() { +Off A64_B_BL::GetImmPCOffset() { return DECODE_OFFSET(26, 2); } -void A64_B_BL::onOffsetApply(Off offset) { +void A64_B_BL::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(26, 2); } -void A64_B_BL::decode(STRUCT_A64(B_BL) *inst) { +void A64_B_BL::Disassembler() { DECODE_OP; - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void A64_B_BL::assembler() { +void A64_B_BL::Assembler() { SET_OPCODE(B_BL); ENCODE_OP; ENCODE_OFFSET(26, 2); @@ -166,44 +137,41 @@ void A64_B_BL::assembler() { //CBZ CBNZ -A64_CBZ_CBNZ::A64_CBZ_CBNZ() {} -A64_CBZ_CBNZ::A64_CBZ_CBNZ(STRUCT_A64(CBZ_CBNZ) &inst) : A64_INST_PC_REL(&inst) { - decode(&inst); -} +A64_CBZ_CBNZ::A64_CBZ_CBNZ(void *inst) : A64_INST_PC_REL(inst) {} A64_CBZ_CBNZ::A64_CBZ_CBNZ(A64_CBZ_CBNZ::OP op, Off offset, RegisterA64 &rt) : op(op), offset(offset), rt(&rt) {} -A64_CBZ_CBNZ::A64_CBZ_CBNZ(A64_CBZ_CBNZ::OP op, Label& label, RegisterA64 &rt) : op(op), +A64_CBZ_CBNZ::A64_CBZ_CBNZ(A64_CBZ_CBNZ::OP op, Label *label, RegisterA64 &rt) : op(op), rt(&rt) { - bindLabel(label); + BindLabel(label); } -Off A64_CBZ_CBNZ::getImmPCOffset() { +Off A64_CBZ_CBNZ::GetImmPCOffset() { return DECODE_OFFSET(19, 2); } -void A64_CBZ_CBNZ::decode(STRUCT_A64(CBZ_CBNZ) *inst) { +void A64_CBZ_CBNZ::Disassembler() { DECODE_OP; - if (inst->sf == 1) { + if (Get()->sf == 1) { DECODE_RT(XReg); } else { DECODE_RT(WReg); } - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void A64_CBZ_CBNZ::assembler() { +void A64_CBZ_CBNZ::Assembler() { SET_OPCODE(CBZ_CBNZ); ENCODE_OP; ENCODE_RT; - get()->sf = rt->isX() ? 1 : 0; + Get()->sf = rt->isX() ? 1 : 0; ENCODE_OFFSET(19, 2); } -void A64_CBZ_CBNZ::onOffsetApply(Off offset) { +void A64_CBZ_CBNZ::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(19, 2); } @@ -211,34 +179,32 @@ void A64_CBZ_CBNZ::onOffsetApply(Off offset) { //B.Cond -A64_B_COND::A64_B_COND() {} +A64_B_COND::A64_B_COND(void *inst) : A64_INST_PC_REL(inst) {} + +A64_B_COND::A64_B_COND(Condition condition, Off offset) : condition(condition), offset(offset) {} + -A64_B_COND::A64_B_COND(STRUCT_A64(B_COND) &inst) : A64_INST_PC_REL(&inst) { - decode(&inst); +A64_B_COND::A64_B_COND(Condition condition, Label *label) { + BindLabel(label); } -A64_B_COND::A64_B_COND(Condition condition, Off offset) : condition(condition), offset(offset) {} -Off A64_B_COND::getImmPCOffset() { +Off A64_B_COND::GetImmPCOffset() { return DECODE_OFFSET(19, 2); } -void A64_B_COND::decode(STRUCT_A64(B_COND) *inst) { +void A64_B_COND::Disassembler() { DECODE_COND; - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void A64_B_COND::assembler() { +void A64_B_COND::Assembler() { SET_OPCODE(B_COND); ENCODE_COND; ENCODE_OFFSET(19, 2); } -A64_B_COND::A64_B_COND(Condition condition, Label &label) { - bindLabel(label); -} - -void A64_B_COND::onOffsetApply(Off offset) { +void A64_B_COND::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(19, 2); } @@ -246,82 +212,74 @@ void A64_B_COND::onOffsetApply(Off offset) { //TBZ TBNZ -A64_TBZ_TBNZ::A64_TBZ_TBNZ() {} -A64_TBZ_TBNZ::A64_TBZ_TBNZ(STRUCT_A64(TBZ_TBNZ) &inst) : A64_INST_PC_REL(&inst) { - decode(&inst); -} +A64_TBZ_TBNZ::A64_TBZ_TBNZ(void *inst) : A64_INST_PC_REL(inst) {} A64_TBZ_TBNZ::A64_TBZ_TBNZ(A64_TBZ_TBNZ::OP op, RegisterA64 &rt, U32 bit, Off offset) : op(op), rt(&rt), bit(bit), offset(offset) {} -A64_TBZ_TBNZ::A64_TBZ_TBNZ(A64_TBZ_TBNZ::OP op, RegisterA64 &rt, U32 bit, Label &label) : op(op), +A64_TBZ_TBNZ::A64_TBZ_TBNZ(A64_TBZ_TBNZ::OP op, RegisterA64 &rt, U32 bit, Label *label) : op(op), rt(&rt), bit(bit) { - bindLabel(label); + BindLabel(label); } -Off A64_TBZ_TBNZ::getImmPCOffset() { +Off A64_TBZ_TBNZ::GetImmPCOffset() { return DECODE_OFFSET(14, 2); } -void A64_TBZ_TBNZ::decode(STRUCT_A64(TBZ_TBNZ) *inst) { - bit = COMBINE(inst->b5, inst->b40, 5); - if (inst->b5 == 1) { +void A64_TBZ_TBNZ::Disassembler() { + bit = COMBINE(Get()->b5, Get()->b40, 5); + if (Get()->b5 == 1) { DECODE_RT(XReg); } else { DECODE_RT(WReg); } DECODE_OP; - offset = getImmPCOffset(); + offset = GetImmPCOffset(); } -void A64_TBZ_TBNZ::assembler() { +void A64_TBZ_TBNZ::Assembler() { SET_OPCODE(TBZ_TBNZ); ENCODE_OP; - get()->b5 = rt->isX() ? 1 : 0; + Get()->b5 = rt->isX() ? 1 : 0; ENCODE_RT; - get()->b40 = static_cast(BITS(bit, sizeof(InstA64) - 5, sizeof(InstA64))); + Get()->b40 = static_cast(BITS(bit, sizeof(InstA64) - 5, sizeof(InstA64))); ENCODE_OFFSET(14, 2); } -void A64_TBZ_TBNZ::onOffsetApply(Off offset) { +void A64_TBZ_TBNZ::OnOffsetApply(Off offset) { this->offset = offset; - get()->imm14 = TruncateToUint14(offset >> 2); + Get()->imm14 = TruncateToUint14(offset >> 2); } // LDR(literal) -A64_LDR_LIT::A64_LDR_LIT() {} - -A64_LDR_LIT::A64_LDR_LIT(STRUCT_A64(LDR_LIT) &inst) : A64_INST_PC_REL(&inst) { - decode(&inst); -} +A64_LDR_LIT::A64_LDR_LIT(void *inst) : A64_INST_PC_REL(inst) {} A64_LDR_LIT::A64_LDR_LIT(A64_LDR_LIT::OP op, RegisterA64 &rt, Off offset) : op(op), rt(&rt), offset(offset) {} -A64_LDR_LIT::A64_LDR_LIT(A64_LDR_LIT::OP op, RegisterA64 &rt, Label& label) : op(op), rt(&rt) { - bindLabel(label); +A64_LDR_LIT::A64_LDR_LIT(A64_LDR_LIT::OP op, RegisterA64 &rt, Label *label) : op(op), rt(&rt) { + BindLabel(label); } -Off A64_LDR_LIT::getImmPCOffset() { +Off A64_LDR_LIT::GetImmPCOffset() { return DECODE_OFFSET(19, 2); } -void A64_LDR_LIT::onOffsetApply(Off offset) { +void A64_LDR_LIT::OnOffsetApply(Off offset) { this->offset = offset; ENCODE_OFFSET(19, 2); } -void A64_LDR_LIT::decode(STRUCT_A64(LDR_LIT) *inst) { +void A64_LDR_LIT::Disassembler() { DECODE_OP; - offset = getImmPCOffset(); - ENCODE_OFFSET(19, 2); + offset = GetImmPCOffset(); if (op == LDR_W) { DECODE_RT(WReg); } else { @@ -329,7 +287,7 @@ void A64_LDR_LIT::decode(STRUCT_A64(LDR_LIT) *inst) { } } -void A64_LDR_LIT::assembler() { +void A64_LDR_LIT::Assembler() { SET_OPCODE(LDR_LIT); ENCODE_OP; ENCODE_RT; @@ -337,21 +295,18 @@ void A64_LDR_LIT::assembler() { } +//BR BLR RET -A64_BR_BLR_RET::A64_BR_BLR_RET() {} - -A64_BR_BLR_RET::A64_BR_BLR_RET(STRUCT_A64(BR_BLR_RET) &inst) : InstructionA64(&inst) { - decode(&inst); -} +A64_BR_BLR_RET::A64_BR_BLR_RET(void *inst) : InstructionA64(inst) {} A64_BR_BLR_RET::A64_BR_BLR_RET(A64_BR_BLR_RET::OP op, XRegister &rn) : op(op), rn(&rn) {} -void A64_BR_BLR_RET::decode(A64_STRUCT_BR_BLR_RET *inst) { +void A64_BR_BLR_RET::Disassembler() { DECODE_RN(XReg); DECODE_OP; } -void A64_BR_BLR_RET::assembler() { +void A64_BR_BLR_RET::Assembler() { SET_OPCODE_MULTI(BR_BLR_RET, 1); SET_OPCODE_MULTI(BR_BLR_RET, 2); SET_OPCODE_MULTI(BR_BLR_RET, 3); @@ -359,141 +314,132 @@ void A64_BR_BLR_RET::assembler() { ENCODE_OP; } -A64_STR_IMM::A64_STR_IMM() {} -A64_STR_IMM::A64_STR_IMM(STRUCT_A64(STR_IMM) &inst) : A64LoadAndStoreImm(&inst) { - decode(&inst); -} +//STR IMM -A64_STR_IMM::A64_STR_IMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) { +A64_STR_IMM::A64_STR_IMM(void *inst) : A64LoadAndStoreImm(inst) {} +A64_STR_IMM::A64_STR_IMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) { } -void A64_STR_IMM::decode(STRUCT_A64(STR_IMM) *inst) { - regSize = Size(inst->size); +void A64_STR_IMM::Disassembler() { + regSize = RegSize(Get()->size); switch (regSize) { case Size64: - rt = XReg(static_cast(inst->rt)); - operand.base = XReg(static_cast(inst->rn)); + rt = XReg(static_cast(Get()->rt)); + operand.base_ = XReg(static_cast(Get()->rn)); break; case Size32: - rt = WReg(static_cast(inst->rt)); - operand.base = WReg(static_cast(inst->rn)); + rt = WReg(static_cast(Get()->rt)); + operand.base_ = WReg(static_cast(Get()->rn)); break; default: - valid = false; + valid_ = false; return; } - addrMode = AdMod(inst->addrmode); + addrMode = AdMod(Get()->addrmode); switch (addrMode) { case PostIndex: wback = true; postindex = true; - operand.addr_mode = AddrMode::PostIndex; + operand.addr_mode_ = AddrMode::PostIndex; break; case PreIndex: wback = true; postindex = false; - operand.addr_mode = AddrMode::PreIndex; + operand.addr_mode_ = AddrMode::PreIndex; break; default: - operand.addr_mode = AddrMode::Offset; - valid = false; + operand.addr_mode_ = AddrMode::Offset; + valid_ = false; } - scale = static_cast(inst->size); - offset = signExtend64(9, inst->imm9); - operand.offset = offset; + scale = static_cast(Get()->size); + offset = SignExtend64(9, Get()->imm9); + operand.offset_ = offset; } -void A64_STR_IMM::assembler() { +void A64_STR_IMM::Assembler() { SET_OPCODE(STR_IMM); - get()->rt = rt->getCode(); - get()->rn = operand.base->getCode(); - get()->imm9 = TruncateToUint9(operand.offset); + Get()->rt = rt->Code(); + Get()->rn = operand.base_->Code(); + Get()->imm9 = TruncateToUint9(operand.offset_); if (rt->isX()) { - get()->size = Size64; + Get()->size = Size64; } else if (rt->isW()) { - get()->size = Size32; + Get()->size = Size32; } else { - valid = false; + valid_ = false; return; } - switch (operand.addr_mode) { + switch (operand.addr_mode_) { case AddrMode::PostIndex: wback = true; postindex = true; - get()->addrmode = PostIndex; + Get()->addrmode = PostIndex; break; case AddrMode::PreIndex: wback = true; postindex = false; - get()->addrmode = PreIndex; + Get()->addrmode = PreIndex; break; default: - get()->addrmode = Offset; - valid = false; + Get()->addrmode = Offset; + valid_ = false; } } -A64_STR_UIMM::A64_STR_UIMM() {} -A64_STR_UIMM::A64_STR_UIMM(STRUCT_A64(STR_UIMM) &inst) : A64LoadAndStoreImm(&inst) { - decode(&inst); -} -A64_STR_UIMM::A64_STR_UIMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) { +A64_STR_UIMM::A64_STR_UIMM(void *inst) : A64LoadAndStoreImm(inst) {} +A64_STR_UIMM::A64_STR_UIMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) { } -void A64_STR_UIMM::decode(STRUCT_A64(STR_UIMM) *inst) { - regSize = Size(inst->size); +void A64_STR_UIMM::Disassembler() { + regSize = RegSize(Get()->size); switch (regSize) { case Size64: - rt = XReg(static_cast(inst->rt)); - operand.base = XReg(static_cast(inst->rn)); + rt = XReg(static_cast(Get()->rt)); + operand.base_ = XReg(static_cast(Get()->rn)); break; case Size32: - rt = WReg(static_cast(inst->rt)); - operand.base = WReg(static_cast(inst->rn)); + rt = WReg(static_cast(Get()->rt)); + operand.base_ = WReg(static_cast(Get()->rn)); break; default: - valid = false; + valid_ = false; return; } - operand.addr_mode = AddrMode::Offset; - scale = static_cast(inst->size); - offset = inst->imm12 << regSize; - operand.offset = offset; + operand.addr_mode_ = AddrMode::Offset; + scale = static_cast(Get()->size); + offset = Get()->imm12 << regSize; + operand.offset_ = offset; } -void A64_STR_UIMM::assembler() { +void A64_STR_UIMM::Assembler() { SET_OPCODE(STR_UIMM); ENCODE_RT; - get()->rn = operand.base->getCode(); + Get()->rn = operand.base_->Code(); if (rt->isX()) { - get()->size = Size64; + Get()->size = Size64; } else if (rt->isW()) { - get()->size = Size32; + Get()->size = Size32; } else { - valid = false; + valid_ = false; return; } - get()->imm12 = operand.offset >> get()->size; + Get()->imm12 = operand.offset_ >> Get()->size; } - -A64_MOV_REG::A64_MOV_REG() {} - -A64_MOV_REG::A64_MOV_REG(STRUCT_A64(MOV_REG) &inst) : InstructionA64(&inst) { - decode(&inst); +A64_MOV_REG::A64_MOV_REG(void *inst) : InstructionA64(inst) { } A64_MOV_REG::A64_MOV_REG(RegisterA64 &rd, RegisterA64 &rm) : rd(&rd), rm(&rm) { } -void A64_MOV_REG::decode(A64_STRUCT_MOV_REG *inst) { - if (inst->sf == 1) { +void A64_MOV_REG::Disassembler() { + if (Get()->sf == 1) { DECODE_RD(XReg); DECODE_RM(XReg); } else { @@ -502,418 +448,391 @@ void A64_MOV_REG::decode(A64_STRUCT_MOV_REG *inst) { } } -void A64_MOV_REG::assembler() { +void A64_MOV_REG::Assembler() { SET_OPCODE_MULTI(MOV_REG, 1); SET_OPCODE_MULTI(MOV_REG, 2); - get()->sf = rd->isX() ? 1 : 0; + Get()->sf = rd->isX() ? 1 : 0; ENCODE_RD; ENCODE_RM; } - - -A64_SUB_EXT_REG::A64_SUB_EXT_REG() {} - -A64_SUB_EXT_REG::A64_SUB_EXT_REG(STRUCT_A64(SUB_EXT_REG) &inst) : InstructionA64(&inst) { - decode(&inst); -} +A64_SUB_EXT_REG::A64_SUB_EXT_REG(void *inst) : InstructionA64(inst) {} A64_SUB_EXT_REG::A64_SUB_EXT_REG(RegisterA64 &rd, RegisterA64 &rn, const Operand &operand, FlagsUpdate flagsUpdate) : rd(&rd), rn(&rn), operand(operand), flagsUpdate(flagsUpdate) {} -void A64_SUB_EXT_REG::decode(STRUCT_A64(SUB_EXT_REG) *inst) { - flagsUpdate = FlagsUpdate(inst->S); - if (inst->sf == 1) { +void A64_SUB_EXT_REG::Disassembler() { + flagsUpdate = FlagsUpdate(Get()->S); + if (Get()->sf == 1) { DECODE_RD(XReg); DECODE_RN(XReg); - operand.reg = XReg(static_cast(inst->rm)); + operand.reg_ = XReg(static_cast(Get()->rm)); } else { DECODE_RD(WReg); DECODE_RN(WReg); - operand.reg = XReg(static_cast(inst->rm)); + operand.reg_ = XReg(static_cast(Get()->rm)); } - operand.extend = Extend(inst->option); - INST_ASSERT(inst->imm3 > 4); - operand.shift = Shift(inst->imm3); + operand.extend_ = Extend(Get()->option); + INST_ASSERT(Get()->imm3 > 4); + operand.shift_ = Shift(Get()->imm3); } -void A64_SUB_EXT_REG::assembler() { +void A64_SUB_EXT_REG::Assembler() { SET_OPCODE_MULTI(SUB_EXT_REG, 1); SET_OPCODE_MULTI(SUB_EXT_REG, 2); - get()->S = flagsUpdate; - get()->sf = rd->isX() ? 1 : 0; - get()->option = operand.extend; - get()->imm3 = operand.shift; - get()->rm = operand.reg->getCode(); + Get()->S = flagsUpdate; + Get()->sf = rd->isX() ? 1 : 0; + Get()->option = operand.extend_; + Get()->imm3 = operand.shift_; + Get()->rm = operand.reg_->Code(); ENCODE_RN; ENCODE_RD; } - -A64_EXCEPTION_GEN::A64_EXCEPTION_GEN() {} - -A64_EXCEPTION_GEN::A64_EXCEPTION_GEN(STRUCT_A64(EXCEPTION_GEN) &inst) : InstructionA64(&inst) { - decode(&inst); +A64_EXCEPTION_GEN::A64_EXCEPTION_GEN(void* inst) : InstructionA64(inst) { } A64_EXCEPTION_GEN::A64_EXCEPTION_GEN(A64_EXCEPTION_GEN::OP op, ExceptionLevel el, U16 imme) : op( op), el(el), imme(imme) {} -void A64_EXCEPTION_GEN::decode(STRUCT_A64(EXCEPTION_GEN) *inst) { +void A64_EXCEPTION_GEN::Disassembler() { DECODE_OP; - el = ExceptionLevel(inst->ll); - imme = static_cast(inst->imm16); + el = ExceptionLevel(Get()->ll); + imme = static_cast(Get()->imm16); } -void A64_EXCEPTION_GEN::assembler() { +void A64_EXCEPTION_GEN::Assembler() { SET_OPCODE_MULTI(EXCEPTION_GEN, 1); SET_OPCODE_MULTI(EXCEPTION_GEN, 2); ENCODE_OP; - get()->ll = el; - get()->imm16 = imme; + Get()->ll = el; + Get()->imm16 = imme; } A64_SVC::A64_SVC(U16 imme) : A64_EXCEPTION_GEN(XXC, EL1,imme) {} -A64_SVC::A64_SVC() {} +A64_SVC::A64_SVC(void *inst) : A64_EXCEPTION_GEN(inst) {} -A64_SVC::A64_SVC(STRUCT_A64(SVC) &inst) : A64_EXCEPTION_GEN(inst) {} - -A64_LDR_IMM::A64_LDR_IMM() {} - -A64_LDR_IMM::A64_LDR_IMM(STRUCT_A64(LDR_IMM) &inst) : A64LoadAndStoreImm(&inst) { - decode(&inst); +A64_LDR_IMM::A64_LDR_IMM(void *inst) : A64LoadAndStoreImm(inst) { } A64_LDR_IMM::A64_LDR_IMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) {} -void A64_LDR_IMM::decode(STRUCT_A64(LDR_IMM) *inst) { - regSize = Size(inst->size); +void A64_LDR_IMM::Disassembler() { + regSize = RegSize(Get()->size); switch (regSize) { case Size64: - rt = XReg(static_cast(inst->rt)); - operand.base = XReg(static_cast(inst->rn)); + rt = XReg(static_cast(Get()->rt)); + operand.base_ = XReg(static_cast(Get()->rn)); break; case Size32: - rt = WReg(static_cast(inst->rt)); - operand.base = WReg(static_cast(inst->rn)); + rt = WReg(static_cast(Get()->rt)); + operand.base_ = WReg(static_cast(Get()->rn)); break; default: - valid = false; + valid_ = false; return; } - addrMode = AdMod(inst->addrmode); + addrMode = AdMod(Get()->addrmode); switch (addrMode) { case PostIndex: wback = true; postindex = true; - operand.addr_mode = AddrMode::PostIndex; + operand.addr_mode_ = AddrMode::PostIndex; break; case PreIndex: wback = true; postindex = false; - operand.addr_mode = AddrMode::PreIndex; + operand.addr_mode_ = AddrMode::PreIndex; break; default: - operand.addr_mode = AddrMode::Offset; - valid = false; + operand.addr_mode_ = AddrMode::Offset; + valid_ = false; } - scale = static_cast(inst->size); - offset = signExtend64(9, inst->imm9); - operand.offset = offset; + scale = static_cast(Get()->size); + offset = SignExtend64(9, Get()->imm9); + operand.offset_ = offset; } -void A64_LDR_IMM::assembler() { +void A64_LDR_IMM::Assembler() { SET_OPCODE(LDR_IMM); - get()->rt = rt->getCode(); - get()->rn = operand.base->getCode(); - get()->imm9 = TruncateToUint9(operand.offset); + Get()->rt = rt->Code(); + Get()->rn = operand.base_->Code(); + Get()->imm9 = TruncateToUint9(operand.offset_); if (rt->isX()) { - get()->size = Size64; + Get()->size = Size64; } else if (rt->isW()) { - get()->size = Size32; + Get()->size = Size32; } else { - valid = false; + valid_ = false; return; } - switch (operand.addr_mode) { + switch (operand.addr_mode_) { case AddrMode::PostIndex: wback = true; postindex = true; - get()->addrmode = PostIndex; + Get()->addrmode = PostIndex; break; case AddrMode::PreIndex: wback = true; postindex = false; - get()->addrmode = PreIndex; + Get()->addrmode = PreIndex; break; default: - get()->addrmode = Offset; - valid = false; + Get()->addrmode = Offset; + valid_ = false; } } -A64_LDR_UIMM::A64_LDR_UIMM() {} -A64_LDR_UIMM::A64_LDR_UIMM(STRUCT_A64(LDR_UIMM) &inst) : A64LoadAndStoreImm(&inst) { - decode(&inst); +A64_LDR_UIMM::A64_LDR_UIMM(void *inst) : A64LoadAndStoreImm(&inst) { } A64_LDR_UIMM::A64_LDR_UIMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) {} -void A64_LDR_UIMM::decode(STRUCT_A64(LDR_UIMM) *inst) { - regSize = Size(inst->size); +void A64_LDR_UIMM::Disassembler() { + regSize = RegSize(Get()->size); switch (regSize) { case Size64: - rt = XReg(static_cast(inst->rt)); - operand.base = XReg(static_cast(inst->rn)); + rt = XReg(static_cast(Get()->rt)); + operand.base_ = XReg(static_cast(Get()->rn)); break; case Size32: - rt = WReg(static_cast(inst->rt)); - operand.base = WReg(static_cast(inst->rn)); + rt = WReg(static_cast(Get()->rt)); + operand.base_ = WReg(static_cast(Get()->rn)); break; default: - valid = false; + valid_ = false; return; } - operand.addr_mode = AddrMode::Offset; - scale = static_cast(inst->size); - offset = inst->imm12 << regSize; - operand.offset = offset; + operand.addr_mode_ = AddrMode::Offset; + scale = static_cast(Get()->size); + offset = Get()->imm12 << regSize; + operand.offset_ = offset; } -void A64_LDR_UIMM::assembler() { +void A64_LDR_UIMM::Assembler() { SET_OPCODE(LDR_UIMM); - get()->rt = rt->getCode(); - get()->rn = operand.base->getCode(); + Get()->rt = rt->Code(); + Get()->rn = operand.base_->Code(); if (rt->isX()) { - get()->size = Size64; + Get()->size = Size64; } else if (rt->isW()) { - get()->size = Size32; + Get()->size = Size32; } else { - valid = false; + valid_ = false; return; } - get()->imm12 = static_cast(operand.offset >> get()->size); + Get()->imm12 = static_cast(operand.offset_ >> Get()->size); } -A64_LDRSW_IMM::A64_LDRSW_IMM() {} -A64_LDRSW_IMM::A64_LDRSW_IMM(STRUCT_A64(LDRSW_IMM) &inst) : A64_LDR_IMM(inst) {} +A64_LDRSW_IMM::A64_LDRSW_IMM(void *inst) : A64_LDR_IMM(inst) {} A64_LDRSW_IMM::A64_LDRSW_IMM(RegisterA64 &rt, const MemOperand &operand) : A64_LDR_IMM(rt, operand) {} -void A64_LDRSW_IMM::decode(STRUCT_A64(LDR_IMM) *inst) { - rt = XReg(static_cast(inst->rt)); - addrMode = AdMod(inst->addrmode); +void A64_LDRSW_IMM::Disassembler() { + rt = XReg(static_cast(Get()->rt)); + addrMode = AdMod(Get()->addrmode); switch (addrMode) { case PostIndex: wback = true; postindex = true; - operand.addr_mode = AddrMode::PostIndex; + operand.addr_mode_ = AddrMode::PostIndex; break; case PreIndex: wback = true; postindex = false; - operand.addr_mode = AddrMode::PreIndex; + operand.addr_mode_ = AddrMode::PreIndex; break; default: - valid = false; + valid_ = false; return; } - scale = static_cast(inst->size); - offset = signExtend64(9, inst->imm9); - operand.offset = offset; - rt = XReg(static_cast(inst->rt)); - operand.base = XReg(static_cast(inst->rn)); + scale = static_cast(Get()->size); + offset = SignExtend64(9, Get()->imm9); + operand.offset_ = offset; + rt = XReg(static_cast(Get()->rt)); + operand.base_ = XReg(static_cast(Get()->rn)); } -void A64_LDRSW_IMM::assembler() { +void A64_LDRSW_IMM::Assembler() { SET_OPCODE(LDRSW_IMM); - get()->size = Size32; - get()->rt = rt->getCode(); - get()->rn = operand.base->getCode(); - get()->imm9 = TruncateToUint9(operand.offset); - switch (operand.addr_mode) { + Get()->size = Size32; + Get()->rt = rt->Code(); + Get()->rn = operand.base_->Code(); + Get()->imm9 = TruncateToUint9(operand.offset_); + switch (operand.addr_mode_) { case AddrMode::PostIndex: wback = true; postindex = true; - get()->addrmode = PostIndex; + Get()->addrmode = PostIndex; break; case AddrMode::PreIndex: wback = true; postindex = false; - get()->addrmode = PreIndex; + Get()->addrmode = PreIndex; break; default: - valid = false; + valid_ = false; return; } } - -A64_LDRSW_UIMM::A64_LDRSW_UIMM() {} - -A64_LDRSW_UIMM::A64_LDRSW_UIMM(STRUCT_A64(LDR_UIMM) &inst) : A64_LDR_UIMM(inst) {} +A64_LDRSW_UIMM::A64_LDRSW_UIMM(void *inst) : A64_LDR_UIMM(inst) {} A64_LDRSW_UIMM::A64_LDRSW_UIMM(XRegister &rt, const MemOperand &operand) : A64_LDR_UIMM(rt, operand) {} -void A64_LDRSW_UIMM::decode(STRUCT_A64(LDR_UIMM) *inst) { +void A64_LDRSW_UIMM::Disassembler() { DECODE_RT(XReg); - operand.base = XReg(static_cast(inst->rn)); - operand.addr_mode = AddrMode::Offset; - scale = static_cast(inst->size); - offset = inst->imm12 << Size32; - operand.offset = offset; + operand.base_ = XReg(static_cast(Get()->rn)); + operand.addr_mode_ = AddrMode::Offset; + scale = static_cast(Get()->size); + offset = Get()->imm12 << Size32; + operand.offset_ = offset; } -void A64_LDRSW_UIMM::assembler() { +void A64_LDRSW_UIMM::Assembler() { SET_OPCODE(LDRSW_UIMM); - get()->size = Size32; + Get()->size = Size32; ENCODE_RT; - get()->rn = operand.base->getCode(); - get()->imm12 = operand.offset >> Size32; + Get()->rn = operand.base_->Code(); + Get()->imm12 = operand.offset_ >> Size32; } -A64_STP_LDP::A64_STP_LDP(A64_STRUCT_STP_LDP &inst) : InstructionA64(&inst) { - decode(&inst); +A64_STP_LDP::A64_STP_LDP(void *inst) : InstructionA64(&inst) { } A64_STP_LDP::A64_STP_LDP(OP op, RegisterA64 &rt1, RegisterA64 &rt2, const MemOperand &operand) : op(op), rt1(&rt1), rt2(&rt2), operand(operand) {} -void A64_STP_LDP::decode(A64_STRUCT_STP_LDP *inst) { +void A64_STP_LDP::Disassembler() { DECODE_OP; - Size s = Size(inst->size); + RegSize s = RegSize(Get()->size); if (s == Size64) { - rt1 = XReg(inst->rt); - rt2 = XReg(inst->rt2); - operand.offset = signExtend64(7, inst->imm7) << 3; + rt1 = XReg(Get()->rt); + rt2 = XReg(Get()->rt2); + operand.offset_ = SignExtend64(7, Get()->imm7) << 3; } else { - rt1 = WReg(inst->rt); - rt2 = WReg(inst->rt2); - operand.offset = signExtend64(7, inst->imm7) << 2; + rt1 = WReg(Get()->rt); + rt2 = WReg(Get()->rt2); + operand.offset_ = SignExtend64(7, Get()->imm7) << 2; } - operand.base = XReg(inst->rn); - AdMod adMod = AdMod(inst->addrmode); + operand.base_ = XReg(Get()->rn); + AdMod adMod = AdMod(Get()->addrmode); switch (adMod) { case SignOffset: - operand.addr_mode = AddrMode::Offset; + operand.addr_mode_ = AddrMode::Offset; break; case PostIndex: - operand.addr_mode = AddrMode::PostIndex; + operand.addr_mode_ = AddrMode::PostIndex; break; case PreIndex: - operand.addr_mode = AddrMode::PreIndex; + operand.addr_mode_ = AddrMode::PreIndex; break; } } -void A64_STP_LDP::assembler() { +void A64_STP_LDP::Assembler() { SET_OPCODE(STP_LDP); ENCODE_OP; - get()->size = rt1->isX() ? Size64 : Size32; - get()->rt = rt1->getCode(); - get()->rt2 = rt2->getCode(); - get()->rn = operand.base->getCode(); - switch (operand.addr_mode) { + Get()->size = rt1->isX() ? Size64 : Size32; + Get()->rt = rt1->Code(); + Get()->rt2 = rt2->Code(); + Get()->rn = operand.base_->Code(); + switch (operand.addr_mode_) { case Offset: - get()->addrmode = SignOffset; + Get()->addrmode = SignOffset; break; case AddrMode::PostIndex: - get()->addrmode = PostIndex; + Get()->addrmode = PostIndex; break; case AddrMode::PreIndex: - get()->addrmode = PreIndex; + Get()->addrmode = PreIndex; break; default: - valid = false; + valid_ = false; } - get()->imm7 = TruncateToUint7(operand.offset >> (rt1->isX() ? 3 : 2)); + Get()->imm7 = TruncateToUint7(operand.offset_ >> (rt1->isX() ? 3 : 2)); } - -A64_ADD_SUB_IMM::A64_ADD_SUB_IMM() {} - -A64_ADD_SUB_IMM::A64_ADD_SUB_IMM(A64_STRUCT_ADD_SUB_IMM &inst) : InstructionA64(&inst) { - decode(&inst); +A64_ADD_SUB_IMM::A64_ADD_SUB_IMM(void *inst) : InstructionA64(&inst) { } A64_ADD_SUB_IMM::A64_ADD_SUB_IMM(A64_ADD_SUB_IMM::OP op, A64_ADD_SUB_IMM::S sign, RegisterA64 &rd, const Operand &operand) : op(op), sign(sign), rd(&rd), operand(operand) {} -void A64_ADD_SUB_IMM::decode(A64_STRUCT_ADD_SUB_IMM *inst) { +void A64_ADD_SUB_IMM::Disassembler() { DECODE_OP; - if (inst->sf == Size64) { + if (Get()->sf == Size64) { DECODE_RD(XReg); - operand.reg = XReg(inst->rn); + operand.reg_ = XReg(Get()->rn); } else { DECODE_RD(XReg); - operand.reg = WReg(inst->rn); + operand.reg_ = WReg(Get()->rn); } - sign = S(inst->S); + sign = S(Get()->S); DECODE_SHIFT; - if (operand.shift == LSL) { - operand.shift_extend_imm = get()->imm12; - } else if (operand.shift == LSR) { - operand.shift_extend_imm = get()->imm12 << 12; + if (operand.shift_ == LSL) { + operand.shift_extend_imm_ = Get()->imm12; + } else if (operand.shift_ == LSR) { + operand.shift_extend_imm_ = Get()->imm12 << 12; } else { - valid = false; + valid_ = false; } } -void A64_ADD_SUB_IMM::assembler() { +void A64_ADD_SUB_IMM::Assembler() { SET_OPCODE(ADD_SUB_IMM); ENCODE_OP; ENCODE_RD; - get()->rn = operand.reg->getCode(); - get()->sf = rd->isX() ? Size64 : Size32; - get()->S = sign; + Get()->rn = operand.reg_->Code(); + Get()->sf = rd->isX() ? Size64 : Size32; + Get()->S = sign; ENCODE_SHIFT; - if (operand.shift == LSL) { - get()->imm12 = operand.shift_extend_imm; - } else if (operand.shift == LSR) { - get()->imm12 = operand.shift_extend_imm >> 12; + if (operand.shift_ == LSL) { + Get()->imm12 = operand.shift_extend_imm_; + } else if (operand.shift_ == LSR) { + Get()->imm12 = operand.shift_extend_imm_ >> 12; } else { - valid = false; + valid_ = false; } } -A64_MSR_MRS::A64_MSR_MRS(A64_STRUCT_MSR_MRS &inst) : InstructionA64(&inst) { - decode(&inst); +A64_MSR_MRS::A64_MSR_MRS(void *inst) : InstructionA64(&inst) { } -A64_MSR_MRS::A64_MSR_MRS(OP op, SystemRegister &systemRegister, RegisterA64 &rt) : op(op), systemRegister( +A64_MSR_MRS::A64_MSR_MRS(OP op, SystemRegister &systemRegister, RegisterA64 &rt) : op(op), system_reg( &systemRegister), rt(&rt) {} -void A64_MSR_MRS::decode(A64_STRUCT_MSR_MRS *inst) { +void A64_MSR_MRS::Disassembler() { DECODE_OP; DECODE_RT(XReg); - //TODO + system_reg->value = static_cast(Get()->sysreg); } -void A64_MSR_MRS::assembler() { +void A64_MSR_MRS::Assembler() { SET_OPCODE(MSR_MRS); ENCODE_OP; ENCODE_RT; - get()->sysreg = systemRegister->value(); + Get()->sysreg = system_reg->value; } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h index 779d1c6d..c22274a3 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/6. // -#ifndef SANDHOOK_NH_INST_ARM64_H -#define SANDHOOK_NH_INST_ARM64_H +#pragma once #include "inst_struct_aarch64.h" #include "instruction.h" @@ -13,10 +12,10 @@ #define INST_A64(X) A64_##X -#define IS_OPCODE_A64(RAW,OP) INST_A64(OP)::is(RAW) +#define IS_OPCODE_A64(RAW,OP) INST_A64(OP)::Is(RAW) #define DEFINE_IS_EXT(X, COND) \ -inline static bool is(InstA64& inst) { \ +inline static bool Is(InstA64& inst) { \ union { \ InstA64 raw; \ STRUCT_A64(X) inst; \ @@ -31,12 +30,13 @@ return COND; \ #define TEST_INST_OPCODE(X, INDEX) inst_test.inst.opcode##INDEX == OPCODE_A64(X##_##INDEX) -#define DEFINE_INST_CODE(X) \ -inline U32 instCode() override { \ -return ENUM_VALUE(InstCodeA64, InstCodeA64::X); \ -} +#define DEFINE_INST(X) class INST_A64(X) : public InstructionA64 + +#define DEFINE_INST_EXT(X,P) class INST_A64(X) : public INST_A64(P) -#define DEFINE_INST(X) class INST_A64(X) : public InstructionA64 +#define DEFINE_INST_EXT_(X,P) class INST_A64(X) : public P + +#define DEFINE_INST_PCREL(X) class INST_A64(X) : public A64_INST_PC_REL #define CAST_A64(X,V) reinterpret_cast(V) @@ -47,33 +47,23 @@ namespace SandHook { namespace AsmA64 { - template - class InstructionA64 : public Instruction { + template + class InstructionA64 : public Instruction { public: InstructionA64() {} - InstructionA64(Inst *inst) : Instruction(inst) {} - - Inst mask(Inst raw) { - return raw & *(this->get()); - } - - U32 size() override; - - static inline S64 signExtend64(unsigned int bits, U64 value) { - return ExtractSignedBitfield64(bits - 1, 0, value); - } + InstructionA64(void *inst) : Instruction(inst) {} - static inline S32 signExtend32(unsigned int bits, U32 value) { - return ExtractSignedBitfield32(bits - 1, 0, value); - } + U32 Size() override { + return 4; + }; - InstType instType() override { + InstType InstType() override { return A64; } - Arch arch() override { + Arch Arch() override { return arm64; } @@ -102,117 +92,108 @@ namespace SandHook { public: inline explicit Operand(){}; inline explicit Operand(S64 imm) - : immediate(imm), reg(&UnknowRegiser), shift(NO_SHIFT), extend(NO_EXTEND), shift_extend_imm(0) {} + : immediate_(imm), reg_(&UnknowRegiser), shift_(NO_SHIFT), extend_(NO_EXTEND), shift_extend_imm_(0) {} inline explicit Operand(RegisterA64* reg, int32_t imm = 0, Shift shift = LSL) - : immediate(0), reg(reg), shift(shift), extend(NO_EXTEND), shift_extend_imm(imm) {} + : immediate_(0), reg_(reg), shift_(shift), extend_(NO_EXTEND), shift_extend_imm_(imm) {} inline explicit Operand(RegisterA64* reg, Extend extend, int32_t imm = 0) - : immediate(0), reg(reg), shift(NO_SHIFT), extend(extend), shift_extend_imm(imm) {} + : immediate_(0), reg_(reg), shift_(NO_SHIFT), extend_(extend), shift_extend_imm_(imm) {} // ===== - bool IsImmediate() const { return reg->is(UnknowRegiser); } - bool IsShiftedRegister() const { return (shift != NO_SHIFT); } - bool IsExtendedRegister() const { return (extend != NO_EXTEND); } + bool IsImmediate() const { return *reg_ == UnknowRegiser; } + bool IsShiftedRegister() const { return (shift_ != NO_SHIFT); } + bool IsExtendedRegister() const { return (extend_ != NO_EXTEND); } public: - S64 immediate; - RegisterA64* reg; - Shift shift; - Extend extend; - int32_t shift_extend_imm; + S64 immediate_; + RegisterA64* reg_; + Shift shift_; + Extend extend_; + int32_t shift_extend_imm_; }; class MemOperand { public: inline explicit MemOperand() {} inline explicit MemOperand(RegisterA64* base, Off offset = 0, AddrMode addr_mode = Offset) - : base(base), reg_offset(&UnknowRegiser), offset(offset), addr_mode(addr_mode), shift(NO_SHIFT), - extend(NO_EXTEND), shift_extend_imm(0) {} + : base_(base), reg_offset_(&UnknowRegiser), offset_(offset), addr_mode_(addr_mode), shift_(NO_SHIFT), + extend_(NO_EXTEND), shift_extend_imm_(0) {} inline explicit MemOperand(RegisterA64* base, RegisterA64* reg_offset, Extend extend, unsigned extend_imm) - : base(base), reg_offset(reg_offset), offset(0), addr_mode(Offset), shift(NO_SHIFT), extend(extend), - shift_extend_imm(extend_imm) {} + : base_(base), reg_offset_(reg_offset), offset_(0), addr_mode_(Offset), shift_(NO_SHIFT), extend_(extend), + shift_extend_imm_(extend_imm) {} inline explicit MemOperand(RegisterA64* base, RegisterA64* reg_offset, Shift shift = LSL, unsigned shift_imm = 0) - : base(base), reg_offset(reg_offset), offset(0), addr_mode(Offset), shift(shift), extend(NO_EXTEND), - shift_extend_imm(shift_imm) {} + : base_(base), reg_offset_(reg_offset), offset_(0), addr_mode_(Offset), shift_(shift), extend_(NO_EXTEND), + shift_extend_imm_(shift_imm) {} inline explicit MemOperand(RegisterA64* base, const Operand &offset, AddrMode addr_mode = Offset) - : base(base), reg_offset(&UnknowRegiser), addr_mode(addr_mode) { + : base_(base), reg_offset_(&UnknowRegiser), addr_mode_(addr_mode) { if (offset.IsShiftedRegister()) { - reg_offset = offset.reg; - shift = offset.shift; - shift_extend_imm = offset.shift_extend_imm; + reg_offset_ = offset.reg_; + shift_ = offset.shift_; + shift_extend_imm_ = offset.shift_extend_imm_; - extend = NO_EXTEND; - this->offset = 0; + extend_ = NO_EXTEND; + this->offset_ = 0; } else if (offset.IsExtendedRegister()) { - reg_offset = offset.reg; - extend = offset.extend; - shift_extend_imm = offset.shift_extend_imm; + reg_offset_ = offset.reg_; + extend_ = offset.extend_; + shift_extend_imm_ = offset.shift_extend_imm_; - shift = NO_SHIFT; - this->offset = 0; + shift_ = NO_SHIFT; + this->offset_ = 0; } } // ===== - bool IsImmediateOffset() const { return (addr_mode == Offset); } - bool IsRegisterOffset() const { return (addr_mode == Offset); } - bool IsPreIndex() const { return addr_mode == PreIndex; } - bool IsPostIndex() const { return addr_mode == PostIndex; } + bool IsImmediateOffset() const { return (addr_mode_ == Offset); } + bool IsRegisterOffset() const { return (addr_mode_ == Offset); } + bool IsPreIndex() const { return addr_mode_ == PreIndex; } + bool IsPostIndex() const { return addr_mode_ == PostIndex; } public: - RegisterA64* base; - RegisterA64* reg_offset; - Off offset; - AddrMode addr_mode; - Shift shift; - Extend extend; - S32 shift_extend_imm; + RegisterA64* base_; + RegisterA64* reg_offset_; + Off offset_; + AddrMode addr_mode_; + Shift shift_; + Extend extend_; + S32 shift_extend_imm_; }; - class INST_A64(UNKNOW) : public InstructionA64 { + DEFINE_INST(UNKNOW) { public: - A64_UNKNOW(STRUCT_A64(UNKNOW) &inst); + A64_UNKNOW(void *inst) : InstructionA64(inst) {} - DEFINE_INST_CODE(UNKNOW) - - inline bool unknow() override { + INLINE bool Unknow() override { return true; } - - void decode(A64_STRUCT_UNKNOW *inst) override; - - void assembler() override; - - private: - STRUCT_A64(UNKNOW) inst_backup; }; - template - class A64_INST_PC_REL : public InstructionA64 { + template + class A64_INST_PC_REL : public InstructionA64 { public: A64_INST_PC_REL(); - A64_INST_PC_REL(Inst *inst); + A64_INST_PC_REL(void *inst); - virtual Off getImmPCOffset() = 0; + virtual Off GetImmPCOffset() = 0; - virtual Addr getImmPCOffsetTarget(); + virtual Addr GetImmPCOffsetTarget(); - bool pcRelate() override; + bool PcRelate() override; }; - class INST_A64(ADR_ADRP) : public A64_INST_PC_REL { + DEFINE_INST_PCREL(ADR_ADRP) { public: enum OP { @@ -220,29 +201,25 @@ namespace SandHook { ADRP = 0b1, }; - A64_ADR_ADRP(); - - A64_ADR_ADRP(STRUCT_A64(ADR_ADRP) &inst); + A64_ADR_ADRP(void *inst); A64_ADR_ADRP(OP op, XRegister &rd, S64 offset); - A64_ADR_ADRP(OP op, XRegister &rd, Label &label); + A64_ADR_ADRP(OP op, XRegister &rd, Label *label); DEFINE_IS(ADR_ADRP) - DEFINE_INST_CODE(ADR_ADRP) - - bool isADRP() { - return get()->op == OP::ADRP; + bool IsADRP() { + return Get()->op == OP::ADRP; } - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - Addr getImmPCOffsetTarget() override; + Addr GetImmPCOffsetTarget() override; - void decode(A64_STRUCT_ADR_ADRP *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; @@ -252,7 +229,7 @@ namespace SandHook { - class INST_A64(MOV_WIDE) : public InstructionA64 { + DEFINE_INST(MOV_WIDE) { public: enum OP { @@ -271,23 +248,19 @@ namespace SandHook { Shift3 = 48 }; - A64_MOV_WIDE(); - - A64_MOV_WIDE(STRUCT_A64(MOV_WIDE) &inst); + A64_MOV_WIDE(void* inst); A64_MOV_WIDE(A64_MOV_WIDE::OP op, RegisterA64* rd, U16 imme, U8 shift); DEFINE_IS(MOV_WIDE) - DEFINE_INST_CODE(MOV_WIDE) + void Assembler() override; - void assembler() override; - - void decode(STRUCT_A64(MOV_WIDE) *decode) override; + void Disassembler() override; public: //can be 16/32/64/128 - //hw = shift / 16 + //hw = shift_ / 16 U8 shift; OP op; U16 imme; @@ -296,7 +269,7 @@ namespace SandHook { - class INST_A64(B_BL) : public A64_INST_PC_REL { + DEFINE_INST_PCREL(B_BL) { public: enum OP { @@ -304,13 +277,11 @@ namespace SandHook { BL = 0b1 }; - A64_B_BL(); - - A64_B_BL(STRUCT_A64(B_BL) &inst); + A64_B_BL(void *inst) ; A64_B_BL(OP op, Off offset); - A64_B_BL(OP op, Label &l); + A64_B_BL(OP op, Label *l); DEFINE_IS(B_BL) @@ -322,15 +293,13 @@ namespace SandHook { return op; } - DEFINE_INST_CODE(B_BL) - - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - void decode(STRUCT_A64(B_BL) *decode) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: @@ -339,7 +308,7 @@ namespace SandHook { }; - class INST_A64(CBZ_CBNZ) : public A64_INST_PC_REL { + DEFINE_INST_PCREL(CBZ_CBNZ) { public: enum OP { @@ -347,25 +316,21 @@ namespace SandHook { CBNZ = 1 }; - A64_CBZ_CBNZ(); - - A64_CBZ_CBNZ(STRUCT_A64(CBZ_CBNZ) &inst); + A64_CBZ_CBNZ(void *inst); A64_CBZ_CBNZ(OP op, Off offset, RegisterA64 &rt); - A64_CBZ_CBNZ(OP op, Label& label, RegisterA64 &rt); + A64_CBZ_CBNZ(OP op, Label *label, RegisterA64 &rt); DEFINE_IS(CBZ_CBNZ) - DEFINE_INST_CODE(CBZ_CBNZ) - - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void decode(STRUCT_A64(CBZ_CBNZ) *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; @@ -374,27 +339,24 @@ namespace SandHook { }; - class INST_A64(B_COND) : public A64_INST_PC_REL { + DEFINE_INST_PCREL(B_COND) { public: - A64_B_COND(); - A64_B_COND(STRUCT_A64(B_COND) &inst); + A64_B_COND(void *inst); A64_B_COND(Condition condition, Off offset); - A64_B_COND(Condition condition, Label& label); + A64_B_COND(Condition condition, Label *label); DEFINE_IS(B_COND) - DEFINE_INST_CODE(B_COND) + Off GetImmPCOffset() override; - Off getImmPCOffset() override; + void OnOffsetApply(Off offset) override; - void onOffsetApply(Off offset) override; + void Disassembler() override; - void decode(STRUCT_A64(B_COND) *inst) override; - - void assembler() override; + void Assembler() override; public: Condition condition; @@ -402,7 +364,7 @@ namespace SandHook { }; - class INST_A64(TBZ_TBNZ) : public A64_INST_PC_REL { + DEFINE_INST_PCREL(TBZ_TBNZ) { public: enum OP { @@ -410,25 +372,22 @@ namespace SandHook { TBNZ = 1 }; - A64_TBZ_TBNZ(); - A64_TBZ_TBNZ(STRUCT_A64(TBZ_TBNZ) &inst); + A64_TBZ_TBNZ(void *inst); A64_TBZ_TBNZ(OP op, RegisterA64 &rt, U32 bit, Off offset); - A64_TBZ_TBNZ(OP op, RegisterA64 &rt, U32 bit, Label& label); + A64_TBZ_TBNZ(OP op, RegisterA64 &rt, U32 bit, Label* label); DEFINE_IS(TBZ_TBNZ) - DEFINE_INST_CODE(TBZ_TBNZ) - - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void decode(STRUCT_A64(TBZ_TBNZ) *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; @@ -438,7 +397,7 @@ namespace SandHook { }; - class INST_A64(LDR_LIT) : public A64_INST_PC_REL { + DEFINE_INST_PCREL(LDR_LIT) { public: enum OP { @@ -448,25 +407,21 @@ namespace SandHook { LDR_PRFM = 0b11 }; - A64_LDR_LIT(); - - A64_LDR_LIT(STRUCT_A64(LDR_LIT) &inst); + A64_LDR_LIT(void *inst); A64_LDR_LIT(OP op, RegisterA64 &rt, Off offset); - A64_LDR_LIT(OP op, RegisterA64 &rt, Label& label); + A64_LDR_LIT(OP op, RegisterA64 &rt, Label* label); DEFINE_IS(LDR_LIT) - DEFINE_INST_CODE(LDR_LIT) - - Off getImmPCOffset() override; + Off GetImmPCOffset() override; - void onOffsetApply(Off offset) override; + void OnOffsetApply(Off offset) override; - void decode(STRUCT_A64(LDR_LIT) *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; @@ -484,19 +439,15 @@ namespace SandHook { RET = 0b11 }; - A64_BR_BLR_RET(); - - A64_BR_BLR_RET(STRUCT_A64(BR_BLR_RET) &inst); + A64_BR_BLR_RET(void *inst); A64_BR_BLR_RET(OP op, XRegister &rn); DEFINE_IS_EXT(BR_BLR_RET, TEST_INST_OPCODE(BR_BLR_RET, 1) && TEST_INST_OPCODE(BR_BLR_RET, 2) && TEST_INST_OPCODE(BR_BLR_RET,3)) - DEFINE_INST_CODE(BR_BLR_RET) + void Disassembler() override; - void decode(A64_STRUCT_BR_BLR_RET *inst) override; - - void assembler() override; + void Assembler() override; public: OP op; @@ -504,8 +455,8 @@ namespace SandHook { }; - template - class A64LoadAndStoreImm : public InstructionA64 { + template + class A64LoadAndStoreImm : public InstructionA64 { public: enum AdMod { @@ -514,14 +465,12 @@ namespace SandHook { PreIndex = 0b11 }; - enum Size { + enum RegSize { Size32 = 0b10, Size64 = 0b11 }; - A64LoadAndStoreImm() {} - - A64LoadAndStoreImm(Inst *inst) : InstructionA64(inst) {} + A64LoadAndStoreImm(void *inst) : InstructionA64(inst) {} A64LoadAndStoreImm(RegisterA64 *rt, const MemOperand &operand) : rt(rt), operand(operand) {} @@ -529,70 +478,58 @@ namespace SandHook { RegisterA64* rt; MemOperand operand = MemOperand(); protected: + Off offset; AdMod addrMode; - Size regSize; + RegSize regSize; U8 scale; bool wback; bool postindex; - Off offset; }; - class INST_A64(STR_IMM) : public A64LoadAndStoreImm { + DEFINE_INST_EXT_(STR_IMM, A64LoadAndStoreImm) { public: - A64_STR_IMM(); - - A64_STR_IMM(STRUCT_A64(STR_IMM)& inst); + A64_STR_IMM(void *inst); A64_STR_IMM(RegisterA64 &rt, const MemOperand &operand); DEFINE_IS(STR_IMM) - DEFINE_INST_CODE(STR_IMM) - - void decode(STRUCT_A64(STR_IMM) *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; }; - class INST_A64(STR_UIMM) : public A64LoadAndStoreImm { + DEFINE_INST_EXT_(STR_UIMM, A64LoadAndStoreImm) { public: - A64_STR_UIMM(); - - A64_STR_UIMM(STRUCT_A64(STR_UIMM)& inst); + A64_STR_UIMM(void *inst); A64_STR_UIMM(RegisterA64 &rt, const MemOperand &operand); DEFINE_IS(STR_UIMM) - DEFINE_INST_CODE(STR_UIMM) + void Disassembler() override; - void decode(STRUCT_A64(STR_UIMM) *inst) override; - - void assembler() override; + void Assembler() override; }; DEFINE_INST(MOV_REG) { public: - A64_MOV_REG(); - - A64_MOV_REG(STRUCT_A64(MOV_REG) &inst); + A64_MOV_REG(void *inst); A64_MOV_REG(RegisterA64 &rd, RegisterA64 &rm); DEFINE_IS_EXT(MOV_REG, TEST_INST_OPCODE(MOV_REG, 1) && TEST_INST_OPCODE(MOV_REG, 2)) - DEFINE_INST_CODE(MOV_REG) + void Disassembler() override; - void decode(A64_STRUCT_MOV_REG *inst) override; - - void assembler() override; + void Assembler() override; public: RegisterA64* rd; @@ -603,20 +540,16 @@ namespace SandHook { DEFINE_INST(SUB_EXT_REG) { public: - A64_SUB_EXT_REG(); - - A64_SUB_EXT_REG(STRUCT_A64(SUB_EXT_REG) &inst); + A64_SUB_EXT_REG(void *inst); A64_SUB_EXT_REG(RegisterA64 &rd, RegisterA64 &rn, const Operand &operand, FlagsUpdate flagsUpdate); DEFINE_IS_EXT(SUB_EXT_REG, TEST_INST_OPCODE(SUB_EXT_REG, 1) && TEST_INST_OPCODE(SUB_EXT_REG, 2)) - DEFINE_INST_CODE(SUB_EXT_REG) + void Disassembler() override; - void decode(A64_STRUCT_SUB_EXT_REG *inst) override; - - void assembler() override; + void Assembler() override; public: @@ -637,19 +570,15 @@ namespace SandHook { DCP = 0b101 }; - A64_EXCEPTION_GEN(); - - A64_EXCEPTION_GEN(STRUCT_A64(EXCEPTION_GEN) &inst); + A64_EXCEPTION_GEN(void *inst); A64_EXCEPTION_GEN(OP op, ExceptionLevel el, U16 imme); DEFINE_IS_EXT(EXCEPTION_GEN, TEST_INST_OPCODE(EXCEPTION_GEN, 1) && TEST_INST_OPCODE(EXCEPTION_GEN, 2)) - DEFINE_INST_CODE(EXCEPTION_GEN) - - void decode(STRUCT_A64(EXCEPTION_GEN) *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; @@ -658,89 +587,77 @@ namespace SandHook { }; - class INST_A64(SVC) : public INST_A64(EXCEPTION_GEN) { + DEFINE_INST_EXT(SVC, EXCEPTION_GEN) { public: - A64_SVC(U16 imme); - A64_SVC(); + A64_SVC(U16 imme); - A64_SVC(STRUCT_A64(SVC) &inst); + A64_SVC(void *inst); DEFINE_IS_EXT(EXCEPTION_GEN, TEST_INST_OPCODE(EXCEPTION_GEN, 1) && TEST_INST_OPCODE(EXCEPTION_GEN, 2) && TEST_INST_FIELD(op, XXC) && TEST_INST_FIELD(ll, EL1)) - DEFINE_INST_CODE(SVC) }; - class INST_A64(LDR_IMM) : public A64LoadAndStoreImm { + DEFINE_INST_EXT_(LDR_IMM, A64LoadAndStoreImm) { public: - A64_LDR_IMM(); - A64_LDR_IMM(STRUCT_A64(LDR_IMM) &inst); + A64_LDR_IMM(void *inst); A64_LDR_IMM(RegisterA64 &rt, const MemOperand &operand); DEFINE_IS(LDR_IMM) - DEFINE_INST_CODE(LDR_IMM) + void Disassembler() override; - void decode(STRUCT_A64(LDR_IMM) *inst) override; - - void assembler() override; + void Assembler() override; }; - class INST_A64(LDR_UIMM) : public A64LoadAndStoreImm { + DEFINE_INST_EXT_(LDR_UIMM, A64LoadAndStoreImm) { public: - A64_LDR_UIMM(); - A64_LDR_UIMM(STRUCT_A64(LDR_UIMM) &inst); + A64_LDR_UIMM(void *inst); A64_LDR_UIMM(RegisterA64 &rt, const MemOperand &operand); DEFINE_IS(LDR_UIMM) - DEFINE_INST_CODE(LDR_UIMM) - - void decode(STRUCT_A64(LDR_UIMM) *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; }; - - class INST_A64(LDRSW_IMM) : public INST_A64(LDR_IMM) { + DEFINE_INST_EXT(LDRSW_IMM, LDR_IMM) { public: - A64_LDRSW_IMM(); - A64_LDRSW_IMM(STRUCT_A64(LDRSW_IMM) &inst); + A64_LDRSW_IMM(void *inst); A64_LDRSW_IMM(RegisterA64 &rt, const MemOperand &operand); - DEFINE_IS_EXT(LDRSW_IMM, TEST_INST_FIELD(opcode, OPCODE_A64(LDRSW_IMM)) && TEST_INST_FIELD(size, Size32)) - - DEFINE_INST_CODE(LDRSW_IMM) + DEFINE_IS_EXT(LDRSW_IMM, TEST_INST_FIELD(opcode, OPCODE_A64(LDRSW_IMM)) && + TEST_INST_FIELD(size , Size32)) - void decode(STRUCT_A64(LDR_IMM) *inst) override; + void Disassembler() override; - void assembler() override; - }; + void Assembler() override; + }; - class INST_A64(LDRSW_UIMM) : public INST_A64(LDR_UIMM) { + DEFINE_INST_EXT(LDRSW_UIMM, LDR_UIMM) { public: A64_LDRSW_UIMM(); - A64_LDRSW_UIMM(STRUCT_A64(LDR_UIMM) &inst); + A64_LDRSW_UIMM(void *inst); A64_LDRSW_UIMM(XRegister &rt, const MemOperand &operand); - DEFINE_IS_EXT(LDRSW_UIMM, TEST_INST_FIELD(opcode, OPCODE_A64(LDRSW_UIMM)) && TEST_INST_FIELD(size, Size32)) + DEFINE_IS_EXT(LDRSW_UIMM, TEST_INST_FIELD(opcode, OPCODE_A64(LDRSW_UIMM)) && + TEST_INST_FIELD(size, Size32)) - DEFINE_INST_CODE(LDRSW_UIMM) + void Disassembler() override; - void decode(STRUCT_A64(LDR_UIMM) *inst) override; - - void assembler() override; + void Assembler() override; }; @@ -757,22 +674,20 @@ namespace SandHook { PreIndex = 0b11 }; - enum Size { + enum RegSize { Size32 = 0b00, Size64 = 0b10 }; - A64_STP_LDP(A64_STRUCT_STP_LDP &inst); + A64_STP_LDP(void *inst); A64_STP_LDP(OP op, RegisterA64 &rt1, RegisterA64 &rt2, const MemOperand &operand); DEFINE_IS(STP_LDP) - DEFINE_INST_CODE(STP_LDP) - - void decode(A64_STRUCT_STP_LDP *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; @@ -795,24 +710,20 @@ namespace SandHook { UnSign = 0b0 }; - enum Size { + enum RegSize { Size32 = 0b0, Size64 = 0b1 }; - A64_ADD_SUB_IMM(); - - A64_ADD_SUB_IMM(A64_STRUCT_ADD_SUB_IMM &inst); + A64_ADD_SUB_IMM(void *inst); A64_ADD_SUB_IMM(OP op, S sign, RegisterA64 &rd, const Operand &operand); DEFINE_IS(ADD_SUB_IMM) - DEFINE_INST_CODE(ADD_SUB_IMM) + void Disassembler() override; - void decode(A64_STRUCT_ADD_SUB_IMM *inst) override; - - void assembler() override; + void Assembler() override; public: OP op; @@ -830,21 +741,19 @@ namespace SandHook { MRS = 1 }; - A64_MSR_MRS(A64_STRUCT_MSR_MRS &inst); + A64_MSR_MRS(void *inst); A64_MSR_MRS(OP op, SystemRegister &systemRegister, RegisterA64 &rt); - DEFINE_INST_CODE(MSR_MRS) - DEFINE_IS(MSR_MRS) - void decode(A64_STRUCT_MSR_MRS *inst) override; + void Disassembler() override; - void assembler() override; + void Assembler() override; public: OP op; - SystemRegister* systemRegister; + SystemRegister* system_reg; RegisterA64* rt; }; @@ -858,5 +767,6 @@ namespace SandHook { #undef TEST_INST_FIELD #undef TEST_INST_OPCODE #undef DEFINE_INST_CODE - -#endif //SANDHOOK_NH_INST_ARM64_H +#undef DEFINE_INST_EXT +#undef DEFINE_INST_EXT_ +#undef DEFINE_INST_PCREL diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_code_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_code_arm64.h index 923d1181..30c9d6e1 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_code_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_code_arm64.h @@ -2,12 +2,11 @@ // Created by swift on 2019/5/8. // -#ifndef SANDHOOK_NH_INST_CODE_ARM64_H -#define SANDHOOK_NH_INST_CODE_ARM64_H +#pragma once #include "inst_struct_aarch64.h" -enum class InstCodeA64 { +enum class InstCodeA64 : InstCode { UNKNOW, MOV_WIDE, MOV_REG, @@ -30,6 +29,4 @@ enum class InstCodeA64 { STP_LDP, ADD_SUB_IMM, MSR_MRS -}; - -#endif //SANDHOOK_NH_INST_CODE_ARM64_H +}; \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_struct_aarch64.h b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_struct_aarch64.h index 5e3526b1..29a2ecff 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_struct_aarch64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_struct_aarch64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/5. // -#ifndef SANDHOOK_NH_INST_AARCH64_H -#define SANDHOOK_NH_INST_AARCH64_H +#pragma once #include "instruction.h" @@ -39,7 +38,7 @@ enum FieldWide { WideReg = 5, }; -//unknow inst +//Unknow inst DEFINE_STRUCT_A64(UNKNOW) { InstA64 raw; }; @@ -233,6 +232,4 @@ DEFINE_STRUCT_A64(MSR_MRS) { InstA64 sysreg:16; InstA64 op:1; InstA64 opcode:10; -}; - -#endif //SANDHOOK_NH_INST_AARCH64_H +}; \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.cpp index 2ef4d92e..4a8b895e 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.cpp @@ -26,7 +26,7 @@ XRegister::XRegister(U8 code) : RegisterA64(code) {} XRegister::XRegister() {} -U8 XRegister::getWide() { +U8 XRegister::Wide() { return Reg64Bit; } @@ -43,6 +43,6 @@ WRegister::WRegister(U8 code) : RegisterA64(code) {} WRegister::WRegister() {} -U8 WRegister::getWide() { +U8 WRegister::Wide() { return Reg32Bit; } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.h index 0ff856f1..9d87d5d8 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/register/register_arm64.h @@ -1,9 +1,7 @@ // // Created by swift on 2019/5/8. // - -#ifndef SANDHOOK_NH_REGISTER_A64_H -#define SANDHOOK_NH_REGISTER_A64_H +#pragma once #include "register.h" @@ -62,7 +60,7 @@ namespace SandHook { XRegister(); XRegister(U8 code); - U8 getWide() override; + U8 Wide() override; static XRegister* get(U8 code) { return registers[code]; @@ -75,9 +73,10 @@ namespace SandHook { class WRegister : public RegisterA64 { public: WRegister(); + WRegister(U8 code); - U8 getWide() override; + U8 Wide() override; static WRegister* get(U8 code) { return registers[code]; @@ -87,6 +86,8 @@ namespace SandHook { static WRegister* registers[]; }; + + class SystemRegister { public: @@ -98,34 +99,31 @@ namespace SandHook { U16 op0:2; }; + SystemRegister(U16 value) : value(value) {} + SystemRegister(U16 op0, U16 op1, U16 crn, U16 crm, U16 op2) { reg.op0 = op0; reg.op1 = op1; reg.CRn = crn; reg.CRm = crm; reg.op2 = op2; + value = ForceCast(reg); } - U16 value() { - - union { - U16 raw; - SystemReg reg; - } ret; - - ret.reg = reg; + bool operator==(const SystemRegister &rhs) const { + return value == rhs.value; + } - return ret.raw; + bool operator!=(const SystemRegister &rhs) const { + return !(rhs == *this); } public: + U16 value; SystemReg reg; }; - } -} - -#endif //SANDHOOK_NH_REGISTER_A64_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.cpp index 3fa3de5f..d48577eb 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.cpp @@ -18,7 +18,7 @@ namespace SandHook { XRegister IP0 = X16; XRegister IP1 = X17; XRegister LR = X30; -//zero reg +//zero reg_ XRegister XZR = X31; WRegister WZR = W31; RegisterA64 UnknowRegiser = RegisterA64(38); diff --git a/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.h index 31a44ab3..0a53c654 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/register/register_list_arm64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/8. // -#ifndef SANDHOOK_NH_REGISTER_LIST_A64_H -#define SANDHOOK_NH_REGISTER_LIST_A64_H +#pragma once #include "register_arm64.h" #include "base.h" @@ -34,7 +33,7 @@ namespace SandHook { extern XRegister IP0; extern XRegister IP1; extern XRegister LR; -//zero reg +//zero reg_ extern XRegister XZR; extern WRegister WZR; extern RegisterA64 UnknowRegiser; @@ -58,6 +57,4 @@ namespace SandHook { } #define XReg(N) XRegister::get(N) -#define WReg(N) WRegister::get(N) - -#endif //SANDHOOK_NH_REGISTER_LIST_A64_H +#define WReg(N) WRegister::get(N) \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp index c1f40f55..8519a1c7 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp @@ -24,10 +24,10 @@ CodeRelocateA64::CodeRelocateA64(AssemblerA64 &assembler) : CodeRelocate(assembl assemblerA64 = &assembler; } -bool CodeRelocateA64::visit(Unit *unit, void *pc) { - relocate(reinterpret_cast *>(unit), __ getPC()); - curOffset += unit->size(); - if (unit->refcount() == 0) { +bool CodeRelocateA64::Visit(Unit *unit, void *pc) { + relocate(reinterpret_cast(unit), __ GetPC()); + curOffset += unit->Size(); + if (unit->RefCount() == 0) { delete unit; } return true; @@ -38,28 +38,28 @@ void* CodeRelocateA64::relocate(void *startPc, Addr len, void *toPc = nullptr) t startAddr = reinterpret_cast(startPc); length = len; curOffset = 0; - __ allocBufferFirst(static_cast(len * 8)); - void* curPc = __ getPC(); + __ AllocBufferFirst(static_cast(len * 8)); + void* curPc = __ GetPC(); if (toPc == nullptr) { - Disassembler::get()->decode(startPc, len, *this, true); + Disassembler::get()->Disassembler(startPc, len, *this, true); } else { //TODO } return curPc; } -void* CodeRelocateA64::relocate(Instruction *instruction, void *toPc) throw(ErrorCodeException) { - void* curPc = __ getPC(); +void* CodeRelocateA64::relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { + void* curPc = __ GetPC(); - //insert later bind labels + //insert later AddBind labels __ Emit(getLaterBindLabel(curOffset)); - if (!instruction->pcRelate()) { + if (!instruction->PcRelate()) { __ Emit(instruction); - instruction->ref(); + instruction->Ref(); return curPc; } - switch (instruction->instCode()) { + switch (instruction->InstCode()) { CASE(B_BL) CASE(B_COND) CASE(TBZ_TBNZ) @@ -68,7 +68,7 @@ void* CodeRelocateA64::relocate(Instruction *instruction, void *toPc) thro CASE(ADR_ADRP) default: __ Emit(instruction); - instruction->ref(); + instruction->Ref(); } return curPc; } @@ -76,13 +76,13 @@ void* CodeRelocateA64::relocate(Instruction *instruction, void *toPc) thro IMPL_RELOCATE(B_BL) { if (inRelocateRange(inst->offset, sizeof(InstA64))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(inst->offset + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->Ref(); + inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); if (inst->op == inst->BL) { Addr lr = reinterpret_cast(toPc); @@ -98,13 +98,13 @@ IMPL_RELOCATE(B_BL) { IMPL_RELOCATE(B_COND) { if (inRelocateRange(inst->offset, sizeof(InstA64))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(inst->offset + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->Ref(); + inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); Label *true_label = new Label(); Label *false_label = new Label(); @@ -122,13 +122,13 @@ IMPL_RELOCATE(B_COND) { IMPL_RELOCATE(TBZ_TBNZ) { if (inRelocateRange(inst->offset, sizeof(InstA64))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(inst->offset + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->Ref(); + inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); Label *true_label = new Label(); Label *false_label = new Label(); @@ -150,13 +150,13 @@ IMPL_RELOCATE(TBZ_TBNZ) { IMPL_RELOCATE(CBZ_CBNZ) { if (inRelocateRange(inst->offset, sizeof(InstA64))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(inst->offset + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->Ref(); + inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } - Addr targetAddr = inst->getImmPCOffsetTarget(); + Addr targetAddr = inst->GetImmPCOffsetTarget(); Label *true_label = new Label(); Label *false_label = new Label(); @@ -177,14 +177,14 @@ IMPL_RELOCATE(CBZ_CBNZ) { } IMPL_RELOCATE(LDR_LIT) { - Addr targetAddr = inst->getImmPCOffsetTarget(); - XRegister* rtX = XReg(inst->rt->getCode()); - WRegister* rtW = WReg(inst->rt->getCode()); + Addr targetAddr = inst->GetImmPCOffsetTarget(); + XRegister* rtX = XReg(inst->rt->Code()); + WRegister* rtW = WReg(inst->rt->Code()); if (inRelocateRange(inst->offset, sizeof(Addr))) { - inst->ref(); - inst->bindLabel(*getLaterBindLabel(inst->offset + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->Ref(); + inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } @@ -211,5 +211,5 @@ IMPL_RELOCATE(LDR_LIT) { } IMPL_RELOCATE(ADR_ADRP) { - __ Mov(*inst->rd, inst->getImmPCOffsetTarget()); + __ Mov(*inst->rd, inst->GetImmPCOffsetTarget()); } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h index e25fc27c..d553dfd8 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/12. // -#ifndef SANDHOOK_NH_CODE_RELOCATE_A64_H -#define SANDHOOK_NH_CODE_RELOCATE_A64_H +#pragma once #include #include @@ -23,11 +22,11 @@ namespace SandHook { public: CodeRelocateA64(AssemblerA64 &assembler); - void* relocate(Instruction *instruction, void *toPc) throw(ErrorCodeException) override; + void* relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) override; void* relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; - bool visit(Unit *unit, void *pc) override; + bool Visit(Unit *unit, void *pc) override; DEFINE_RELOCATE(B_BL) @@ -49,6 +48,4 @@ namespace SandHook { } } -#undef DEFINE_RELOCATE - -#endif //SANDHOOK_NH_CODE_RELOCATE_A64_H +#undef DEFINE_RELOCATE \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm_base.h b/nativehook/src/main/cpp/archs/arm/arm_base.h index f4cf9a6c..335151c9 100644 --- a/nativehook/src/main/cpp/archs/arm/arm_base.h +++ b/nativehook/src/main/cpp/archs/arm/arm_base.h @@ -2,30 +2,29 @@ // Created by swift on 2019/5/16. // -#ifndef SANDHOOK_ARM_BASE_H -#define SANDHOOK_ARM_BASE_H +#pragma once // Condition codes. enum Condition { - eq = 0, // Z set Equal. + eq = 0, // Z Set Equal. ne = 1, // Z clear Not equal. - cs = 2, // C set Carry set. + cs = 2, // C Set Carry Set. cc = 3, // C clear Carry clear. - mi = 4, // N set Negative. + mi = 4, // N Set Negative. pl = 5, // N clear Positive or zero. - vs = 6, // V set Overflow. + vs = 6, // V Set Overflow. vc = 7, // V clear No overflow. - hi = 8, // C set, Z clear Unsigned higher. - ls = 9, // C clear or Z set Unsigned lower or same. + hi = 8, // C Set, Z clear Unsigned higher. + ls = 9, // C clear or Z Set Unsigned lower or same. ge = 10, // N == V Greater or equal. lt = 11, // N != V Less than. gt = 12, // Z clear, N == V Greater than. - le = 13, // Z set or N != V Less then or equal + le = 13, // Z Set or N != V Less then or equal al = 14, // Always. nv = 15, // Behaves as always/al. // Aliases. - hs = cs, // C set Unsigned higher or same. + hs = cs, // C Set Unsigned higher or same. lo = cc // C clear Unsigned lower. }; @@ -42,31 +41,29 @@ enum Shift { enum AddrMode { Offset, PreIndex, PostIndex, NonAddrMode}; -//decode field & encode field +//Disassembler field & encode field //condition -#define DECODE_COND condition = Condition(inst->cond) -#define ENCODE_COND get()->cond = condition +#define DECODE_COND condition = Condition(Get()->cond) +#define ENCODE_COND Get()->cond = condition -//reg -#define DECODE_RD(Type) rd = Type(static_cast(get()->rd)) -#define ENCODE_RD get()->rd = rd->getCode() +//reg_ +#define DECODE_RD(Type) rd = Type(static_cast(Get()->rd)) +#define ENCODE_RD Get()->rd = rd->Code() -#define DECODE_RT(Type) rt = Type(static_cast(get()->rt)) -#define ENCODE_RT get()->rt = rt->getCode() +#define DECODE_RT(Type) rt = Type(static_cast(Get()->rt)) +#define ENCODE_RT Get()->rt = rt->Code() -#define DECODE_RM(Type) rm = Type(static_cast(get()->rm)) -#define ENCODE_RM get()->rm = rm->getCode() +#define DECODE_RM(Type) rm = Type(static_cast(Get()->rm)) +#define ENCODE_RM Get()->rm = rm->Code() -#define DECODE_RN(Type) rn = Type(static_cast(get()->rn)) -#define ENCODE_RN get()->rn = rn->getCode() +#define DECODE_RN(Type) rn = Type(static_cast(Get()->rn)) +#define ENCODE_RN Get()->rn = rn->Code() //op -#define DECODE_OP op = OP(inst->op) -#define ENCODE_OP get()->op = op +#define DECODE_OP op = OP(Get()->op) +#define ENCODE_OP Get()->op = op -#define DECODE_SHIFT operand.shift = Shift(inst->shift) -#define ENCODE_SHIFT get()->shift = operand.shift - -#endif //SANDHOOK_ARM_BASE_H +#define DECODE_SHIFT operand.shift_ = Shift(Get()->shift) +#define ENCODE_SHIFT Get()->shift = operand.shift_ \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/shellcode_arm.h b/nativehook/src/main/cpp/archs/arm/shellcode_arm.h index ca2d217c..0b0dc77f 100644 --- a/nativehook/src/main/cpp/archs/arm/shellcode_arm.h +++ b/nativehook/src/main/cpp/archs/arm/shellcode_arm.h @@ -2,8 +2,7 @@ // Created by swift on 2019/6/1. // -#ifndef SANDHOOK_SHELL_CODE_ARM_H -#define SANDHOOK_SHELL_CODE_ARM_H +#pragma once //for shell code #define FUNCTION_START(x) \ @@ -29,6 +28,4 @@ extern "C" void x##_END(); #define IMPORT_LABEL(X,T) extern T X; -#define SHELLCODE_LEN(x) (Addr)x##_END - (Addr)x - -#endif //SANDHOOK_SHELL_CODE_ARM_H +#define SHELLCODE_LEN(x) (Addr)x##_END - (Addr)x \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/x86/place_holder.h b/nativehook/src/main/cpp/archs/x86/place_holder.h index ef707b5e..d46fb098 100644 --- a/nativehook/src/main/cpp/archs/x86/place_holder.h +++ b/nativehook/src/main/cpp/archs/x86/place_holder.h @@ -1,8 +1,4 @@ // // Created by swift on 2019/5/16. // - -#ifndef SANDHOOK_PLACE_HOLDER_H -#define SANDHOOK_PLACE_HOLDER_H - -#endif //SANDHOOK_PLACE_HOLDER_H +#pragma once diff --git a/nativehook/src/main/cpp/asm/cpu.h b/nativehook/src/main/cpp/asm/cpu.h index 17df11e9..18b347a8 100644 --- a/nativehook/src/main/cpp/asm/cpu.h +++ b/nativehook/src/main/cpp/asm/cpu.h @@ -1,9 +1,7 @@ // // Created by SwiftGan on 2019/4/15. // - -#ifndef SANDHOOK_CPU_H -#define SANDHOOK_CPU_H +#pragma once #include "register.h" @@ -17,4 +15,3 @@ namespace SandHook { } } -#endif //SANDHOOK_CPU_H diff --git a/nativehook/src/main/cpp/asm/data.h b/nativehook/src/main/cpp/asm/data.h index 7541bdbd..8a4e6b16 100644 --- a/nativehook/src/main/cpp/asm/data.h +++ b/nativehook/src/main/cpp/asm/data.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/10. // -#ifndef SANDHOOK_NH_DATA_H -#define SANDHOOK_NH_DATA_H +#pragma once #include "unit.h" @@ -21,15 +20,22 @@ public: \ namespace SandHook { namespace Asm { - template - class Data : public Unit { + template + class Data : public Unit { public: - Data(DType raw) : Unit() { - this->set(raw); - } - inline UnitType unitType() override { - return UnitType::UnitData; + + Data(D raw) : backup_(raw) {} + + INLINE UnitTypeDef UnitType() override { + return UnitTypeDef::UnitData; }; + + void Move(D *dest) override { + *dest = backup_; + } + + private: + D backup_; }; @@ -52,6 +58,4 @@ namespace SandHook { }; } -} - -#endif //SANDHOOK_NH_DATA_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/asm/imme.h b/nativehook/src/main/cpp/asm/imme.h deleted file mode 100644 index 7b02abea..00000000 --- a/nativehook/src/main/cpp/asm/imme.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// Created by SwiftGan on 2019/4/15. -// - -#ifndef SANDHOOK_IMME_H -#define SANDHOOK_IMME_H - -#include "../includes/base.h" - -namespace SandHook { - namespace Asm { - - template - class Imme { - public: - virtual ImmeType get() = 0; - virtual void set(ImmeType imme) = 0; - - U8 size() { - return immeSize; - }; - - private: - //byte - U8 immeSize; - ImmeType value; - Arch arch; - InstType instType; - }; - } -} - -#endif //SANDHOOK_IMME_H diff --git a/nativehook/src/main/cpp/asm/instruction.h b/nativehook/src/main/cpp/asm/instruction.h index 1ce62647..6425e531 100644 --- a/nativehook/src/main/cpp/asm/instruction.h +++ b/nativehook/src/main/cpp/asm/instruction.h @@ -2,9 +2,9 @@ // Created by SwiftGan on 2019/4/15. // -#ifndef SANDHOOK_INSTRUCTION_H -#define SANDHOOK_INSTRUCTION_H +#pragma once +#include #include "unit.h" #include "label.h" @@ -23,84 +23,87 @@ typedef U32 InstRaw; #define INST_CHECK(X,V) \ -CHECK(X,V, valid = false;) +CHECK(X,V, valid_ = false;) #define INST_DCHECK(X,V) \ -DCHECK(X,V, valid = false;) +DCHECK(X,V, valid_ = false;) #define INST_ASSERT(COND) \ if (COND) { \ - valid = false; \ + valid_ = false; \ } namespace SandHook { namespace Asm { - template - class Instruction : public Unit, public LabelBinder { + template + class Instruction : public Unit, public LabelBinder { public: + Instruction() {} - Instruction(Inst *inst) : Unit(inst) {} + Instruction(void *inst) : Unit(inst) {} + + Instruction(S *inst) : Unit(inst) {} - UnitType unitType() override { - return UnitType::UnitInst; + UnitTypeDef UnitType() override { + return UnitTypeDef::UnitInst; }; - virtual InstType instType() { + virtual InstType InstType() { return unknowInst; } - virtual Arch arch() { + virtual Arch Arch() { return unknowArch; } - virtual U32 instCode() { - return 0; + virtual U32 InstCode() { + return C; }; - virtual bool pcRelate() { + virtual bool PcRelate() { return false; } - virtual bool unknow() { + virtual bool Unknow() { return false; } - inline bool isValid() const { - return valid; + inline bool Valid() const { + return valid_; } - virtual void onOffsetApply(Off offset) {} + virtual void OnOffsetApply(Off offset) {} - void onLabelApply(Addr pc) override { - onOffsetApply(pc - this->getVPC()); + void OnLabelApply(Addr pc) override { + OnOffsetApply(pc - this->GetVPC()); } - inline void bindLabel(Label &l) { - label = &l; - l.addBinder(this); + INLINE void BindLabel(Label *label) { + label_ = label; + label->AddBind(this); } - virtual void decode(Inst* inst) { - inst_backup = *inst; + virtual void Disassembler() { + backup_ = *this->pc_; } - virtual void assembler() { - this->set(inst_backup); + virtual void Assembler() { + *this->pc_ = backup_; } protected: - bool valid = true; - Label* label = nullptr; - Inst inst_backup; + bool valid_ = true; + Label* label_ = nullptr; + S backup_; }; class Void : public Unit { public: Void(U32 size) : size_(size) {} - U32 size() override { + U32 Size() override { return size_; } @@ -108,7 +111,8 @@ namespace SandHook { U32 size_; }; + using BaseInst = Instruction; + using BaseInstRef = std::shared_ptr; + } } - -#endif //SANDHOOK_INSTRUCTION_H diff --git a/nativehook/src/main/cpp/asm/label.h b/nativehook/src/main/cpp/asm/label.h index d14d6e3a..ec952d0e 100644 --- a/nativehook/src/main/cpp/asm/label.h +++ b/nativehook/src/main/cpp/asm/label.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/10. // -#ifndef SANDHOOK_NH_LABEL_H -#define SANDHOOK_NH_LABEL_H +#pragma once #include "unit.h" #include @@ -13,53 +12,42 @@ namespace SandHook { class LabelBinder { public: - virtual void onLabelApply(Addr pc) = 0; + virtual void OnLabelApply(Addr pc) = 0; }; - class Label : public Unit { + class Label : public BaseUnit { public: Label() {} - Label(void *pc) : pc(pc) {} + Label(void *pc) : Unit(pc) {} - inline UnitType unitType() override { - return UnitType::UnitLabel; + enum UnitTypeDef UnitType() override { + return UnitTypeDef::UnitLabel; } - inline U32 size() override { + INLINE U32 Size() override { return 0; } - inline void setPC(void* pc) { - this->pc = pc; - } - - inline void *getPC() override { - return pc; - } - - inline void addBinder(LabelBinder* binder) { + INLINE void AddBind(LabelBinder *binder) { binders.push_back(binder); } - inline void removeBinder(LabelBinder* binder) { + INLINE void RemoveBind(LabelBinder *binder) { binders.push_back(binder); } - inline void bindLabel() { + INLINE void BindLabel() { std::list::iterator binder; for(binder = binders.begin();binder != binders.end(); ++binder) { - (*binder)->onLabelApply(getVPC()); + (*binder)->OnLabelApply(GetVPC()); } } private: - void* pc; std::list binders = std::list(); }; } -} - -#endif //SANDHOOK_NH_LABEL_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/asm/memory.h b/nativehook/src/main/cpp/asm/ram.h similarity index 60% rename from nativehook/src/main/cpp/asm/memory.h rename to nativehook/src/main/cpp/asm/ram.h index 72cfe7cd..9d2e7271 100644 --- a/nativehook/src/main/cpp/asm/memory.h +++ b/nativehook/src/main/cpp/asm/ram.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/23. // -#ifndef SANDHOOK_MEMORY_H -#define SANDHOOK_MEMORY_H +#pragma once namespace SandHook { namespace VM { @@ -12,5 +11,3 @@ namespace SandHook { }; } } - -#endif //SANDHOOK_MEMORY_H diff --git a/nativehook/src/main/cpp/asm/register.h b/nativehook/src/main/cpp/asm/register.h index 496ef3c3..c0209495 100644 --- a/nativehook/src/main/cpp/asm/register.h +++ b/nativehook/src/main/cpp/asm/register.h @@ -2,10 +2,9 @@ // Created by SwiftGan on 2019/4/15. // -#ifndef SANDHOOK_REGISTER_H -#define SANDHOOK_REGISTER_H +#pragma once -#include "../includes/base.h" +#include "base.h" namespace SandHook { namespace Asm { @@ -23,61 +22,55 @@ namespace SandHook { Register() {} - Register(U8 code) : code(code) {} + Register(U8 code) : code_(code) {} - inline U8 getCode() { - return code; + inline U8 Code() { + return code_; } - virtual bool isFP() { + virtual bool IsFP() { return false; }; - virtual U8 getWide() { + virtual U8 Wide() { return 0; }; - inline U8 getWideInBytes() { - return static_cast(getWide() / BITS_OF_BYTE); + INLINE U8 WideInBytes() { + return static_cast(Wide() / BITS_OF_BYTE); }; - inline bool is32Bit() { - return getWide() == Reg32Bit; + INLINE bool is32Bit() { + return Wide() == Reg32Bit; } - inline bool is64Bit() { - return getWide() == Reg64Bit; + INLINE bool is64Bit() { + return Wide() == Reg64Bit; } - inline bool is128Bit() { - return getWide() == Reg128Bit; - } - - virtual bool is(const Register &rhs) { - return rhs.code == code; + INLINE bool is128Bit() { + return Wide() == Reg128Bit; } bool operator==(const Register &rhs) const { - return code == rhs.code; + return code_ == rhs.code_; } bool operator!=(const Register &rhs) const { - return code != rhs.code; + return code_ != rhs.code_; } - virtual void setData(Data data) { - this->data = data; + virtual void SetData(Data data) { + data_ = data; } - virtual Data& getData() { - return data; + virtual Data& GetData() { + return data_; } private: - U8 code; - Data data; + U8 code_; + Data data_; }; } -} - -#endif //SANDHOOK_REGISTER_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/asm/unit.h b/nativehook/src/main/cpp/asm/unit.h index e861f094..658d7c30 100644 --- a/nativehook/src/main/cpp/asm/unit.h +++ b/nativehook/src/main/cpp/asm/unit.h @@ -2,110 +2,86 @@ // Created by swift on 2019/5/10. // -#ifndef SANDHOOK_NH_UNIT_H -#define SANDHOOK_NH_UNIT_H +#pragma once #include -#include "../includes/base.h" +#include +#include "base.h" namespace SandHook { namespace Asm { - template + template class Unit { public: - Unit() { - if (unitType() != UnitVoid) { - raw = reinterpret_cast(malloc(size())); - memset(raw, 0, size()); - auto_alloc = true; - } - } + Unit() {} - Unit(Raw *raw) : raw(raw) {} + Unit(S *pc) : pc_(pc) {} - Unit(Raw raw) { - Unit(); - *this->raw = raw; - } + Unit(void *pc) : pc_(ForceCast(pc)) {} - virtual void* getPC() { - return auto_alloc ? nullptr : raw; + virtual void* GetPC() { + return pc_; } - virtual Addr getVPC() { - return vPos; + virtual Addr GetVPC() { + return virtual_pc_; } - inline void setVPos(Addr vPos) { - this->vPos = vPos; + INLINE void SetVPC(Addr vPos) { + virtual_pc_ = vPos; } - inline Raw* get() const { - return raw; + INLINE S* Get() { + return pc_; } - inline void set(Raw raw) const { - *this->raw = raw; + INLINE void Set(S raw) { + *pc_ = raw; } - inline void set(Raw* raw) { - if (auto_alloc) { - free(this->raw); - auto_alloc = false; - } - this->raw = raw; + INLINE void Set(S *raw) { + pc_ = raw; } - inline void copy(void* dest) { - memcpy(dest, getPC(), size()); + INLINE void Copy(S *dest) { + *dest = *pc_; } - - inline void move(Raw* dest) { - memcpy(dest, raw, size()); - if (auto_alloc) { - free(raw); - auto_alloc = false; - } - raw = dest; + virtual void Move(S *dest) { + *dest = *pc_; + pc_ = dest; } - virtual UnitType unitType() { - return UnitType::UnitUnknow; + virtual UnitTypeDef UnitType() { + return UnitTypeDef::UnitUnknow; }; - virtual U32 size() { - return sizeof(Raw); + virtual U32 Size() { + return sizeof(S); } - inline U8 ref() { - return ++ref_count; + INLINE U8 Ref() { + return ++ref_count_; } - inline U8 release() { - return --ref_count; + INLINE U8 Release() { + return --ref_count_; } - inline U8 refcount() { - return ref_count; + INLINE U8 RefCount() { + return ref_count_; } - virtual ~Unit() { - if (auto_alloc) { - free(raw); - } - } - - private: - Raw* raw = nullptr; - Addr vPos = 0; - bool auto_alloc = false; - U8 ref_count = 0; + protected: + S* pc_ = nullptr; + Addr virtual_pc_ = 0; + U8 ref_count_ = 0; }; + using BaseUnit = Unit; + using BaseUnitRef = std::shared_ptr; + } } - -#endif //SANDHOOK_NH_UNIT_H diff --git a/nativehook/src/main/cpp/assembler/assembler.cpp b/nativehook/src/main/cpp/assembler/assembler.cpp index 6db0985d..ee8432de 100644 --- a/nativehook/src/main/cpp/assembler/assembler.cpp +++ b/nativehook/src/main/cpp/assembler/assembler.cpp @@ -16,13 +16,13 @@ void CodeContainer::setCodeBuffer(CodeBuffer *codeBuffer) { void CodeContainer::append(Unit *unit) { units.push_back(unit); - unit->setVPos(curPc); - switch (unit->unitType()) { + unit->SetVPC(curPc); + switch (unit->UnitType()) { case UnitLabel: labels.push_back((Label*)unit); break; default: - curPc += unit->size(); + curPc += unit->Size(); } } @@ -37,30 +37,30 @@ void CodeContainer::commit() { } Addr pcNow = reinterpret_cast(bufferStart); - //commit to code buffer & assembler inst - std::list*>::iterator unit; + //commit to code buffer & Assembler inst + std::list::iterator unit; for(unit = units.begin();unit != units.end(); ++unit) { - if ((*unit)->unitType() == UnitData) { - (*unit)->move(reinterpret_cast(pcNow)); - } else if ((*unit)->unitType() != UnitLabel) { - (*unit)->set(reinterpret_cast(pcNow)); + if ((*unit)->UnitType() == UnitData) { + (*unit)->Move(reinterpret_cast(pcNow)); + } else if ((*unit)->UnitType() != UnitLabel) { + (*unit)->Set(reinterpret_cast(pcNow)); } - if ((*unit)->unitType() == UnitInst) { - reinterpret_cast*>(*unit)->assembler(); + if ((*unit)->UnitType() == UnitInst) { + reinterpret_cast(*unit)->Assembler(); } - pcNow += (*unit)->size(); + pcNow += (*unit)->Size(); } - //bind labels + //AddBind labels std::list::iterator label; for(label = labels.begin();label != labels.end(); ++label) { - (*label)->bindLabel(); + (*label)->BindLabel(); } //flush I cache flushCache(reinterpret_cast(bufferStart), pcNow - reinterpret_cast(bufferStart)); - //set pc + //Set pc startPc = reinterpret_cast(bufferStart); curPc = pcNow; diff --git a/nativehook/src/main/cpp/buffer/code_buffer.h b/nativehook/src/main/cpp/buffer/code_buffer.h index 330adc01..0cc1e2b4 100644 --- a/nativehook/src/main/cpp/buffer/code_buffer.h +++ b/nativehook/src/main/cpp/buffer/code_buffer.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/11. // -#ifndef SANDHOOK_NH_CODE_BUFFER_H -#define SANDHOOK_NH_CODE_BUFFER_H +#pragma once #include #include "assembler.h" @@ -48,5 +47,3 @@ namespace SandHook { }; } } - -#endif //SANDHOOK_NH_CODE_BUFFER_H diff --git a/nativehook/src/main/cpp/decoder/decoder.cpp b/nativehook/src/main/cpp/decoder/decoder.cpp index 92ca3e3d..4f329fe4 100644 --- a/nativehook/src/main/cpp/decoder/decoder.cpp +++ b/nativehook/src/main/cpp/decoder/decoder.cpp @@ -11,7 +11,7 @@ using namespace SandHook::Decoder; -bool DefaultVisitor::visit(Unit *unit, void *pc) { +bool DefaultVisitor::Visit(Unit *unit, void *pc) { bool res = visitor(unit, pc); delete unit; return res; diff --git a/nativehook/src/main/cpp/elf/elf.cpp b/nativehook/src/main/cpp/elf/elf.cpp index b36e04f7..662c7015 100644 --- a/nativehook/src/main/cpp/elf/elf.cpp +++ b/nativehook/src/main/cpp/elf/elf.cpp @@ -9,11 +9,16 @@ #include #include #include +#include + #include "log.h" using namespace SandHook::Elf; + +TextSegment::TextSegment(void *start, void *end) : start(start), end(end) {} + ElfImg::ElfImg(const char *elf) { this->elf = elf; //load elf @@ -84,8 +89,8 @@ ElfImg::ElfImg(const char *elf) { LOGW("can't find symtab from sections\n"); } - //load module base - base = getModuleBase(elf); + //load module rang + baseInRam = getModuleBase(elf); } ElfImg::~ElfImg() { @@ -136,8 +141,8 @@ Elf_Addr ElfImg::getSymbOffset(const char *name) { Elf_Addr ElfImg::getSymbAddress(const char *name) { Elf_Addr offset = getSymbOffset(name); - if (offset > 0 && base != nullptr) { - return static_cast((size_t) base + offset - bias); + if (offset > 0 && baseInRam != nullptr) { + return static_cast((size_t) baseInRam + offset - bias); } else { return 0; } @@ -167,7 +172,47 @@ void *ElfImg::getModuleBase(const char *name) { fclose(maps); - LOGD("get module base %s: %lu", name, load_addr); + LOGD("Get module baseInRam %s: %lu", name, load_addr); return reinterpret_cast(load_addr); } + +bool isRXPerm(const char *perm) { + bool r = false, x = false; + for (int i = 0; i < 5; ++i) { + if (perm[i] == 'r') { + r = true; + } + if (perm[i] == 'x') { + x = true; + } + } + return r && x; +} + +void ElfImg::searchMaps() { + FILE *f; + if ((f = fopen("/proc/self/maps", "r")) == NULL) { + return; + } + char buf[PATH_MAX], perm[12] = {'\0'}, dev[12] = {'\0'}, mapname[PATH_MAX] = {'\0'}; + Addr begin, end, inode, foo; + while (!feof(f)) { + if (fgets(buf, sizeof(buf), f) == 0) + break; + mapname[0] = '\0'; + sscanf(buf, "%lx-%lx %s %lx %s %ld %s", &begin, &end, perm, + &foo, dev, &inode, mapname); + if (strstr(buf, elf)) { + if (baseInRam == nullptr) { + baseInRam = reinterpret_cast(begin); + } + endInRam = reinterpret_cast(end); + if (isRXPerm(perm)) { + textSegments.emplace_back((void*)begin, (void*)end); + } + } + } + fclose(f); +} + diff --git a/nativehook/src/main/cpp/includes/assembler.h b/nativehook/src/main/cpp/includes/assembler.h index d598b6d0..43eb97a6 100644 --- a/nativehook/src/main/cpp/includes/assembler.h +++ b/nativehook/src/main/cpp/includes/assembler.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/7. // -#ifndef SANDHOOK_NH_ASSEMBLER_H -#define SANDHOOK_NH_ASSEMBLER_H +#pragma once #include "label.h" #include "instruction.h" @@ -41,7 +40,7 @@ namespace SandHook { void setCodeBuffer(CodeBuffer *codeBuffer); - //allow code relocate to get new pc first + //allow code relocate to Get new pc first void allocBufferFirst(U32 size); void append(Unit* unit); void commit(); @@ -64,6 +63,4 @@ namespace SandHook { } -} - -#endif //SANDHOOK_NH_ASSEMBLER_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/includes/base.h b/nativehook/src/main/cpp/includes/base.h index 83736436..adbe5c93 100644 --- a/nativehook/src/main/cpp/includes/base.h +++ b/nativehook/src/main/cpp/includes/base.h @@ -2,8 +2,7 @@ // Created by SwiftGan on 2019/4/15. // -#ifndef SANDHOOK_BASE_H -#define SANDHOOK_BASE_H +#pragma once #include #include @@ -22,6 +21,8 @@ typedef int64_t S64; typedef size_t Addr; +using InstCode = U32; + //32bit #if defined(__i386__) || defined(__arm__) typedef S32 Off; @@ -30,8 +31,6 @@ typedef S32 Off; typedef S64 Off; #endif -const int PTR_BYTE = sizeof(void*); - #define PAGE_OFFSET 12 const int BITS_OF_BYTE = 8; @@ -44,7 +43,7 @@ enum Arch { unknowArch }; -enum UnitType { +enum UnitTypeDef { UnitInst, UnitData, UnitLabel, @@ -79,12 +78,17 @@ struct Unsigned<64> { }; -struct Base {}; +struct Base { +}; + + +#define INLINE __always_inline + template T AlignDown(T pointer, typename Unsigned::type alignment) { - // Use C-style casts to get static_cast behaviour for integral types (T), and + // Use C-style casts to Get static_cast behaviour for integral types (T), and // reinterpret_cast behaviour for other types. typename Unsigned::type pointer_raw = @@ -181,26 +185,26 @@ INT_1_TO_32_LIST(DECLARE_TRUNCATE_TO_UINT_32) //位提取 // Bit field extraction. -inline uint64_t ExtractUnsignedBitfield64(int msb, int lsb, uint64_t x) { +inline U64 ExtractUnsignedBitfield64(int msb, int lsb, U64 x) { if ((msb == 63) && (lsb == 0)) return x; - return (x >> lsb) & ((static_cast(1) << (1 + msb - lsb)) - 1); + return (x >> lsb) & ((static_cast(1) << (1 + msb - lsb)) - 1); } -inline int64_t ExtractSignedBitfield64(int msb, int lsb, U64 x) { - uint64_t temp = ExtractUnsignedBitfield64(msb, lsb, x); - // If the highest extracted bit is set, sign extend. +inline S64 ExtractSignedBitfield64(int msb, int lsb, U64 x) { + U64 temp = ExtractUnsignedBitfield64(msb, lsb, x); + // If the highest extracted bit is Set, sign extend_. if ((temp >> (msb - lsb)) == 1) { temp |= ~UINT64_C(0) << (msb - lsb); } - int64_t result; + S64 result; memcpy(&result, &temp, sizeof(result)); return result; } inline int32_t ExtractSignedBitfield32(int msb, int lsb, U32 x) { - uint32_t temp = TruncateToUint32(ExtractSignedBitfield64(msb, lsb, x)); - int32_t result; + U32 temp = TruncateToUint32(ExtractSignedBitfield64(msb, lsb, x)); + S32 result; memcpy(&result, &temp, sizeof(result)); return result; } @@ -216,25 +220,17 @@ inline T SignExtend(T val, int bitSize) { } -inline U16 BITS16L(U32 value) { - return static_cast(value & 0xffff); -} +#define BITS16L(value) static_cast(value & 0xffff) -inline U16 BITS16H(U32 value) { - return static_cast(value >> 16); -} +#define BITS16H(value) static_cast(value >> 16) -inline U32 BITS32L(U64 value) { - return static_cast(value); -} +#define BITS32L(value) static_cast(value) -inline U32 BITS32H(U64 value) { - return static_cast(value >> 32); -} +#define BITS32H(value) static_cast(value >> 32) #define COMBINE(hi, lo, lowide) (hi << lowide) | lo -/* borrow from gdb, refer: binutils-gdb/gdb/arch/arm.h */ +/* borrow from gdb, refer: binutils-gdb/gdb/Arch/arm.h */ #define SUB_MASK(x) ((1L << ((x) + 1)) - 1) #define BITS(obj, st, fn) (((obj) >> (st)) & SUB_MASK((fn) - (st))) #define BIT(obj, st) (((obj) >> (st)) & 1) @@ -254,4 +250,21 @@ if (X != V) { \ #define ENUM_VALUE(Type, Value) static_cast::type>(Value) -#endif //SANDHOOK_BASE_H +static inline S64 SignExtend64(unsigned int bits, U64 value) { + return ExtractSignedBitfield64(bits - 1, 0, value); +} + +static inline S32 SignExtend32(unsigned int bits, U32 value) { + return ExtractSignedBitfield32(bits - 1, 0, value); +} + +template +U ForceCast(T *x) { + return (U) (uintptr_t) x; +} + +template +U ForceCast(T &x) { + return *(U *) &x; +} + diff --git a/nativehook/src/main/cpp/includes/code_relocate.h b/nativehook/src/main/cpp/includes/code_relocate.h index 1418ad19..0bd84a18 100644 --- a/nativehook/src/main/cpp/includes/code_relocate.h +++ b/nativehook/src/main/cpp/includes/code_relocate.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/10. // -#ifndef SANDHOOK_NH_CODE_RELOCATE_H -#define SANDHOOK_NH_CODE_RELOCATE_H +#pragma once #include #include @@ -23,7 +22,7 @@ namespace SandHook { CodeRelocate(CodeContainer &codeContainer) : codeContainer(&codeContainer) {} - virtual void* relocate(Instruction *instruction, void* toPc) throw(ErrorCodeException) = 0; + virtual void* relocate(BaseInst *instruction, void* toPc) throw(ErrorCodeException) = 0; virtual void* relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) = 0; bool inRelocateRange(Off targetOffset, Addr targetLen); @@ -45,6 +44,4 @@ namespace SandHook { }; } -} - -#endif //SANDHOOK_NH_CODE_RELOCATE_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/includes/compiler.h b/nativehook/src/main/cpp/includes/compiler.h index a1fd6015..ce2abcf9 100644 --- a/nativehook/src/main/cpp/includes/compiler.h +++ b/nativehook/src/main/cpp/includes/compiler.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/6. // -#ifndef SANDHOOK_NH_COMPILER_H -#define SANDHOOK_NH_COMPILER_H +#pragma once // Helper to check whether the version of GCC used is greater than the specified // requirement. @@ -57,6 +56,4 @@ #define COMPILER_HAS_BUILTIN_POPCOUNT false // clang-format on -#endif - -#endif //SANDHOOK_NH_COMPILER_H +#endif \ No newline at end of file diff --git a/nativehook/src/main/cpp/includes/decoder.h b/nativehook/src/main/cpp/includes/decoder.h index a5dafdd4..3b88a6af 100644 --- a/nativehook/src/main/cpp/includes/decoder.h +++ b/nativehook/src/main/cpp/includes/decoder.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/6. // -#ifndef SANDHOOK_NH_DECODER_H -#define SANDHOOK_NH_DECODER_H +#pragma once #include "base.h" #include "instruction.h" @@ -16,7 +15,7 @@ namespace SandHook { class InstVisitor { public: //need free unit - virtual bool visit(Unit* unit, void* pc) { + virtual bool Visit(Unit *unit, void *pc) { delete unit; return false; }; @@ -24,19 +23,20 @@ namespace SandHook { class DefaultVisitor : public InstVisitor { public: - DefaultVisitor(bool (*visitor)(Unit *, void *)); + DefaultVisitor(bool (*visitor)(BaseUnit *, void *)); - bool visit(Unit *unit, void *pc) override; + bool Visit(BaseUnit *unit, void *pc) override; private: - bool (*visitor)(Unit*, void*); + bool (*visitor)(BaseUnit*, void*); }; class InstDecoder { public: - virtual void decode(void* codeStart, Addr codeLen, InstVisitor& visitor, bool onlyPcRelInst = false) = 0; - inline void decode(void* codeStart, Addr codeLen, bool (*visitor)(Unit*, void*), bool onlyPcRelInst = false) { + virtual void Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst = false) = 0; + inline void Disassembler(void* codeStart, Addr codeLen, bool (*visitor)(Unit*, void*), bool onlyPcRelInst = false) { InstVisitor vis = DefaultVisitor(visitor); - decode(codeStart, codeLen, vis, onlyPcRelInst); + Disassembler(codeStart, codeLen, vis, onlyPcRelInst); }; }; @@ -48,5 +48,3 @@ namespace SandHook { }; } } - -#endif //SANDHOOK_NH_DECODER_H diff --git a/nativehook/src/main/cpp/includes/elf.h b/nativehook/src/main/cpp/includes/elf.h index 3d962b42..74272ea7 100644 --- a/nativehook/src/main/cpp/includes/elf.h +++ b/nativehook/src/main/cpp/includes/elf.h @@ -2,10 +2,10 @@ // Created by swift on 2019/5/10. // -#ifndef SANDHOOK_NH_ELF_H -#define SANDHOOK_NH_ELF_H +#pragma once #include +#include #include "base.h" #if defined(__LP64__) @@ -32,6 +32,13 @@ typedef Elf32_Off Elf_Off; namespace SandHook { namespace Elf { + + struct TextSegment { + TextSegment(void *start, void *end); + void* start; + void* end; + }; + class ElfImg { public: @@ -45,9 +52,14 @@ namespace SandHook { ~ElfImg(); + private: + void searchMaps(); + private: const char* elf = nullptr; - void* base = nullptr; + void* baseInRam = nullptr; + void* endInRam = nullptr; + std::list textSegments = std::list(); char* buffer = nullptr; off_t size = 0; off_t bias = -4396; @@ -69,6 +81,4 @@ namespace SandHook { Elf_Off dynsym_size = 0; }; } -} - -#endif //SANDHOOK_NH_ELF_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/includes/hook.h b/nativehook/src/main/cpp/includes/hook.h index c3b520a2..8a14ae10 100644 --- a/nativehook/src/main/cpp/includes/hook.h +++ b/nativehook/src/main/cpp/includes/hook.h @@ -20,12 +20,13 @@ namespace SandHook { class InlineHook { public: //return == backup method - virtual void* inlineHook(void* origin, void* replace) = 0; - virtual bool breakPoint(void* point, void (*callback)(REG[])) { + virtual void *Hook(void *origin, void *replace) = 0; + virtual bool BreakPoint(void *point, void (*callback)(REG[])) { return false; }; protected: static CodeBuffer* backupBuffer; + std::mutex hookLock; public: static InlineHook* instance; }; diff --git a/nativehook/src/main/cpp/relocate/code_relocate.cpp b/nativehook/src/main/cpp/relocate/code_relocate.cpp index 36341c64..ee7da626 100644 --- a/nativehook/src/main/cpp/relocate/code_relocate.cpp +++ b/nativehook/src/main/cpp/relocate/code_relocate.cpp @@ -6,7 +6,7 @@ using namespace SandHook::Asm; -//in range of copy +//in range of Copy bool CodeRelocate::inRelocateRange(Off targetOffset, Addr targetLen) { Off startP = curOffset + targetOffset; Off endP = startP + targetLen; diff --git a/nativehook/src/main/cpp/sandhook_native.cpp b/nativehook/src/main/cpp/sandhook_native.cpp index 00862421..155f5980 100644 --- a/nativehook/src/main/cpp/sandhook_native.cpp +++ b/nativehook/src/main/cpp/sandhook_native.cpp @@ -3,6 +3,8 @@ // #include +#include +#include #include "sandhook_native.h" #include "hook.h" #include "elf.h" @@ -10,6 +12,138 @@ using namespace SandHook::Hook; using namespace SandHook::Elf; +int m1 = 5; +int m3 = 1036; +int m2 = 1035; +int m4 = 5; + +void (*dosth3Backup)(int, int) = nullptr; +void (*dosth4Backup)() = nullptr; +void (*dosth4Backup2)() = nullptr; + +void (*innerSuspendVM)() = nullptr; + + +static void (*heapPreForkBackup)(void *) = nullptr; + + +static void myHeapPreFork(void *heap) { + heapPreForkBackup(heap); +} + + +void SuspendVMReplace() { + LOGE("VM Suspend!"); + innerSuspendVM(); +} + +void do2() { + int a = 1 + 1; + int b = 1 + 1; + int c = 1 + 1; + int d = 1 + 1; +} + +void do3(int x, int y) { + do2(); + int a = 1 + 1; + int b = 1 + 1; + int c = 1 + 1; + int d = a + b + c; + LOGE("do3 = %d", y); +} + +void do5() { + LOGE("x = %d", 5); +} + +void do4() { + int a = 1 + 1; + int b = a + 1; + int d = a + 1; + int e = a + 1; + LOGE("x = %d", 7); +} + +void do4replace() { + int a = 1 + 1; + int b = 1 + 1; + int c = 1 + 1; + int d = 1 + 1; + dosth4Backup(); +} + +void do4replace2() { + int a = 1 + 1; + int c = 1 + 1; + int d = 1 + 1; + dosth4Backup2(); +} + +void do3replace(int x, int y) { + int a = 1 + 1; + int b = 1 + 1; + int c = 1 + 1; + int d = 1 + 1; + dosth3Backup(x, y); +} + +void do1() { + do2(); +} + +void breakCallback(REG regs[]) { + LOGE("breakCallback = %d SP = %d", regs[0], regs); +} + + +class Visitor : public InstVisitor { + bool Visit(Unit *unit, void *pc) override { + BaseInst* instruction = reinterpret_cast(unit); + instruction->Assembler(); + return true; + } +}; + +extern "C" +JNIEXPORT void JNICALL +Java_com_swift_sandhook_nativehook_NativeHook_test(JNIEnv *env, jclass jclass1) { + + + dosth4Backup = reinterpret_cast(InlineHook::instance->Hook( + reinterpret_cast(do4), + reinterpret_cast(do4replace))); + + dosth4Backup2 = reinterpret_cast(InlineHook::instance->Hook( + reinterpret_cast(do4), + reinterpret_cast(do4replace2))); + + + do4(); + + if (sizeof(void*) == 8) { + heapPreForkBackup = reinterpret_cast(SandInlineHookSym("/system/lib64/libart.so", "_ZN3art2gc4Heap13PreZygoteForkEv", + reinterpret_cast(myHeapPreFork))); + innerSuspendVM = reinterpret_cast(SandInlineHookSym("/system/lib64/libart.so", "_ZN3art3Dbg9SuspendVMEv", + reinterpret_cast(SuspendVMReplace))); + } else { + heapPreForkBackup = reinterpret_cast(SandInlineHookSym("/system/lib/libart.so", "_ZN3art2gc4Heap13PreZygoteForkEv", + reinterpret_cast(myHeapPreFork))); + innerSuspendVM = reinterpret_cast(SandInlineHookSym("/system/lib/libart.so", "_ZN3art3Dbg9SuspendVMEv", + reinterpret_cast(SuspendVMReplace))); + } + + void* do3P = reinterpret_cast(do3); + + InlineHook::instance->BreakPoint(reinterpret_cast((Addr)do3), breakCallback); + + LOGE("ok"); + + do3(100, 2); + + +} + extern "C" EXPORT void* SandGetSym(const char* so, const char* symb) { @@ -19,7 +153,7 @@ EXPORT void* SandGetSym(const char* so, const char* symb) { extern "C" EXPORT void* SandInlineHook(void* origin, void* replace) { - return InlineHook::instance->inlineHook(origin, replace); + return InlineHook::instance->Hook(origin, replace); } extern "C" @@ -29,10 +163,10 @@ EXPORT void* SandInlineHookSym(const char* so, const char* symb, void* replace) if (origin == nullptr) return nullptr; - return InlineHook::instance->inlineHook(origin, replace); + return InlineHook::instance->Hook(origin, replace); } extern "C" EXPORT bool SandBreakpoint(void* origin, void (*callback)(REG[])) { - return InlineHook::instance->breakPoint(origin, callback); + return InlineHook::instance->BreakPoint(origin, callback); } \ No newline at end of file diff --git a/nativehook/src/main/cpp/sandhook_native.h b/nativehook/src/main/cpp/sandhook_native.h index a7b0523e..2d9ac947 100644 --- a/nativehook/src/main/cpp/sandhook_native.h +++ b/nativehook/src/main/cpp/sandhook_native.h @@ -2,8 +2,7 @@ // Created by SwiftGan on 2019/4/15. // -#ifndef SANDHOOK_SANDHOOK_NATIVE_H -#define SANDHOOK_SANDHOOK_NATIVE_H +#pragma once typedef size_t REG; @@ -19,6 +18,4 @@ extern "C" EXPORT void* SandInlineHookSym(const char* so, const char* symb, void* replace); extern "C" -EXPORT bool SandBreakpoint(void* origin, void (*callback)(REG[])); - -#endif //SANDHOOK_SANDHOOK_NATIVE_H +EXPORT bool SandBreakpoint(void* origin, void (*callback)(REG[])); \ No newline at end of file diff --git a/nativehook/src/main/cpp/utils/lock.h b/nativehook/src/main/cpp/utils/lock.h index 20713a4f..7610f92f 100644 --- a/nativehook/src/main/cpp/utils/lock.h +++ b/nativehook/src/main/cpp/utils/lock.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/11. // -#ifndef SANDHOOK_NH_LOCK_H -#define SANDHOOK_NH_LOCK_H +#pragma once #include @@ -21,6 +20,4 @@ namespace SandHook { }; } -} - -#endif //SANDHOOK_NH_LOCK_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/utils/log.h b/nativehook/src/main/cpp/utils/log.h index 92ee5e58..7b28ce91 100644 --- a/nativehook/src/main/cpp/utils/log.h +++ b/nativehook/src/main/cpp/utils/log.h @@ -2,8 +2,7 @@ // Created by SwiftGan on 2019/2/15. // -#ifndef SANDHOOK_LOG_H -#define SANDHOOK_LOG_H +#pragma once #include "android/log.h" @@ -11,6 +10,4 @@ #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) #define LOGW(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__) -#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) - -#endif //SANDHOOK_LOG_H +#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__) \ No newline at end of file diff --git a/nativehook/src/main/cpp/utils/platform.h b/nativehook/src/main/cpp/utils/platform.h index c80b691f..0df0d725 100644 --- a/nativehook/src/main/cpp/utils/platform.h +++ b/nativehook/src/main/cpp/utils/platform.h @@ -2,13 +2,10 @@ // Created by swift on 2019/5/11. // -#ifndef SANDHOOK_NH_PLATFORM_H -#define SANDHOOK_NH_PLATFORM_H +#pragma once #include "base.h" extern "C" bool flushCache(Addr addr, Off len); -extern "C" bool memUnprotect(Addr addr, Addr len); - -#endif //SANDHOOK_NH_PLATFORM_H +extern "C" bool memUnprotect(Addr addr, Addr len); \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 21b09f7f..2f3cc64e 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':app', ':hooklib', ':hookers', ':annotation', ':xposedcompat', ':nativehook', ':xposedcompat_new' +include ':app', ':hooklib', ':hookers', ':annotation', ':xposedcompat', ':nativehook' From c2a9a03fe712be5e151b5fbb2d209a2b4d234508 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Mon, 1 Jul 2019 16:35:01 +0800 Subject: [PATCH 2/9] [Reconstitution]fix 32bit --- nativehook/build.gradle | 2 +- .../arm/arm32/assembler/assembler_arm32.cpp | 22 +-- .../archs/arm/arm32/decoder/decoder_arm32.cpp | 17 +- .../cpp/archs/arm/arm32/hook/hook_arm32.cpp | 24 +-- .../cpp/archs/arm/arm32/hook/hook_arm32.h | 9 +- .../cpp/archs/arm/arm32/inst/arm32_base.h | 10 +- .../cpp/archs/arm/arm32/inst/inst_t16.cpp | 147 +++++---------- .../main/cpp/archs/arm/arm32/inst/inst_t16.h | 176 ++++++++---------- .../cpp/archs/arm/arm32/inst/inst_t32.cpp | 70 +++---- .../main/cpp/archs/arm/arm32/inst/inst_t32.h | 127 ++++++------- .../arm/arm32/register/register_arm32.cpp | 2 +- .../archs/arm/arm32/register/register_arm32.h | 2 +- .../arm32/relocate/code_relocate_arm32.cpp | 56 +++--- .../arm/arm32/relocate/code_relocate_arm32.h | 4 +- .../cpp/archs/arm/arm64/inst/inst_arm64.h | 2 +- 15 files changed, 277 insertions(+), 393 deletions(-) diff --git a/nativehook/build.gradle b/nativehook/build.gradle index fd4dea25..839a63ff 100644 --- a/nativehook/build.gradle +++ b/nativehook/build.gradle @@ -17,7 +17,7 @@ android { cmake { arguments '-DBUILD_TESTING=OFF' cppFlags "-frtti -fexceptions -Wpointer-arith" - abiFilters 'arm64-v8a' + abiFilters 'armeabi-v7a', 'arm64-v8a' } } } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp index 6fcde175..45f2f41a 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp @@ -62,23 +62,23 @@ void AssemblerA32::Ldr(RegisterA32 &rt, Off offset) { } void AssemblerA32::Ldr(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, *label))); + Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, label))); } void AssemblerA32::Ldrb(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::UnSign,rt, *label))); + Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::UnSign,rt, label))); } void AssemblerA32::Ldrh(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::UnSign,rt, *label))); + Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::UnSign,rt, label))); } void AssemblerA32::Ldrsb(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::Sign,rt, *label))); + Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::Sign,rt, label))); } void AssemblerA32::Ldrsh(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::Sign,rt, *label))); + Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::Sign,rt, label))); } void AssemblerA32::Ldr(RegisterA32 &rt, const MemOperand &operand) { @@ -106,19 +106,19 @@ void AssemblerA32::Ldrsh(RegisterA32 &rt, const MemOperand &operand) { } void AssemblerA32::B(Label *label) { - Emit(reinterpret_cast*>(new INST_T16(B)(*label))); + Emit(reinterpret_cast*>(new INST_T16(B)(label))); } void AssemblerA32::Bl(Label *label) { - Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::arm, *label))); + Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::arm, label))); } void AssemblerA32::Blx(Label *label) { - Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::thumb, *label))); + Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::thumb, label))); } void AssemblerA32::Bx(Label *label) { - Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::B, INST_T32(B32)::thumb, *label))); + Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::B, INST_T32(B32)::thumb, label))); } void AssemblerA32::Mov(RegisterA32 &rd, RegisterA32 &rm) { @@ -134,7 +134,7 @@ void AssemblerA32::Blx(RegisterA32 &rm) { } void AssemblerA32::B(Condition condition, Label* label) { - Emit(reinterpret_cast*>(new INST_T16(B_COND)(condition, *label))); + Emit(reinterpret_cast*>(new INST_T16(B_COND)(condition, label))); } void AssemblerA32::Add(RegisterA32 &rdn, U8 imm8) { @@ -170,7 +170,7 @@ void AssemblerA32::Push(RegisterA32 &rt) { } void AssemblerA32::Adr(RegisterA32 &rd, Label *label) { - Emit(reinterpret_cast*>(new INST_T16(ADR)(rd, *label))); + Emit(reinterpret_cast*>(new INST_T16(ADR)(rd, label))); } void AssemblerA32::Nop16() { diff --git a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp index a3ce7835..ff83f1e2 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp @@ -11,8 +11,7 @@ using namespace SandHook::AsmA32; #define CASE(T, X) \ if (IS_OPCODE_##T(*reinterpret_cast(pc), X)) { \ -STRUCT_##T(X) *s = reinterpret_cast(pc); \ -unit = reinterpret_cast *>(new INST_##T(X)(s)); \ +unit = reinterpret_cast *>(new INST_##T(X)(pc)); \ goto label_matched; \ } @@ -25,15 +24,15 @@ Arm32Decoder* Arm32Decoder::instant = new Arm32Decoder(); void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, bool onlyPcRelInst) { - bool thumb = isThumbCode(reinterpret_cast(codeStart)); + bool thumb = IsThumbCode(reinterpret_cast(codeStart)); if (thumb) { - codeStart = getThumbCodeAddress(codeStart); + codeStart = GetThumbCodeAddress(codeStart); } void *pc = codeStart; Addr endAddr = (Addr) codeStart + codeLen; Unit* unit = nullptr; while((Addr) pc < endAddr) { - bool thumb32 = isThumb32(*reinterpret_cast(pc)); + bool thumb32 = IsThumb32(*reinterpret_cast(pc)); if (thumb && thumb32) { CASE_T32(SUB_IMM) CASE_T32(B32) @@ -44,7 +43,7 @@ void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi CASE_T32(MOV_MOVT_IMM) } if (unit == nullptr) { - unit = reinterpret_cast *>(new INST_T32(UNKNOW)(*reinterpret_cast(pc))); + unit = reinterpret_cast *>(new INST_T32(UNKNOW)(pc)); } } else if (thumb) { CASE_T16(B) @@ -64,15 +63,15 @@ void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi CASE_T16(PUSH) } if (unit == nullptr) { - unit = reinterpret_cast *>(new INST_T16(UNKNOW)(*reinterpret_cast(pc))); + unit = reinterpret_cast *>(new INST_T16(UNKNOW)(pc)); } } else { //TODO arm32 support - unit = reinterpret_cast *>(new INST_T32(UNKNOW)(*reinterpret_cast(pc))); + unit = reinterpret_cast *>(new INST_T32(UNKNOW)(pc)); } label_matched: - if (!visitor.visit(unit, pc)) { + if (!visitor.Visit(unit, pc)) { break; } pc = reinterpret_cast((Addr)pc + unit->Size()); diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp index 3a1f8b23..63a78c7a 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp @@ -17,18 +17,18 @@ using namespace SandHook::Utils; #include "assembler_arm32.h" using namespace SandHook::RegistersA32; -void *InlineHookArm32Android::InlineHook(void *origin, void *replace) { +void *InlineHookArm32Android::Hook(void *origin, void *replace) { AutoLock lock(hookLock); void* originCode; - if (isThumbCode((Addr)origin)) { - originCode = getThumbCodeAddress(origin); + if (IsThumbCode((Addr) origin)) { + originCode = GetThumbCodeAddress(origin); } else { LOGE("hook %d error!, only support thumb2 now!", origin); return nullptr; } - bool changeMode = isThumbCode((Addr) origin) != isThumbCode((Addr) replace); + bool changeMode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) replace); void* backup = nullptr; AssemblerA32 assemblerBackup(backupBuffer); @@ -60,13 +60,14 @@ void *InlineHookArm32Android::InlineHook(void *origin, void *replace) { ALIGN_FOR_LDR __ Ldr(PC, origin_addr_label); __ Emit(origin_addr_label); - __ Emit((Addr) getThumbPC(reinterpret_cast(reinterpret_cast(originCode) + relocate.curOffset))); + __ Emit((Addr) GetThumbPC( + reinterpret_cast(reinterpret_cast(originCode) + relocate.curOffset))); __ finish(); #undef __ //commit inline trampoline assemblerInline.finish(); - return getThumbPC(backup); + return GetThumbPC(backup); } @@ -77,14 +78,14 @@ bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) { AutoLock lock(hookLock); void* originCode; - if (isThumbCode((Addr)origin)) { - originCode = getThumbCodeAddress(origin); + if (IsThumbCode((Addr) origin)) { + originCode = GetThumbCodeAddress(origin); } else { LOGE("hook %d error!, only support thumb2 now!", origin); return false; } - bool changeMode = isThumbCode((Addr) origin) != isThumbCode((Addr) callback); + bool changeMode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) callback); void* backup = nullptr; AssemblerA32 assemblerBackup(backupBuffer); @@ -100,12 +101,13 @@ bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) { ALIGN_FOR_LDR __ Ldr(PC, origin_addr_label); __ Emit(origin_addr_label); - __ Emit((Addr) getThumbPC(reinterpret_cast(reinterpret_cast(originCode) + relocate.curOffset))); + __ Emit((Addr) GetThumbPC( + reinterpret_cast(reinterpret_cast(originCode) + relocate.curOffset))); __ finish(); #undef __ //build trampoline - origin_addr_s = (Addr) getThumbPC(backup); + origin_addr_s = (Addr) GetThumbPC(backup); callback_addr_s = (Addr) callback; void* trampoline = backupBuffer->copy((void*)BP_SHELLCODE, SHELLCODE_LEN(BP_SHELLCODE)); diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h index b1d41d52..cc20ba26 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/23. // -#ifndef SANDHOOK_HOOK_ARM32_H -#define SANDHOOK_HOOK_ARM32_H +#pragma once #include "hook.h" @@ -18,7 +17,7 @@ namespace SandHook { inline ~InlineHookArm32Android() { delete hookLock; } - void *InlineHook(void *origin, void *replace) override; + void *Hook(void *origin, void *replace) override; bool BreakPoint(void *point, void (*callback)(REG *)) override; @@ -27,6 +26,4 @@ namespace SandHook { }; } -} - -#endif //SANDHOOK_HOOK_ARM32_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h index 73178bfd..735fab5d 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/arm32_base.h @@ -12,7 +12,7 @@ #define DECODE_OFFSET(bits, ext) SignExtend32(bits + ext, COMBINE(Get()->imm##bits, 0, ext)) #define ENCODE_OFFSET(bits, ext) Get()->imm##bits = TruncateToUint##bits(offset >> ext) -#define CODE_OFFSET(I) I->offset + (I->instType() == A32 ? 2 * 4 : 2 * 2) +#define CODE_OFFSET(I) I->offset + (I->InstType() == A32 ? 2 * 4 : 2 * 2) using namespace SandHook::RegistersA32; @@ -143,20 +143,20 @@ namespace SandHook { return (registers.GetList() >> first) & ((1 << count) - 1); } - inline bool isThumbCode(Addr codeAddr) { + inline bool IsThumbCode(Addr codeAddr) { return (codeAddr & 0x1) == 0x1; } - inline bool isThumb32(InstT16 code) { + inline bool IsThumb32(InstT16 code) { return ((code & 0xF000) == 0xF000) || ((code & 0xF800) == 0xE800); } - inline void* getThumbCodeAddress(void* code) { + inline void* GetThumbCodeAddress(void *code) { Addr addr = reinterpret_cast(code) & (~0x1); return reinterpret_cast(addr); } - inline void* getThumbPC(void* code) { + inline void* GetThumbPC(void *code) { Addr addr = reinterpret_cast(code) & (~0x1); return reinterpret_cast(addr + 1); } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp index f6c8362f..6639472d 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp @@ -17,28 +17,17 @@ using namespace SandHook::RegistersA32; //Unknow -T16_UNKNOW::T16_UNKNOW(STRUCT_T16(UNKNOW) &inst) : InstructionT16(&inst) { - Disassembler(&inst); -} - -void T16_UNKNOW::Disassembler(T16_STRUCT_UNKNOW *inst) { - inst_backup = *inst; -} - -void T16_UNKNOW::Assembler() { - Set(inst_backup); +T16_UNKNOW::T16_UNKNOW(void *inst) : InstructionT16(&inst) { } //B -T16_B::T16_B() {} -T16_B::T16_B(T16_STRUCT_B *inst) : T16_INST_PC_REL(inst) { - Disassembler(inst); +T16_B::T16_B(void *inst) : T16_INST_PC_REL(inst) { } T16_B::T16_B(Off offset) : offset(offset) {} -T16_B::T16_B(Label &label) { +T16_B::T16_B(Label *label) { BindLabel(label); } @@ -46,7 +35,7 @@ Off T16_B::GetImmPCOffset() { return DECODE_OFFSET(11, 1); } -void T16_B::Disassembler(T16_STRUCT_B *inst) { +void T16_B::Disassembler() { offset = GetImmPCOffset(); } @@ -63,19 +52,17 @@ void T16_B::OnOffsetApply(Off offset) { //B Cond -T16_B_COND::T16_B_COND() {} -T16_B_COND::T16_B_COND(STRUCT_T16(B_COND) *inst) : T16_INST_PC_REL(inst) { - Disassembler(inst); +T16_B_COND::T16_B_COND(void *inst) : T16_INST_PC_REL(inst) { } T16_B_COND::T16_B_COND(Condition condition, Off offset) : condition(condition), offset(offset) {} -T16_B_COND::T16_B_COND(Condition condition, Label &label) { +T16_B_COND::T16_B_COND(Condition condition, Label *label) { BindLabel(label); } -void T16_B_COND::Disassembler(STRUCT_T16(B_COND) *inst) { +void T16_B_COND::Disassembler() { DECODE_COND; offset = GetImmPCOffset(); } @@ -96,15 +83,13 @@ Off T16_B_COND::GetImmPCOffset() { } - //BX BLX -T16_BX_BLX::T16_BX_BLX(T16_BX_BLX::OP op, RegisterA32 &rm) : op(op), rm(&rm) {} -T16_BX_BLX::T16_BX_BLX(T16_STRUCT_BX_BLX *inst) : T16_INST_PC_REL(inst) { - Disassembler(inst); -} +T16_BX_BLX::T16_BX_BLX(void *inst) : T16_INST_PC_REL(inst) {} -void T16_BX_BLX::Disassembler(STRUCT_T16(BX_BLX) *inst) { +T16_BX_BLX::T16_BX_BLX(T16_BX_BLX::OP op, RegisterA32 &rm) : op(op), rm(&rm) {} + +void T16_BX_BLX::Disassembler() { DECODE_OP; DECODE_RM(Reg); } @@ -118,26 +103,20 @@ void T16_BX_BLX::Assembler() { //CBZ CBNZ -T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_STRUCT_CBZ_CBNZ *inst) : T16_INST_PC_REL(inst) { - Disassembler(inst); -} +T16_CBZ_CBNZ::T16_CBZ_CBNZ(void *inst) : T16_INST_PC_REL(inst) {} T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_CBZ_CBNZ::OP op, Off offset, RegisterA32 &rn) : op(op), offset(offset), rn(&rn) {} - - -T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_CBZ_CBNZ::OP op, Label& label, RegisterA32 &rn) : op(op), - rn(&rn) { + +T16_CBZ_CBNZ::T16_CBZ_CBNZ(T16_CBZ_CBNZ::OP op, Label* label, RegisterA32 &rn) : op(op), rn(&rn) { BindLabel(label); } - - Off T16_CBZ_CBNZ::GetImmPCOffset() { return COMBINE(Get()->i, Get()->imm5, 5) << 2; } -void T16_CBZ_CBNZ::Disassembler(T16_STRUCT_CBZ_CBNZ *inst) { +void T16_CBZ_CBNZ::Disassembler() { offset = GetImmPCOffset(); DECODE_RN(Reg); DECODE_OP; @@ -159,20 +138,16 @@ void T16_CBZ_CBNZ::OnOffsetApply(Off offset) { //LDR_LIT -T16_LDR_LIT::T16_LDR_LIT(T16_STRUCT_LDR_LIT *inst) : T16_INST_PC_REL(inst) { - Disassembler(inst); -} +T16_LDR_LIT::T16_LDR_LIT(void *inst) : T16_INST_PC_REL(inst) {} -T16_LDR_LIT::T16_LDR_LIT(Off offset, RegisterA32 &rt) : offset(offset), rt(&rt) { - -} +T16_LDR_LIT::T16_LDR_LIT(Off offset, RegisterA32 &rt) : offset(offset), rt(&rt) {} Off T16_LDR_LIT::GetImmPCOffset() { return Get()->imm8 << 2; } Addr T16_LDR_LIT::GetImmPCOffsetTarget() { - return ALIGN((Addr) getPC() + offset, 4); + return ALIGN((Addr) GetPC() + offset, 4); } void T16_LDR_LIT::OnOffsetApply(Off offset) { @@ -180,7 +155,7 @@ void T16_LDR_LIT::OnOffsetApply(Off offset) { ENCODE_OFFSET(8, 2); } -void T16_LDR_LIT::Disassembler(T16_STRUCT_LDR_LIT *inst) { +void T16_LDR_LIT::Disassembler() { DECODE_RT(Reg); offset = GetImmPCOffset(); } @@ -193,17 +168,15 @@ void T16_LDR_LIT::Assembler() { //ADD IMM RD = RN -T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(T16_STRUCT_ADD_IMM_RDN *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(void *inst) : InstructionT16(inst) {} T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(RegisterA32 *rdn, U8 imm8) : rdn(rdn), imm8(imm8) {} -void T16_ADD_IMM_RDN::Disassembler(T16_STRUCT_ADD_IMM_RDN *inst) { - rdn = Reg(inst->rdn); - imm8 = inst->imm8; +void T16_ADD_IMM_RDN::Disassembler() { + rdn = Reg(Get()->rdn); + imm8 = Get()->imm8; } void T16_ADD_IMM_RDN::Assembler() { @@ -216,13 +189,11 @@ void T16_ADD_IMM_RDN::Assembler() { //ADR -T16_ADR::T16_ADR(T16_STRUCT_ADR *inst) : T16_INST_PC_REL(inst) { - Disassembler(inst); -} +T16_ADR::T16_ADR(void *inst) : T16_INST_PC_REL(inst) {} T16_ADR::T16_ADR(RegisterA32 &rd, Off offset) : rd(&rd), offset(offset) {} -T16_ADR::T16_ADR(RegisterA32 &rd, Label &label) : rd(&rd) { +T16_ADR::T16_ADR(RegisterA32 &rd, Label *label) : rd(&rd) { BindLabel(label); } @@ -232,7 +203,7 @@ Off T16_ADR::GetImmPCOffset() { } Addr T16_ADR::GetImmPCOffsetTarget() { - return RoundDown((Addr) getPC() + offset, 4); + return RoundDown((Addr) GetPC() + offset, 4); } void T16_ADR::OnOffsetApply(Off offset) { @@ -240,7 +211,7 @@ void T16_ADR::OnOffsetApply(Off offset) { Get()->imm8 = (U32)offset >> 2; } -void T16_ADR::Disassembler(T16_STRUCT_ADR *inst) { +void T16_ADR::Disassembler() { offset = GetImmPCOffset(); DECODE_RD(Reg); } @@ -252,16 +223,12 @@ void T16_ADR::Assembler() { Get()->imm8 = (U32)offset >> 2; } -T16_CMP_REG::T16_CMP_REG() {} - -T16_CMP_REG::T16_CMP_REG(T16_STRUCT_CMP_REG *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_CMP_REG::T16_CMP_REG(void *inst) : InstructionT16(inst) {} T16_CMP_REG::T16_CMP_REG(RegisterA32 &rm, RegisterA32 &rn) : rm(&rm), rn(&rn) {} -void T16_CMP_REG::Disassembler(T16_STRUCT_CMP_REG *inst) { +void T16_CMP_REG::Disassembler() { DECODE_RM(Reg); DECODE_RN(Reg); } @@ -274,19 +241,14 @@ void T16_CMP_REG::Assembler() { } - //MOV REG -T16_MOV_REG::T16_MOV_REG(T16_STRUCT_MOV_REG *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_MOV_REG::T16_MOV_REG(void *inst) : InstructionT16(inst) {} +T16_MOV_REG::T16_MOV_REG(RegisterA32 &rd, RegisterA32 &rm) : rm(&rm), rd(&rd) {} -T16_MOV_REG::T16_MOV_REG(RegisterA32 &rd, RegisterA32 &rm) : rm(&rm), rd(&rd) { -} - -void T16_MOV_REG::Disassembler(T16_STRUCT_MOV_REG *inst) { +void T16_MOV_REG::Disassembler() { DECODE_RM(Reg); - rd = Reg(static_cast(COMBINE(inst->D, inst->rd, 3))); + rd = Reg(static_cast(COMBINE(Get()->D, Get()->rd, 3))); } void T16_MOV_REG::Assembler() { @@ -297,22 +259,19 @@ void T16_MOV_REG::Assembler() { Get()->D = BIT(rd->Code(), 3); } -bool T16_MOV_REG::pcRelate() { +bool T16_MOV_REG::PcRelate() { return rd == &PC || rm == &PC; } -T16_ADD_REG::T16_ADD_REG() {} -T16_ADD_REG::T16_ADD_REG(T16_STRUCT_ADD_REG *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_ADD_REG::T16_ADD_REG(void *inst) : InstructionT16(inst) {} T16_ADD_REG::T16_ADD_REG(RegisterA32 *rd, RegisterA32 *rn, RegisterA32 *rm) : rd(rd), rn(rn), rm(rm) {} -void T16_ADD_REG::Disassembler(T16_STRUCT_ADD_REG *inst) { +void T16_ADD_REG::Disassembler() { DECODE_RD(Reg); DECODE_RN(Reg); DECODE_RM(Reg); @@ -330,14 +289,12 @@ void T16_ADD_REG::Assembler() { -T16_CMP_REG_EXT::T16_CMP_REG_EXT(T16_STRUCT_CMP_REG_EXT *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_CMP_REG_EXT::T16_CMP_REG_EXT(void *inst) : InstructionT16(inst) {} T16_CMP_REG_EXT::T16_CMP_REG_EXT(RegisterA32 &rn, RegisterA32 &rm) : rn(&rn), rm(&rm) {} -void T16_CMP_REG_EXT::Disassembler(T16_STRUCT_CMP_REG_EXT *inst) { - rn = Reg(COMBINE(inst->N, inst->rn, 3)); +void T16_CMP_REG_EXT::Disassembler() { + rn = Reg(COMBINE(Get()->N, Get()->rn, 3)); DECODE_RM(Reg); } @@ -350,14 +307,12 @@ void T16_CMP_REG_EXT::Assembler() { //POP -T16_POP::T16_POP(T16_STRUCT_POP *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_POP::T16_POP(void *inst) : InstructionT16(inst) {} T16_POP::T16_POP(const RegisterList ®isterList) : registerList(registerList) {} -void T16_POP::Disassembler(T16_STRUCT_POP *inst) { - registerList.SetList(COMBINE(inst->P << 7, inst->regs, 8)); +void T16_POP::Disassembler() { + registerList.SetList(COMBINE(Get()->P << 7, Get()->regs, 8)); } void T16_POP::Assembler() { @@ -369,14 +324,12 @@ void T16_POP::Assembler() { //PUSH -T16_PUSH::T16_PUSH(T16_STRUCT_PUSH *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_PUSH::T16_PUSH(void *inst) : InstructionT16(inst) {} T16_PUSH::T16_PUSH(const RegisterList ®isterList) : registerList(registerList) {} -void T16_PUSH::Disassembler(T16_STRUCT_PUSH *inst) { - registerList.SetList(COMBINE(inst->M << 6, inst->regs, 8)); +void T16_PUSH::Disassembler() { + registerList.SetList(COMBINE(Get()->M << 6, Get()->regs, 8)); } void T16_PUSH::Assembler() { @@ -388,19 +341,17 @@ void T16_PUSH::Assembler() { // Add reg_ rdn T2 -T16_ADD_REG_RDN::T16_ADD_REG_RDN(T16_STRUCT_ADD_REG_RDN *inst) : InstructionT16(inst) { - Disassembler(inst); -} +T16_ADD_REG_RDN::T16_ADD_REG_RDN(void *inst) : InstructionT16(inst) {} T16_ADD_REG_RDN::T16_ADD_REG_RDN(RegisterA32 &rdn, RegisterA32 &rm) : rdn(&rdn), rm(&rm) {} -bool T16_ADD_REG_RDN::pcRelate() { +bool T16_ADD_REG_RDN::PcRelate() { return *rm == PC; } -void T16_ADD_REG_RDN::Disassembler(T16_STRUCT_ADD_REG_RDN *inst) { +void T16_ADD_REG_RDN::Disassembler() { DECODE_RM(Reg); - rdn = Reg(inst->rdn); + rdn = Reg(Get()->rdn); } void T16_ADD_REG_RDN::Assembler() { diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h index 7a4b81e9..f2e2e01b 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h @@ -32,10 +32,14 @@ return COND; \ #define TEST_INST_OPCODE(X, INDEX) inst_test.inst.opcode##INDEX == OPCODE_T16(X##_##INDEX) -#define DEFINE_INST_CODE(X) \ -inline U32 instCode() override { \ -return ENUM_VALUE(InstCodeT16, InstCodeT16::X); \ -} +#define DEFINE_INST(X) class INST_T16(X) : public InstructionT16 + +#define DEFINE_INST_EXT(X,P) class INST_T16(X) : public INST_T16(P) + +#define DEFINE_INST_EXT_(X,P) class INST_T16(X) : public P + +#define DEFINE_INST_PCREL(X) class INST_T16(X) : public T16_INST_PC_REL + using namespace SandHook::RegistersA32; @@ -51,23 +55,23 @@ namespace SandHook { InstructionT16(void *inst) : Instruction(inst) {} - INLINE U32 Size() override { + inline U32 Size() override { return 2; } - INLINE void *GetPC() override { + inline void *GetPC() override { return reinterpret_cast((Addr) Instruction::GetPC() + 2 * 2); } - INLINE Addr GetVPC() override { + inline Addr GetVPC() override { return Instruction::GetVPC() + 2 * 2; } - INLINE InstType InstType() override { + inline InstType InstType() override { return thumb16; } - INLINE Arch Arch() override { + inline Arch Arch() override { return arm32; } @@ -78,60 +82,53 @@ namespace SandHook { class T16_INST_PC_REL : public InstructionT16 { public: + T16_INST_PC_REL() {} + T16_INST_PC_REL(void *inst) : InstructionT16(inst) {}; - INLINE virtual Off GetImmPCOffset() { + inline virtual Off GetImmPCOffset() { return 0; }; - INLINE virtual Addr GetImmPCOffsetTarget() { + inline virtual Addr GetImmPCOffsetTarget() { return (Addr) this->GetPC() + GetImmPCOffset(); }; - INLINE bool PcRelate() override { + inline bool PcRelate() override { return true; }; }; - class INST_T16(UNKNOW) : public InstructionT16 { + DEFINE_INST(UNKNOW) { public: - T16_UNKNOW(STRUCT_T16(UNKNOW) &inst); + T16_UNKNOW(void *inst); - inline bool unknow() override { + inline bool Unknow() override { return true; } - void Disassembler(T16_STRUCT_UNKNOW *inst) override; - - void Assembler() override; - - private: - STRUCT_T16(UNKNOW) inst_backup; }; - class INST_T16(B) : public T16_INST_PC_REL { + DEFINE_INST_PCREL(B) { public: - T16_B(); - T16_B(STRUCT_T16(B) *inst); + T16_B(void *inst); T16_B(Off offset); - T16_B(Label &label); + T16_B(Label *label); DEFINE_IS(B) - DEFINE_INST_CODE(B) - void OnOffsetApply(Off offset) override; Off GetImmPCOffset() override; - void Disassembler(STRUCT_T16(B) *inst) override; + void Disassembler() override; void Assembler() override; @@ -139,26 +136,23 @@ namespace SandHook { Off offset; }; - class INST_T16(B_COND) : public T16_INST_PC_REL { + DEFINE_INST_PCREL(B_COND) { public: - T16_B_COND(); - T16_B_COND(STRUCT_T16(B_COND) *inst); + T16_B_COND(void *inst); T16_B_COND(Condition condition, Off offset); - T16_B_COND(Condition condition, Label &label); + T16_B_COND(Condition condition, Label *label); DEFINE_IS_EXT(B_COND, TEST_INST_FIELD(opcode, OPCODE_T16(B_COND)) && INST_FIELD(cond) != 0b1110 && INST_FIELD(cond) != 0b1111) - DEFINE_INST_CODE(B_COND) - Off GetImmPCOffset() override; void OnOffsetApply(Off offset) override; - void Disassembler(STRUCT_T16(B_COND) *inst) override; + void Disassembler() override; void Assembler() override; @@ -168,7 +162,7 @@ namespace SandHook { }; - class INST_T16(BX_BLX) : public T16_INST_PC_REL { + DEFINE_INST_PCREL(BX_BLX) { public: enum OP { @@ -176,15 +170,13 @@ namespace SandHook { BLX = 0b1 }; - T16_BX_BLX(T16_STRUCT_BX_BLX *inst); + T16_BX_BLX(void *inst); T16_BX_BLX(OP op, RegisterA32 &rm); DEFINE_IS_EXT(BX_BLX, TEST_INST_OPCODE(BX_BLX, 1) && TEST_INST_OPCODE(BX_BLX, 2)) - DEFINE_INST_CODE(BX_BLX) - - void Disassembler(T16_STRUCT_BX_BLX *inst) override; + void Disassembler() override; void Assembler() override; @@ -194,30 +186,28 @@ namespace SandHook { }; - class INST_T16(CBZ_CBNZ) : public T16_INST_PC_REL { + DEFINE_INST_PCREL(CBZ_CBNZ) { public: enum OP { CBZ = 0b0, CBNZ = 0b1 }; - T16_CBZ_CBNZ(T16_STRUCT_CBZ_CBNZ *inst); + T16_CBZ_CBNZ(void *inst); T16_CBZ_CBNZ(OP op, Off offset, RegisterA32 &rn); - T16_CBZ_CBNZ(OP op, Label &label, RegisterA32 &rn); + T16_CBZ_CBNZ(OP op, Label *label, RegisterA32 &rn); DEFINE_IS_EXT(CBZ_CBNZ, TEST_INST_OPCODE(CBZ_CBNZ, 1) && TEST_INST_OPCODE(CBZ_CBNZ, 2) && TEST_INST_OPCODE(CBZ_CBNZ, 3)) - DEFINE_INST_CODE(CBZ_CBNZ) - void OnOffsetApply(Off offset) override; Off GetImmPCOffset() override; - void Disassembler(T16_STRUCT_CBZ_CBNZ *inst) override; + void Disassembler() override; void Assembler() override; @@ -228,23 +218,22 @@ namespace SandHook { }; - class INST_T16(LDR_LIT) : public T16_INST_PC_REL { + DEFINE_INST_PCREL(LDR_LIT) { public: - T16_LDR_LIT(T16_STRUCT_LDR_LIT *inst); + + T16_LDR_LIT(void *inst); T16_LDR_LIT(Off offset, RegisterA32 &rt); DEFINE_IS(LDR_LIT) - DEFINE_INST_CODE(LDR_LIT) - Addr GetImmPCOffsetTarget() override; Off GetImmPCOffset() override; void OnOffsetApply(Off offset) override; - void Disassembler(T16_STRUCT_LDR_LIT *inst) override; + void Disassembler() override; void Assembler() override; @@ -254,17 +243,15 @@ namespace SandHook { }; - class INST_T16(ADD_IMM_RDN) : public InstructionT16 { + DEFINE_INST(ADD_IMM_RDN) { public: - T16_ADD_IMM_RDN(T16_STRUCT_ADD_IMM_RDN *inst); + T16_ADD_IMM_RDN(void *inst); T16_ADD_IMM_RDN(RegisterA32 *rdn, U8 imm8); DEFINE_IS(ADD_IMM_RDN) - DEFINE_INST_CODE(ADD_IMM_RDN) - - void Disassembler(T16_STRUCT_ADD_IMM_RDN *inst) override; + void Disassembler() override; void Assembler() override; @@ -273,26 +260,24 @@ namespace SandHook { U8 imm8; }; - class INST_T16(ADR) : public T16_INST_PC_REL { + DEFINE_INST_PCREL(ADR) { public: - T16_ADR(T16_STRUCT_ADR *inst); + T16_ADR(void *inst); T16_ADR(RegisterA32 &rd, Off offset); - T16_ADR(RegisterA32 &rd, Label &label); + T16_ADR(RegisterA32 &rd, Label *label); DEFINE_IS(ADR) - DEFINE_INST_CODE(ADR) - Off GetImmPCOffset() override; Addr GetImmPCOffsetTarget() override; void OnOffsetApply(Off offset) override; - void Disassembler(T16_STRUCT_ADR *inst) override; + void Disassembler() override; void Assembler() override; @@ -302,20 +287,18 @@ namespace SandHook { }; - class INST_T16(CMP_REG) : public InstructionT16 { + DEFINE_INST(CMP_REG) { public: T16_CMP_REG(); - T16_CMP_REG(T16_STRUCT_CMP_REG *inst); + T16_CMP_REG(void *inst); T16_CMP_REG(RegisterA32 &rm, RegisterA32 &rn); - DEFINE_INST_CODE(CMP_REG) - DEFINE_IS_EXT(CMP_REG, TEST_INST_FIELD(opcode_base, OPCODE_T16(DATA_PROC)) && TEST_INST_FIELD(opcode, OPCODE_T16(CMP_REG))) - void Disassembler(T16_STRUCT_CMP_REG *inst) override; + void Disassembler() override; void Assembler() override; @@ -325,23 +308,21 @@ namespace SandHook { }; - class INST_T16(MOV_REG) : public InstructionT16 { + DEFINE_INST(MOV_REG) { public: - T16_MOV_REG(T16_STRUCT_MOV_REG *inst); + T16_MOV_REG(void *inst); T16_MOV_REG(RegisterA32 &rd, RegisterA32 &rm); - DEFINE_INST_CODE(MOV_REG) - DEFINE_IS_EXT(MOV_REG, TEST_INST_FIELD(opcode_base, OPCODE_T16(DATA_PROC)) && TEST_INST_FIELD(opcode, OPCODE_T16(MOV_REG))) - void Disassembler(T16_STRUCT_MOV_REG *inst) override; + void Disassembler() override; void Assembler() override; - bool pcRelate() override; + bool PcRelate() override; public: RegisterA32 *rd; @@ -349,19 +330,16 @@ namespace SandHook { }; - class INST_T16(ADD_REG) : public InstructionT16 { + DEFINE_INST(ADD_REG) { public: - T16_ADD_REG(); - T16_ADD_REG(T16_STRUCT_ADD_REG *inst); + T16_ADD_REG(void *inst); T16_ADD_REG(RegisterA32 *rd, RegisterA32 *rn, RegisterA32 *rm); DEFINE_IS(ADD_REG) - DEFINE_INST_CODE(ADD_REG) - - void Disassembler(T16_STRUCT_ADD_REG *inst) override; + void Disassembler() override; void Assembler() override; @@ -372,18 +350,16 @@ namespace SandHook { }; - class INST_T16(CMP_REG_EXT) : public InstructionT16 { + DEFINE_INST(CMP_REG_EXT) { public: - T16_CMP_REG_EXT(T16_STRUCT_CMP_REG_EXT *inst); + T16_CMP_REG_EXT(void *inst); T16_CMP_REG_EXT(RegisterA32 &rn, RegisterA32 &rm); DEFINE_IS(CMP_REG_EXT) - DEFINE_INST_CODE(CMP_REG_EXT) - - void Disassembler(T16_STRUCT_CMP_REG_EXT *inst) override; + void Disassembler() override; void Assembler() override; @@ -394,17 +370,15 @@ namespace SandHook { }; - class INST_T16(POP) : public InstructionT16 { + DEFINE_INST(POP) { public: - T16_POP(T16_STRUCT_POP *inst); + T16_POP(void *inst); T16_POP(const RegisterList ®isterList); DEFINE_IS(POP) - DEFINE_INST_CODE(POP) - - void Disassembler(T16_STRUCT_POP *inst) override; + void Disassembler() override; void Assembler() override; @@ -413,17 +387,16 @@ namespace SandHook { }; - class INST_T16(PUSH) : public InstructionT16 { + DEFINE_INST(PUSH) { public: - T16_PUSH(T16_STRUCT_PUSH *inst); + + T16_PUSH(void *inst); T16_PUSH(const RegisterList ®isterList); DEFINE_IS(PUSH) - DEFINE_INST_CODE(PUSH) - - void Disassembler(T16_STRUCT_PUSH *inst) override; + void Disassembler() override; void Assembler() override; @@ -432,9 +405,9 @@ namespace SandHook { }; - class INST_T16(ADD_REG_RDN) : public InstructionT16 { + DEFINE_INST(ADD_REG_RDN) { public: - T16_ADD_REG_RDN(T16_STRUCT_ADD_REG_RDN *inst); + T16_ADD_REG_RDN(void *inst); T16_ADD_REG_RDN(RegisterA32 &rdn, RegisterA32 &rm); @@ -442,11 +415,9 @@ namespace SandHook { DEFINE_IS(ADD_REG_RDN) - DEFINE_INST_CODE(ADD_REG_RDN) - - bool pcRelate() override; + bool PcRelate() override; - void Disassembler(T16_STRUCT_ADD_REG_RDN *inst) override; + void Disassembler() override; void Assembler() override; @@ -462,4 +433,7 @@ namespace SandHook { #undef DEFINE_IS #undef TEST_INST_FIELD #undef TEST_INST_OPCODE -#undef DEFINE_INST_CODE \ No newline at end of file +#undef DEFINE_INST +#undef DEFINE_INST_EXT +#undef DEFINE_INST_EXT_ +#undef DEFINE_INST_PCREL \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp index 6432f8b8..a5db0d42 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp @@ -18,26 +18,17 @@ using namespace SandHook::AsmA32; //Unknow -T32_UNKNOW::T32_UNKNOW(STRUCT_T32(UNKNOW) &inst) : InstructionT32(&inst) { - Disassembler(&inst); +T32_UNKNOW::T32_UNKNOW(void *inst) : InstructionT32(inst) { } -void T32_UNKNOW::Disassembler(T32_STRUCT_UNKNOW *inst) { - inst_backup = *inst; -} - -void T32_UNKNOW::Assembler() { - Set(inst_backup); -} -T32_B32::T32_B32(T32_STRUCT_B32 *inst) : T32_INST_PC_REL(inst) { - Disassembler(inst); +T32_B32::T32_B32(void *inst) : T32_INST_PC_REL(inst) { } T32_B32::T32_B32(T32_B32::OP op, T32_B32::X x, Off offset) : op(op), x(x), offset(offset) {} -T32_B32::T32_B32(T32_B32::OP op, T32_B32::X x, Label &label) : op(op), x(x) { +T32_B32::T32_B32(T32_B32::OP op, T32_B32::X x, Label *label) : op(op), x(x) { BindLabel(label); } @@ -54,9 +45,9 @@ Off T32_B32::GetImmPCOffset() { return SignExtend32(25, COMBINE(Si1i2, imm21, 21) << 1); } -void T32_B32::Disassembler(T32_STRUCT_B32 *inst) { +void T32_B32::Disassembler() { DECODE_OP; - x = X(inst->X); + x = X(Get()->X); offset = GetImmPCOffset(); } @@ -87,7 +78,7 @@ void T32_B32::Assembler() { Addr T32_B32::GetImmPCOffsetTarget() { if (x == arm && op == BL) { - void* base = reinterpret_cast(ALIGN((Addr) getPC(), 4)); + void* base = reinterpret_cast(ALIGN((Addr) GetPC(), 4)); return offset + reinterpret_cast(base); } else { return T32_INST_PC_REL::GetImmPCOffsetTarget(); @@ -95,16 +86,16 @@ Addr T32_B32::GetImmPCOffsetTarget() { } -T32_LDR_UIMM::T32_LDR_UIMM(T32_STRUCT_LDR_UIMM *inst) : InstructionT32(inst) {} +T32_LDR_UIMM::T32_LDR_UIMM(void *inst) : InstructionT32(inst) {} T32_LDR_UIMM::T32_LDR_UIMM(RegisterA32 &rt, RegisterA32 &rn, U32 offset) : rt(&rt), rn(&rn), offset(offset) {} -void T32_LDR_UIMM::Disassembler(T32_STRUCT_LDR_UIMM *inst) { +void T32_LDR_UIMM::Disassembler() { DECODE_RN(Reg); DECODE_RT(Reg); INST_ASSERT(rn == &PC); - offset = inst->imm12; + offset = Get()->imm12; } void T32_LDR_UIMM::Assembler() { @@ -115,16 +106,13 @@ void T32_LDR_UIMM::Assembler() { Get()->imm12 = offset; } -T32_LDR_LIT::T32_LDR_LIT() {} - -T32_LDR_LIT::T32_LDR_LIT(T32_STRUCT_LDR_LIT *inst) : T32_INST_PC_REL(inst) { - Disassembler(inst); +T32_LDR_LIT::T32_LDR_LIT(void *inst) : T32_INST_PC_REL(inst) { } T32_LDR_LIT::T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Off offset) : op(op), s(s), rt(&rt), offset(offset) {} -T32_LDR_LIT::T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Label& label) : op(op), s(s), rt(&rt) { +T32_LDR_LIT::T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Label* label) : op(op), s(s), rt(&rt) { BindLabel(label); } @@ -143,10 +131,10 @@ void T32_LDR_LIT::OnOffsetApply(Off offset) { } } -void T32_LDR_LIT::Disassembler(T32_STRUCT_LDR_LIT *inst) { +void T32_LDR_LIT::Disassembler() { DECODE_OP; DECODE_RT(Reg); - s = S(inst->S); + s = S(Get()->S); offset = GetImmPCOffset(); } @@ -165,21 +153,19 @@ void T32_LDR_LIT::Assembler() { } -T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM() {} -T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM(T32_STRUCT_MOV_MOVT_IMM *inst) : InstructionT32(inst) { - Disassembler(inst); +T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM(void *inst) : InstructionT32(inst) { } T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM(T32_MOV_MOVT_IMM::OP op, RegisterA32 &rd, U16 imm16) : op(op), rd(&rd), imm16(imm16) {} -void T32_MOV_MOVT_IMM::Disassembler(T32_STRUCT_MOV_MOVT_IMM *inst) { +void T32_MOV_MOVT_IMM::Disassembler() { DECODE_OP; DECODE_RD(Reg); - U16 imm4i = COMBINE(inst->imm4, inst->i, 1); - U16 imm38 = COMBINE(inst->imm3, inst->imm8, 8); + U16 imm4i = COMBINE(Get()->imm4, Get()->i, 1); + U16 imm38 = COMBINE(Get()->imm3, Get()->imm8, 8); imm16 = COMBINE(imm4i, imm38, 11); } @@ -195,28 +181,27 @@ void T32_MOV_MOVT_IMM::Assembler() { } -T32_LDR_IMM::T32_LDR_IMM(T32_STRUCT_LDR_IMM *inst) : InstructionT32(inst) { - Disassembler(inst); +T32_LDR_IMM::T32_LDR_IMM(void *inst) : InstructionT32(inst) { } T32_LDR_IMM::T32_LDR_IMM(T32_LDR_IMM::OP op, RegisterA32 &rt, const MemOperand &operand) : op(op), rt(&rt), operand(operand) {} -void T32_LDR_IMM::Disassembler(T32_STRUCT_LDR_IMM *inst) { +void T32_LDR_IMM::Disassembler() { DECODE_OP; DECODE_RT(Reg); - operand.rn = Reg(static_cast(inst->rn)); - if (inst->P == 1 && inst->U == 0 && inst->W == 0) { + operand.rn = Reg(static_cast(Get()->rn)); + if (Get()->P == 1 && Get()->U == 0 && Get()->W == 0) { operand.addr_mode = Offset; - } else if (inst->P == 0 && inst->W == 1) { + } else if (Get()->P == 0 && Get()->W == 1) { operand.addr_mode = PostIndex; - } else if (inst->P == 1 && inst->W == 1) { + } else if (Get()->P == 1 && Get()->W == 1) { operand.addr_mode = PreIndex; } else { - valid = false; + valid_ = false; } - operand.offset = inst->U == 0 ? -inst->imm8 : inst->imm8; + operand.offset = Get()->U == 0 ? -Get()->imm8 : Get()->imm8; } void T32_LDR_IMM::Assembler() { @@ -246,12 +231,11 @@ void T32_LDR_IMM::Assembler() { Get()->W = 1; break; default: - valid = false; + valid_ = false; } } -T32_SUB_IMM::T32_SUB_IMM(T32_STRUCT_SUB_IMM *inst) : InstructionT32(inst) { - DisAssembler(inst); +T32_SUB_IMM::T32_SUB_IMM(void *inst) : InstructionT32(inst) { } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h index 43303858..38760f13 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h @@ -14,10 +14,10 @@ #define INST_T32(X) T32_##X -#define IS_OPCODE_T32(RAW,OP) INST_T32(OP)::is(RAW) +#define IS_OPCODE_T32(RAW,OP) INST_T32(OP)::Is(RAW) #define DEFINE_IS_EXT(X, COND) \ -inline static bool is(InstT32& inst) { \ +inline static bool Is(InstT32& inst) { \ union { \ InstT32 raw; \ STRUCT_T32(X) inst; \ @@ -34,10 +34,14 @@ return COND; \ #define TEST_INST_OPCODE(X, INDEX) inst_test.inst.opcode##INDEX == OPCODE_T32(X##_##INDEX) -#define DEFINE_INST_CODE(X) \ -inline U32 instCode() override { \ -return ENUM_VALUE(InstCodeT32, InstCodeT32::X); \ -} +#define DEFINE_INST(X) class INST_T32(X) : public InstructionT32 + +#define DEFINE_INST_EXT(X,P) class INST_T32(X) : public INST_T32(P) + +#define DEFINE_INST_EXT_(X,P) class INST_T32(X) : public P + +#define DEFINE_INST_PCREL(X) class INST_T32(X) : public T32_INST_PC_REL + using namespace SandHook::RegistersA32; @@ -45,52 +49,44 @@ namespace SandHook { namespace AsmA32 { - template - class InstructionT32 : public Instruction { + template + class InstructionT32 : public Instruction { public: InstructionT32() {} - InstructionT32(Inst *inst) : Instruction(inst) {} + InstructionT32(void *inst) : Instruction(inst) {} - Inst mask(Inst raw) { - return raw & *(this->Get()); - } - - U32 size() override { + U32 Size() override { return 4; } - void *getPC() override { - return reinterpret_cast((Addr) Instruction::GetPC() + 2 * 2); - } - - Addr getVPC() override { - return Instruction::GetVPC() + 2 * 2; + void *GetPC() override { + return reinterpret_cast((Addr) Instruction::GetPC() + 2 * 2); } - static inline S32 SignExtend32(unsigned int bits, U32 value) { - return ExtractSignedBitfield32(bits - 1, 0, value); + Addr GetVPC() override { + return Instruction::GetVPC() + 2 * 2; } - InstType instType() override { + InstType InstType() override { return thumb32; } - Arch arch() override { + Arch Arch() override { return arm32; } }; - template - class T32_INST_PC_REL : public InstructionT32 { + template + class T32_INST_PC_REL : public InstructionT32 { public: - T32_INST_PC_REL() {}; + T32_INST_PC_REL() {} - T32_INST_PC_REL(Inst *inst) : InstructionT32(inst) {}; + T32_INST_PC_REL(void *inst) : InstructionT32(inst) {}; virtual Off GetImmPCOffset() { return 0; @@ -100,34 +96,26 @@ namespace SandHook { return (Addr) this->GetPC() + GetImmPCOffset(); }; - inline bool pcRelate() override { + inline bool PcRelate() override { return true; }; }; - class INST_T32(UNKNOW) : public InstructionT32 { + DEFINE_INST(UNKNOW) { public: - T32_UNKNOW(STRUCT_T32(UNKNOW) &inst); + T32_UNKNOW(void* inst); - DEFINE_INST_CODE(UNKNOW) - - inline bool unknow() override { + inline bool Unknow() override { return true; } - void Disassembler(T32_STRUCT_UNKNOW *inst) override; - - void Assembler() override; - - private: - STRUCT_T32(UNKNOW) inst_backup; }; - class INST_T32(B32) : public T32_INST_PC_REL { + DEFINE_INST_PCREL(B32) { public: enum OP { @@ -140,13 +128,11 @@ namespace SandHook { thumb = 0b1 }; - T32_B32(T32_STRUCT_B32 *inst); + T32_B32(void *inst); T32_B32(OP op, X x, Off offset); - T32_B32(OP op, X x, Label& label); - - DEFINE_INST_CODE(B32) + T32_B32(OP op, X x, Label* label); DEFINE_IS_EXT(B32, TEST_INST_FIELD(opcode, OPCODE_T32(B32)) && (TEST_INST_FIELD(op, B) || TEST_INST_FIELD(op, BL))) @@ -154,7 +140,7 @@ namespace SandHook { Off GetImmPCOffset() override; - void Disassembler(T32_STRUCT_B32 *inst) override; + void Disassembler() override; void Assembler() override; @@ -164,17 +150,16 @@ namespace SandHook { Off offset; }; - class INST_T32(LDR_UIMM) : public InstructionT32 { + DEFINE_INST(LDR_UIMM) { public: - T32_LDR_UIMM(T32_STRUCT_LDR_UIMM *inst); - T32_LDR_UIMM(RegisterA32 &rt, RegisterA32 &rn, U32 offset); + T32_LDR_UIMM(void *inst); - DEFINE_INST_CODE(LDR_UIMM) + T32_LDR_UIMM(RegisterA32 &rt, RegisterA32 &rn, U32 offset); DEFINE_IS(LDR_UIMM) - void Disassembler(T32_STRUCT_LDR_UIMM *inst) override; + void Disassembler() override; void Assembler() override; @@ -185,7 +170,7 @@ namespace SandHook { }; - class INST_T32(LDR_LIT) : public T32_INST_PC_REL { + DEFINE_INST_PCREL(LDR_LIT) { public: enum OP { @@ -204,23 +189,19 @@ namespace SandHook { Sign = 0b1 }; - T32_LDR_LIT(); - - T32_LDR_LIT(T32_STRUCT_LDR_LIT *inst); + T32_LDR_LIT(void *inst); T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Off offset); - T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Label& label); + T32_LDR_LIT(OP op, S s, RegisterA32 &rt, Label* label); DEFINE_IS_EXT(LDR_LIT, TEST_INST_FIELD(opcode, OPCODE_T32(LDR_LIT)) && (TEST_INST_FIELD(op, LDR) || TEST_INST_FIELD(op, LDRB) || TEST_INST_FIELD(op, LDRH))) - DEFINE_INST_CODE(LDR_LIT) - Off GetImmPCOffset() override; void OnOffsetApply(Off offset) override; - void Disassembler(T32_STRUCT_LDR_LIT *inst) override; + void Disassembler() override; void Assembler() override; @@ -232,7 +213,7 @@ namespace SandHook { }; - class INST_T32(MOV_MOVT_IMM) : public InstructionT32 { + DEFINE_INST(MOV_MOVT_IMM) { public: enum OP { @@ -240,17 +221,13 @@ namespace SandHook { MOVT = 0b101100 }; - T32_MOV_MOVT_IMM(); - - T32_MOV_MOVT_IMM(T32_STRUCT_MOV_MOVT_IMM *inst); + T32_MOV_MOVT_IMM(void *inst); T32_MOV_MOVT_IMM(OP op, RegisterA32 &rd, U16 imm16); DEFINE_IS_EXT(MOV_MOVT_IMM, TEST_INST_OPCODE(MOV_MOVT_IMM, 1) && TEST_INST_OPCODE(MOV_MOVT_IMM, 2) && (TEST_INST_FIELD(op, MOV) || TEST_INST_FIELD(op, MOVT))) - DEFINE_INST_CODE(MOV_MOVT_IMM) - - void Disassembler(T32_STRUCT_MOV_MOVT_IMM *inst) override; + void Disassembler() override; void Assembler() override; @@ -261,7 +238,7 @@ namespace SandHook { }; - class INST_T32(LDR_IMM) : public InstructionT32 { + DEFINE_INST(LDR_IMM) { public: enum OP { @@ -272,15 +249,13 @@ namespace SandHook { LDRSH = 0b0011 }; - T32_LDR_IMM(T32_STRUCT_LDR_IMM *inst); + T32_LDR_IMM(void *inst); T32_LDR_IMM(OP op, RegisterA32 &rt, const MemOperand &operand); DEFINE_IS_EXT(LDR_IMM, TEST_INST_OPCODE(LDR_IMM, 1) && TEST_INST_OPCODE(LDR_IMM, 2)) - DEFINE_INST_CODE(LDR_IMM) - - void Disassembler(T32_STRUCT_LDR_IMM *inst) override; + void Disassembler() override; void Assembler() override; @@ -291,7 +266,7 @@ namespace SandHook { }; - class INST_T32(SUB_IMM) : public InstructionT32 { + DEFINE_INST(SUB_IMM) { public: enum OP { @@ -299,11 +274,10 @@ namespace SandHook { T4 = 0b10101 }; - T32_SUB_IMM(T32_STRUCT_SUB_IMM *inst); + T32_SUB_IMM(void *inst); DEFINE_IS_EXT(SUB_IMM, TEST_INST_OPCODE(SUB_IMM, 1) && TEST_INST_OPCODE(SUB_IMM, 2) && (TEST_INST_FIELD(op, T3) || TEST_INST_FIELD(op, T4))) - DEFINE_INST_CODE(SUB_IMM) }; } @@ -314,4 +288,7 @@ namespace SandHook { #undef DEFINE_IS #undef TEST_INST_FIELD #undef TEST_INST_OPCODE -#undef DEFINE_INST_CODE +#undef DEFINE_INST +#undef DEFINE_INST_EXT +#undef DEFINE_INST_EXT_ +#undef DEFINE_INST_PCREL \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.cpp index 606bb52c..8cad0778 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.cpp @@ -14,7 +14,7 @@ SandHook::Asm::RegisterA32::RegisterA32() { } -U8 SandHook::Asm::RegisterA32::getWide() { +U8 SandHook::Asm::RegisterA32::Wide() { return 4; } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h index a8f3f6c1..4152dfe9 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/register/register_arm32.h @@ -32,7 +32,7 @@ namespace SandHook { RegisterA32(U8 code); - U8 getWide() override; + U8 Wide() override; virtual bool isUnkonw () { return Code() == 38; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp index b2b65814..70f889c9 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp @@ -24,8 +24,8 @@ CodeRelocateA32::CodeRelocateA32(AssemblerA32 &assembler) : CodeRelocate(assembl this->assemblerA32 = &assembler; } -bool CodeRelocateA32::visit(Unit *unit, void *pc) { - relocate(reinterpret_cast *>(unit), __ getPC()); +bool CodeRelocateA32::Visit(BaseUnit *unit, void *pc) { + relocate(reinterpret_cast(unit), __ getPC()); curOffset += unit->Size(); if (unit->RefCount() == 0) { delete unit; @@ -36,28 +36,28 @@ bool CodeRelocateA32::visit(Unit *unit, void *pc) { void* CodeRelocateA32::relocate(void *startPc, Addr len, void *toPc = nullptr) throw(ErrorCodeException) { AutoLock autoLock(relocateLock); startAddr = reinterpret_cast(startPc); - if (isThumbCode(startAddr)) { - startAddr = reinterpret_cast(getThumbCodeAddress(startPc)); + if (IsThumbCode(startAddr)) { + startAddr = reinterpret_cast(GetThumbCodeAddress(startPc)); } length = len; curOffset = 0; __ allocBufferFirst(static_cast(len * 8)); void* curPc = __ getPC(); if (toPc == nullptr) { - Disassembler::Get()->Disassembler(startPc, len, *this, true); + Disassembler::get()->Disassembler(startPc, len, *this, true); } else { //TODO } return curPc; } -void* CodeRelocateA32::relocate(Instruction *instruction, void *toPc) throw(ErrorCodeException) { +void* CodeRelocateA32::relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { void* curPc = __ getPC(); //insert later AddBind labels __ Emit(getLaterBindLabel(curOffset)); - if (!instruction->pcRelate()) { + if (!instruction->PcRelate()) { __ Emit(instruction); instruction->Ref(); return curPc; @@ -136,12 +136,12 @@ IMPL_RELOCATE(T16, B) { ALIGN_FOR_LDR __ Ldr(PC, target_label); __ Emit(target_label); - __ Emit((Addr) getThumbPC(reinterpret_cast(targetAddr))); + __ Emit((Addr) GetThumbPC(reinterpret_cast(targetAddr))); } IMPL_RELOCATE(T16, BX_BLX) { - __ Emit(reinterpret_cast*>(inst)); + __ Emit(reinterpret_cast(inst)); inst->Ref(); } @@ -150,8 +150,8 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { inst->Ref(); if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { - inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } @@ -161,24 +161,24 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { Label* false_label = new Label; Label* target_label = new Label(); - inst->BindLabel(*true_label); - __ Emit(reinterpret_cast*>(inst)); + inst->BindLabel(true_label); + __ Emit(reinterpret_cast(inst)); __ B(false_label); __ Emit(true_label); ALIGN_FOR_LDR __ Ldr(PC, target_label); __ Emit(target_label); - __ Emit((Addr) getThumbPC(reinterpret_cast(targetAddr))); + __ Emit((Addr) GetThumbPC(reinterpret_cast(targetAddr))); __ Emit(false_label); } IMPL_RELOCATE(T16, LDR_LIT) { - if (inRelocateRange(CODE_OFFSET(inst), inst->rt->getWide())) { + if (inRelocateRange(CODE_OFFSET(inst), inst->rt->Wide())) { inst->Ref(); - inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } @@ -190,10 +190,10 @@ IMPL_RELOCATE(T16, LDR_LIT) { IMPL_RELOCATE(T16, ADR) { - if (inRelocateRange(CODE_OFFSET(inst), inst->rd->getWide())) { + if (inRelocateRange(CODE_OFFSET(inst), inst->rd->Wide())) { inst->Ref(); - inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } @@ -207,14 +207,14 @@ IMPL_RELOCATE(T16, ADD_REG_RDN) { if (*inst->rm != PC) { inst->Ref(); - __ Emit(reinterpret_cast*>(inst)); + __ Emit(reinterpret_cast(inst)); return; } RegisterA32& tmpReg = *inst->rdn != R0 ? R0 : R1; __ Push(tmpReg); - __ Mov(tmpReg,(Addr)inst->getPC()); + __ Mov(tmpReg,(Addr)inst->GetPC()); __ Add(*inst->rdn, *inst->rdn, tmpReg); __ Pop(tmpReg); @@ -224,8 +224,8 @@ IMPL_RELOCATE(T32, B32) { if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { inst->Ref(); - inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); - __ Emit(reinterpret_cast *>(inst)); + inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } @@ -234,7 +234,7 @@ IMPL_RELOCATE(T32, B32) { if (inst->x == T32_B32::thumb) { //Thumb mode - targetAddr = reinterpret_cast(getThumbPC(reinterpret_cast(targetAddr))); + targetAddr = reinterpret_cast(GetThumbPC(reinterpret_cast(targetAddr))); } __ Mov(IP, targetAddr); if (inst->op == T32_B32::BL) { @@ -249,8 +249,8 @@ IMPL_RELOCATE(T32, LDR_LIT) { if (inRelocateRange(CODE_OFFSET(inst), sizeof(Addr))) { inst->Ref(); - inst->BindLabel(*getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); - __ Emit(reinterpret_cast*>(inst)); + inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + __ Emit(reinterpret_cast(inst)); return; } @@ -277,7 +277,7 @@ IMPL_RELOCATE(T32, LDR_LIT) { break; default: inst->Ref(); - __ Emit(reinterpret_cast*>(inst)); + __ Emit(reinterpret_cast(inst)); } } \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h index 12e41431..2a4cdcc0 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h @@ -22,11 +22,11 @@ namespace SandHook { public: CodeRelocateA32(AssemblerA32 &assembler); - void* relocate(Instruction *instruction, void *toPc) throw(ErrorCodeException) override; + void* relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) override; void* relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; - bool visit(Unit *unit, void *pc) override; + bool Visit(BaseUnit *unit, void *pc) override; DEFINE_RELOCATE(T16, B_COND) diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h index c22274a3..8fb5958c 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h @@ -766,7 +766,7 @@ namespace SandHook { #undef DEFINE_IS #undef TEST_INST_FIELD #undef TEST_INST_OPCODE -#undef DEFINE_INST_CODE +#undef DEFINE_INST #undef DEFINE_INST_EXT #undef DEFINE_INST_EXT_ #undef DEFINE_INST_PCREL From 612980bea696df61557f950fa003af641a936546 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Mon, 1 Jul 2019 16:42:51 +0800 Subject: [PATCH 3/9] [Reconstitution]tweak typo --- .../cpp/archs/arm/arm32/inst/inst_arm32.cpp | 2 +- .../cpp/archs/arm/arm32/inst/inst_arm32.h | 2 +- .../cpp/archs/arm/arm32/inst/inst_t16.cpp | 56 ++++++------- .../main/cpp/archs/arm/arm32/inst/inst_t16.h | 56 ++++++------- .../cpp/archs/arm/arm32/inst/inst_t32.cpp | 20 ++--- .../main/cpp/archs/arm/arm32/inst/inst_t32.h | 20 ++--- .../archs/arm/arm64/decoder/decoder_arm64.cpp | 2 +- .../cpp/archs/arm/arm64/inst/inst_arm64.cpp | 80 +++++++++---------- .../cpp/archs/arm/arm64/inst/inst_arm64.h | 80 +++++++++---------- nativehook/src/main/cpp/asm/instruction.h | 4 +- .../src/main/cpp/assembler/assembler.cpp | 2 +- nativehook/src/main/cpp/sandhook_native.cpp | 2 +- 12 files changed, 163 insertions(+), 163 deletions(-) diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp index 066cb315..53f24853 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.cpp @@ -42,7 +42,7 @@ //} // // -//void A64_STR_IMM::Assembler() { +//void A64_STR_IMM::Assemble() { // INST_DCHECK(condition, Condition::nv) // //} \ No newline at end of file diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h index 7c2f4bd1..5d314306 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_arm32.h @@ -25,7 +25,7 @@ namespace SandHook { // // void DisAssembler(STRUCT_A64(STR_IMM) *inst) override; // -// void Assembler() override; +// void Assemble() override; // // AddrMode getAddrMode() { // return operand.addr_mode_; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp index 6639472d..ec366f6d 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp @@ -35,11 +35,11 @@ Off T16_B::GetImmPCOffset() { return DECODE_OFFSET(11, 1); } -void T16_B::Disassembler() { +void T16_B::Disassemble() { offset = GetImmPCOffset(); } -void T16_B::Assembler() { +void T16_B::Assemble() { SET_OPCODE(B); DECODE_OFFSET(11, 1); } @@ -62,12 +62,12 @@ T16_B_COND::T16_B_COND(Condition condition, Label *label) { BindLabel(label); } -void T16_B_COND::Disassembler() { +void T16_B_COND::Disassemble() { DECODE_COND; offset = GetImmPCOffset(); } -void T16_B_COND::Assembler() { +void T16_B_COND::Assemble() { SET_OPCODE(B_COND); ENCODE_COND; ENCODE_OFFSET(8, 1); @@ -89,12 +89,12 @@ T16_BX_BLX::T16_BX_BLX(void *inst) : T16_INST_PC_REL(inst) {} T16_BX_BLX::T16_BX_BLX(T16_BX_BLX::OP op, RegisterA32 &rm) : op(op), rm(&rm) {} -void T16_BX_BLX::Disassembler() { +void T16_BX_BLX::Disassemble() { DECODE_OP; DECODE_RM(Reg); } -void T16_BX_BLX::Assembler() { +void T16_BX_BLX::Assemble() { SET_OPCODE_MULTI(BX_BLX, 1); SET_OPCODE_MULTI(BX_BLX, 2); ENCODE_OP; @@ -116,13 +116,13 @@ Off T16_CBZ_CBNZ::GetImmPCOffset() { return COMBINE(Get()->i, Get()->imm5, 5) << 2; } -void T16_CBZ_CBNZ::Disassembler() { +void T16_CBZ_CBNZ::Disassemble() { offset = GetImmPCOffset(); DECODE_RN(Reg); DECODE_OP; } -void T16_CBZ_CBNZ::Assembler() { +void T16_CBZ_CBNZ::Assemble() { SET_OPCODE_MULTI(CBZ_CBNZ, 1); SET_OPCODE_MULTI(CBZ_CBNZ, 2); SET_OPCODE_MULTI(CBZ_CBNZ, 3); @@ -155,12 +155,12 @@ void T16_LDR_LIT::OnOffsetApply(Off offset) { ENCODE_OFFSET(8, 2); } -void T16_LDR_LIT::Disassembler() { +void T16_LDR_LIT::Disassemble() { DECODE_RT(Reg); offset = GetImmPCOffset(); } -void T16_LDR_LIT::Assembler() { +void T16_LDR_LIT::Assemble() { SET_OPCODE(LDR_LIT); ENCODE_RT; ENCODE_OFFSET(8, 2); @@ -174,12 +174,12 @@ T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(void *inst) : InstructionT16(inst) {} T16_ADD_IMM_RDN::T16_ADD_IMM_RDN(RegisterA32 *rdn, U8 imm8) : rdn(rdn), imm8(imm8) {} -void T16_ADD_IMM_RDN::Disassembler() { +void T16_ADD_IMM_RDN::Disassemble() { rdn = Reg(Get()->rdn); imm8 = Get()->imm8; } -void T16_ADD_IMM_RDN::Assembler() { +void T16_ADD_IMM_RDN::Assemble() { SET_OPCODE(ADD_IMM_RDN); Get()->imm8 = imm8; Get()->rdn = rdn->Code(); @@ -211,13 +211,13 @@ void T16_ADR::OnOffsetApply(Off offset) { Get()->imm8 = (U32)offset >> 2; } -void T16_ADR::Disassembler() { +void T16_ADR::Disassemble() { offset = GetImmPCOffset(); DECODE_RD(Reg); } -void T16_ADR::Assembler() { +void T16_ADR::Assemble() { SET_OPCODE(ADR); ENCODE_RD; Get()->imm8 = (U32)offset >> 2; @@ -228,12 +228,12 @@ T16_CMP_REG::T16_CMP_REG(void *inst) : InstructionT16(inst) {} T16_CMP_REG::T16_CMP_REG(RegisterA32 &rm, RegisterA32 &rn) : rm(&rm), rn(&rn) {} -void T16_CMP_REG::Disassembler() { +void T16_CMP_REG::Disassemble() { DECODE_RM(Reg); DECODE_RN(Reg); } -void T16_CMP_REG::Assembler() { +void T16_CMP_REG::Assemble() { SET_BASE_OPCODE(DATA_PROC); SET_OPCODE(CMP_REG); ENCODE_RM; @@ -246,12 +246,12 @@ T16_MOV_REG::T16_MOV_REG(void *inst) : InstructionT16(inst) {} T16_MOV_REG::T16_MOV_REG(RegisterA32 &rd, RegisterA32 &rm) : rm(&rm), rd(&rd) {} -void T16_MOV_REG::Disassembler() { +void T16_MOV_REG::Disassemble() { DECODE_RM(Reg); rd = Reg(static_cast(COMBINE(Get()->D, Get()->rd, 3))); } -void T16_MOV_REG::Assembler() { +void T16_MOV_REG::Assemble() { SET_BASE_OPCODE(DATA_PROC); SET_OPCODE(MOV_REG); ENCODE_RM; @@ -271,13 +271,13 @@ T16_ADD_REG::T16_ADD_REG(void *inst) : InstructionT16(inst) {} T16_ADD_REG::T16_ADD_REG(RegisterA32 *rd, RegisterA32 *rn, RegisterA32 *rm) : rd(rd), rn(rn), rm(rm) {} -void T16_ADD_REG::Disassembler() { +void T16_ADD_REG::Disassemble() { DECODE_RD(Reg); DECODE_RN(Reg); DECODE_RM(Reg); } -void T16_ADD_REG::Assembler() { +void T16_ADD_REG::Assemble() { SET_OPCODE(ADD_REG); INST_ASSERT(rd->Code() > 7); INST_ASSERT(rn->Code() > 7); @@ -293,12 +293,12 @@ T16_CMP_REG_EXT::T16_CMP_REG_EXT(void *inst) : InstructionT16(inst) {} T16_CMP_REG_EXT::T16_CMP_REG_EXT(RegisterA32 &rn, RegisterA32 &rm) : rn(&rn), rm(&rm) {} -void T16_CMP_REG_EXT::Disassembler() { +void T16_CMP_REG_EXT::Disassemble() { rn = Reg(COMBINE(Get()->N, Get()->rn, 3)); DECODE_RM(Reg); } -void T16_CMP_REG_EXT::Assembler() { +void T16_CMP_REG_EXT::Assemble() { SET_OPCODE(CMP_REG_EXT); ENCODE_RM; Get()->rn = BITS(rn->Code(), 0, 2); @@ -311,11 +311,11 @@ T16_POP::T16_POP(void *inst) : InstructionT16(inst) {} T16_POP::T16_POP(const RegisterList ®isterList) : registerList(registerList) {} -void T16_POP::Disassembler() { +void T16_POP::Disassemble() { registerList.SetList(COMBINE(Get()->P << 7, Get()->regs, 8)); } -void T16_POP::Assembler() { +void T16_POP::Assemble() { SET_OPCODE(POP); U16 regs = registerList.GetList(); Get()->regs = BITS(regs, 0, 7); @@ -328,11 +328,11 @@ T16_PUSH::T16_PUSH(void *inst) : InstructionT16(inst) {} T16_PUSH::T16_PUSH(const RegisterList ®isterList) : registerList(registerList) {} -void T16_PUSH::Disassembler() { +void T16_PUSH::Disassemble() { registerList.SetList(COMBINE(Get()->M << 6, Get()->regs, 8)); } -void T16_PUSH::Assembler() { +void T16_PUSH::Assemble() { SET_OPCODE(PUSH); U16 regs = registerList.GetList(); Get()->regs = BITS(regs, 0, 7); @@ -349,12 +349,12 @@ bool T16_ADD_REG_RDN::PcRelate() { return *rm == PC; } -void T16_ADD_REG_RDN::Disassembler() { +void T16_ADD_REG_RDN::Disassemble() { DECODE_RM(Reg); rdn = Reg(Get()->rdn); } -void T16_ADD_REG_RDN::Assembler() { +void T16_ADD_REG_RDN::Assemble() { SET_OPCODE(ADD_REG_RDN); ENCODE_RM; Get()->rdn = rdn->Code(); diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h index f2e2e01b..8ebfc4b5 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.h @@ -128,9 +128,9 @@ namespace SandHook { Off GetImmPCOffset() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: Off offset; @@ -152,9 +152,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: Condition condition; @@ -176,9 +176,9 @@ namespace SandHook { DEFINE_IS_EXT(BX_BLX, TEST_INST_OPCODE(BX_BLX, 1) && TEST_INST_OPCODE(BX_BLX, 2)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -207,9 +207,9 @@ namespace SandHook { Off GetImmPCOffset() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -233,9 +233,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: Off offset; @@ -251,9 +251,9 @@ namespace SandHook { DEFINE_IS(ADD_IMM_RDN) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA32 *rdn; @@ -277,9 +277,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA32 *rd; @@ -298,9 +298,9 @@ namespace SandHook { DEFINE_IS_EXT(CMP_REG, TEST_INST_FIELD(opcode_base, OPCODE_T16(DATA_PROC)) && TEST_INST_FIELD(opcode, OPCODE_T16(CMP_REG))) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA32 *rm; @@ -318,9 +318,9 @@ namespace SandHook { DEFINE_IS_EXT(MOV_REG, TEST_INST_FIELD(opcode_base, OPCODE_T16(DATA_PROC)) && TEST_INST_FIELD(opcode, OPCODE_T16(MOV_REG))) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; bool PcRelate() override; @@ -339,9 +339,9 @@ namespace SandHook { DEFINE_IS(ADD_REG) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA32 *rd; @@ -359,9 +359,9 @@ namespace SandHook { DEFINE_IS(CMP_REG_EXT) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: @@ -378,9 +378,9 @@ namespace SandHook { DEFINE_IS(POP) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterList registerList; @@ -396,9 +396,9 @@ namespace SandHook { DEFINE_IS(PUSH) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterList registerList; @@ -417,9 +417,9 @@ namespace SandHook { bool PcRelate() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA32* rdn; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp index a5db0d42..1bc8f825 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.cpp @@ -45,13 +45,13 @@ Off T32_B32::GetImmPCOffset() { return SignExtend32(25, COMBINE(Si1i2, imm21, 21) << 1); } -void T32_B32::Disassembler() { +void T32_B32::Disassemble() { DECODE_OP; x = X(Get()->X); offset = GetImmPCOffset(); } -void T32_B32::Assembler() { +void T32_B32::Assemble() { SET_OPCODE(B32); ENCODE_OP; Get()->X = x; @@ -91,14 +91,14 @@ T32_LDR_UIMM::T32_LDR_UIMM(void *inst) : InstructionT32(inst) {} T32_LDR_UIMM::T32_LDR_UIMM(RegisterA32 &rt, RegisterA32 &rn, U32 offset) : rt(&rt), rn(&rn), offset(offset) {} -void T32_LDR_UIMM::Disassembler() { +void T32_LDR_UIMM::Disassemble() { DECODE_RN(Reg); DECODE_RT(Reg); INST_ASSERT(rn == &PC); offset = Get()->imm12; } -void T32_LDR_UIMM::Assembler() { +void T32_LDR_UIMM::Assemble() { SET_OPCODE(LDR_UIMM); ENCODE_RN; ENCODE_RT; @@ -131,14 +131,14 @@ void T32_LDR_LIT::OnOffsetApply(Off offset) { } } -void T32_LDR_LIT::Disassembler() { +void T32_LDR_LIT::Disassemble() { DECODE_OP; DECODE_RT(Reg); s = S(Get()->S); offset = GetImmPCOffset(); } -void T32_LDR_LIT::Assembler() { +void T32_LDR_LIT::Assemble() { SET_OPCODE(LDR_LIT); ENCODE_OP; ENCODE_RT; @@ -161,7 +161,7 @@ T32_MOV_MOVT_IMM::T32_MOV_MOVT_IMM(T32_MOV_MOVT_IMM::OP op, RegisterA32 &rd, U16 rd(&rd), imm16(imm16) {} -void T32_MOV_MOVT_IMM::Disassembler() { +void T32_MOV_MOVT_IMM::Disassemble() { DECODE_OP; DECODE_RD(Reg); U16 imm4i = COMBINE(Get()->imm4, Get()->i, 1); @@ -169,7 +169,7 @@ void T32_MOV_MOVT_IMM::Disassembler() { imm16 = COMBINE(imm4i, imm38, 11); } -void T32_MOV_MOVT_IMM::Assembler() { +void T32_MOV_MOVT_IMM::Assemble() { SET_OPCODE_MULTI(MOV_MOVT_IMM, 1); SET_OPCODE_MULTI(MOV_MOVT_IMM, 2); ENCODE_OP; @@ -188,7 +188,7 @@ T32_LDR_IMM::T32_LDR_IMM(T32_LDR_IMM::OP op, RegisterA32 &rt, const MemOperand & rt(&rt), operand(operand) {} -void T32_LDR_IMM::Disassembler() { +void T32_LDR_IMM::Disassemble() { DECODE_OP; DECODE_RT(Reg); operand.rn = Reg(static_cast(Get()->rn)); @@ -204,7 +204,7 @@ void T32_LDR_IMM::Disassembler() { operand.offset = Get()->U == 0 ? -Get()->imm8 : Get()->imm8; } -void T32_LDR_IMM::Assembler() { +void T32_LDR_IMM::Assemble() { SET_OPCODE_MULTI(LDR_IMM, 1); SET_OPCODE_MULTI(LDR_IMM, 2); ENCODE_OP; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h index 38760f13..fe051df7 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t32.h @@ -140,9 +140,9 @@ namespace SandHook { Off GetImmPCOffset() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -159,9 +159,9 @@ namespace SandHook { DEFINE_IS(LDR_UIMM) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA32* rt; @@ -201,9 +201,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -227,9 +227,9 @@ namespace SandHook { DEFINE_IS_EXT(MOV_MOVT_IMM, TEST_INST_OPCODE(MOV_MOVT_IMM, 1) && TEST_INST_OPCODE(MOV_MOVT_IMM, 2) && (TEST_INST_FIELD(op, MOV) || TEST_INST_FIELD(op, MOVT))) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -255,9 +255,9 @@ namespace SandHook { DEFINE_IS_EXT(LDR_IMM, TEST_INST_OPCODE(LDR_IMM, 1) && TEST_INST_OPCODE(LDR_IMM, 2)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp index 08bc962d..53a2d888 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp @@ -50,7 +50,7 @@ void Arm64Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi if (unit == nullptr) { unit = reinterpret_cast(new INST_A64(UNKNOW)(pc)); } - reinterpret_cast(unit)->Disassembler(); + reinterpret_cast(unit)->Disassemble(); if (!visitor.Visit(unit, pc)) { break; } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp index 94e9cb5b..70c16e3a 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.cpp @@ -62,11 +62,11 @@ Addr A64_ADR_ADRP::GetImmPCOffsetTarget() { return offset + reinterpret_cast(base); } -void A64_ADR_ADRP::Assembler() { +void A64_ADR_ADRP::Assemble() { SET_OPCODE(ADR_ADRP); } -void A64_ADR_ADRP::Disassembler() { +void A64_ADR_ADRP::Disassemble() { offset = GetImmPCOffset(); DECODE_RD(XReg); DECODE_OP; @@ -79,7 +79,7 @@ A64_MOV_WIDE::A64_MOV_WIDE(void* inst) : InstructionA64(inst) {} A64_MOV_WIDE::A64_MOV_WIDE(A64_MOV_WIDE::OP op,RegisterA64* rd, U16 imme, U8 shift) : shift(shift), op(op), imme(imme), rd(rd) {} -void A64_MOV_WIDE::Assembler() { +void A64_MOV_WIDE::Assemble() { SET_OPCODE(MOV_WIDE); Get()->imm16 = imme; Get()->hw = static_cast(shift / 16); @@ -88,7 +88,7 @@ void A64_MOV_WIDE::Assembler() { ENCODE_RD; } -void A64_MOV_WIDE::Disassembler() { +void A64_MOV_WIDE::Disassemble() { imme = static_cast(Get()->imm16); shift = static_cast(Get()->hw * 16); op = OP(Get()->op); @@ -122,12 +122,12 @@ void A64_B_BL::OnOffsetApply(Off offset) { ENCODE_OFFSET(26, 2); } -void A64_B_BL::Disassembler() { +void A64_B_BL::Disassemble() { DECODE_OP; offset = GetImmPCOffset(); } -void A64_B_BL::Assembler() { +void A64_B_BL::Assemble() { SET_OPCODE(B_BL); ENCODE_OP; ENCODE_OFFSET(26, 2); @@ -153,7 +153,7 @@ Off A64_CBZ_CBNZ::GetImmPCOffset() { return DECODE_OFFSET(19, 2); } -void A64_CBZ_CBNZ::Disassembler() { +void A64_CBZ_CBNZ::Disassemble() { DECODE_OP; if (Get()->sf == 1) { DECODE_RT(XReg); @@ -163,7 +163,7 @@ void A64_CBZ_CBNZ::Disassembler() { offset = GetImmPCOffset(); } -void A64_CBZ_CBNZ::Assembler() { +void A64_CBZ_CBNZ::Assemble() { SET_OPCODE(CBZ_CBNZ); ENCODE_OP; ENCODE_RT; @@ -193,12 +193,12 @@ Off A64_B_COND::GetImmPCOffset() { return DECODE_OFFSET(19, 2); } -void A64_B_COND::Disassembler() { +void A64_B_COND::Disassemble() { DECODE_COND; offset = GetImmPCOffset(); } -void A64_B_COND::Assembler() { +void A64_B_COND::Assemble() { SET_OPCODE(B_COND); ENCODE_COND; ENCODE_OFFSET(19, 2); @@ -230,7 +230,7 @@ Off A64_TBZ_TBNZ::GetImmPCOffset() { return DECODE_OFFSET(14, 2); } -void A64_TBZ_TBNZ::Disassembler() { +void A64_TBZ_TBNZ::Disassemble() { bit = COMBINE(Get()->b5, Get()->b40, 5); if (Get()->b5 == 1) { DECODE_RT(XReg); @@ -241,7 +241,7 @@ void A64_TBZ_TBNZ::Disassembler() { offset = GetImmPCOffset(); } -void A64_TBZ_TBNZ::Assembler() { +void A64_TBZ_TBNZ::Assemble() { SET_OPCODE(TBZ_TBNZ); ENCODE_OP; Get()->b5 = rt->isX() ? 1 : 0; @@ -277,7 +277,7 @@ void A64_LDR_LIT::OnOffsetApply(Off offset) { ENCODE_OFFSET(19, 2); } -void A64_LDR_LIT::Disassembler() { +void A64_LDR_LIT::Disassemble() { DECODE_OP; offset = GetImmPCOffset(); if (op == LDR_W) { @@ -287,7 +287,7 @@ void A64_LDR_LIT::Disassembler() { } } -void A64_LDR_LIT::Assembler() { +void A64_LDR_LIT::Assemble() { SET_OPCODE(LDR_LIT); ENCODE_OP; ENCODE_RT; @@ -301,12 +301,12 @@ A64_BR_BLR_RET::A64_BR_BLR_RET(void *inst) : InstructionA64(inst) {} A64_BR_BLR_RET::A64_BR_BLR_RET(A64_BR_BLR_RET::OP op, XRegister &rn) : op(op), rn(&rn) {} -void A64_BR_BLR_RET::Disassembler() { +void A64_BR_BLR_RET::Disassemble() { DECODE_RN(XReg); DECODE_OP; } -void A64_BR_BLR_RET::Assembler() { +void A64_BR_BLR_RET::Assemble() { SET_OPCODE_MULTI(BR_BLR_RET, 1); SET_OPCODE_MULTI(BR_BLR_RET, 2); SET_OPCODE_MULTI(BR_BLR_RET, 3); @@ -322,7 +322,7 @@ A64_STR_IMM::A64_STR_IMM(void *inst) : A64LoadAndStoreImm(inst) {} A64_STR_IMM::A64_STR_IMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) { } -void A64_STR_IMM::Disassembler() { +void A64_STR_IMM::Disassemble() { regSize = RegSize(Get()->size); switch (regSize) { case Size64: @@ -358,7 +358,7 @@ void A64_STR_IMM::Disassembler() { operand.offset_ = offset; } -void A64_STR_IMM::Assembler() { +void A64_STR_IMM::Assemble() { SET_OPCODE(STR_IMM); Get()->rt = rt->Code(); Get()->rn = operand.base_->Code(); @@ -395,7 +395,7 @@ A64_STR_UIMM::A64_STR_UIMM(void *inst) : A64LoadAndStoreImm(inst) {} A64_STR_UIMM::A64_STR_UIMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) { } -void A64_STR_UIMM::Disassembler() { +void A64_STR_UIMM::Disassemble() { regSize = RegSize(Get()->size); switch (regSize) { case Size64: @@ -416,7 +416,7 @@ void A64_STR_UIMM::Disassembler() { operand.offset_ = offset; } -void A64_STR_UIMM::Assembler() { +void A64_STR_UIMM::Assemble() { SET_OPCODE(STR_UIMM); ENCODE_RT; Get()->rn = operand.base_->Code(); @@ -438,7 +438,7 @@ A64_MOV_REG::A64_MOV_REG(void *inst) : InstructionA64(inst) { A64_MOV_REG::A64_MOV_REG(RegisterA64 &rd, RegisterA64 &rm) : rd(&rd), rm(&rm) { } -void A64_MOV_REG::Disassembler() { +void A64_MOV_REG::Disassemble() { if (Get()->sf == 1) { DECODE_RD(XReg); DECODE_RM(XReg); @@ -448,7 +448,7 @@ void A64_MOV_REG::Disassembler() { } } -void A64_MOV_REG::Assembler() { +void A64_MOV_REG::Assemble() { SET_OPCODE_MULTI(MOV_REG, 1); SET_OPCODE_MULTI(MOV_REG, 2); Get()->sf = rd->isX() ? 1 : 0; @@ -462,7 +462,7 @@ A64_SUB_EXT_REG::A64_SUB_EXT_REG(RegisterA64 &rd, RegisterA64 &rn, const Operand FlagsUpdate flagsUpdate) : rd(&rd), rn(&rn), operand(operand), flagsUpdate(flagsUpdate) {} -void A64_SUB_EXT_REG::Disassembler() { +void A64_SUB_EXT_REG::Disassemble() { flagsUpdate = FlagsUpdate(Get()->S); if (Get()->sf == 1) { DECODE_RD(XReg); @@ -478,7 +478,7 @@ void A64_SUB_EXT_REG::Disassembler() { operand.shift_ = Shift(Get()->imm3); } -void A64_SUB_EXT_REG::Assembler() { +void A64_SUB_EXT_REG::Assemble() { SET_OPCODE_MULTI(SUB_EXT_REG, 1); SET_OPCODE_MULTI(SUB_EXT_REG, 2); Get()->S = flagsUpdate; @@ -498,13 +498,13 @@ A64_EXCEPTION_GEN::A64_EXCEPTION_GEN(void* inst) : InstructionA64(inst) { A64_EXCEPTION_GEN::A64_EXCEPTION_GEN(A64_EXCEPTION_GEN::OP op, ExceptionLevel el, U16 imme) : op( op), el(el), imme(imme) {} -void A64_EXCEPTION_GEN::Disassembler() { +void A64_EXCEPTION_GEN::Disassemble() { DECODE_OP; el = ExceptionLevel(Get()->ll); imme = static_cast(Get()->imm16); } -void A64_EXCEPTION_GEN::Assembler() { +void A64_EXCEPTION_GEN::Assemble() { SET_OPCODE_MULTI(EXCEPTION_GEN, 1); SET_OPCODE_MULTI(EXCEPTION_GEN, 2); ENCODE_OP; @@ -525,7 +525,7 @@ A64_LDR_IMM::A64_LDR_IMM(void *inst) : A64LoadAndStoreImm(inst) { A64_LDR_IMM::A64_LDR_IMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) {} -void A64_LDR_IMM::Disassembler() { +void A64_LDR_IMM::Disassemble() { regSize = RegSize(Get()->size); switch (regSize) { case Size64: @@ -561,7 +561,7 @@ void A64_LDR_IMM::Disassembler() { operand.offset_ = offset; } -void A64_LDR_IMM::Assembler() { +void A64_LDR_IMM::Assemble() { SET_OPCODE(LDR_IMM); Get()->rt = rt->Code(); Get()->rn = operand.base_->Code(); @@ -600,7 +600,7 @@ A64_LDR_UIMM::A64_LDR_UIMM(void *inst) : A64LoadAndStoreImm(&inst) { A64_LDR_UIMM::A64_LDR_UIMM(RegisterA64 &rt, const MemOperand &operand) : A64LoadAndStoreImm(&rt, operand) {} -void A64_LDR_UIMM::Disassembler() { +void A64_LDR_UIMM::Disassemble() { regSize = RegSize(Get()->size); switch (regSize) { case Size64: @@ -621,7 +621,7 @@ void A64_LDR_UIMM::Disassembler() { operand.offset_ = offset; } -void A64_LDR_UIMM::Assembler() { +void A64_LDR_UIMM::Assemble() { SET_OPCODE(LDR_UIMM); Get()->rt = rt->Code(); Get()->rn = operand.base_->Code(); @@ -643,7 +643,7 @@ A64_LDRSW_IMM::A64_LDRSW_IMM(void *inst) : A64_LDR_IMM(inst) {} A64_LDRSW_IMM::A64_LDRSW_IMM(RegisterA64 &rt, const MemOperand &operand) : A64_LDR_IMM(rt, operand) {} -void A64_LDRSW_IMM::Disassembler() { +void A64_LDRSW_IMM::Disassemble() { rt = XReg(static_cast(Get()->rt)); addrMode = AdMod(Get()->addrmode); switch (addrMode) { @@ -668,7 +668,7 @@ void A64_LDRSW_IMM::Disassembler() { operand.base_ = XReg(static_cast(Get()->rn)); } -void A64_LDRSW_IMM::Assembler() { +void A64_LDRSW_IMM::Assemble() { SET_OPCODE(LDRSW_IMM); Get()->size = Size32; Get()->rt = rt->Code(); @@ -698,7 +698,7 @@ A64_LDRSW_UIMM::A64_LDRSW_UIMM(void *inst) : A64_LDR_UIMM(inst) {} A64_LDRSW_UIMM::A64_LDRSW_UIMM(XRegister &rt, const MemOperand &operand) : A64_LDR_UIMM(rt, operand) {} -void A64_LDRSW_UIMM::Disassembler() { +void A64_LDRSW_UIMM::Disassemble() { DECODE_RT(XReg); operand.base_ = XReg(static_cast(Get()->rn)); operand.addr_mode_ = AddrMode::Offset; @@ -707,7 +707,7 @@ void A64_LDRSW_UIMM::Disassembler() { operand.offset_ = offset; } -void A64_LDRSW_UIMM::Assembler() { +void A64_LDRSW_UIMM::Assemble() { SET_OPCODE(LDRSW_UIMM); Get()->size = Size32; ENCODE_RT; @@ -724,7 +724,7 @@ A64_STP_LDP::A64_STP_LDP(OP op, RegisterA64 &rt1, RegisterA64 &rt2, const MemOpe rt2(&rt2), operand(operand) {} -void A64_STP_LDP::Disassembler() { +void A64_STP_LDP::Disassemble() { DECODE_OP; RegSize s = RegSize(Get()->size); if (s == Size64) { @@ -751,7 +751,7 @@ void A64_STP_LDP::Disassembler() { } } -void A64_STP_LDP::Assembler() { +void A64_STP_LDP::Assemble() { SET_OPCODE(STP_LDP); ENCODE_OP; Get()->size = rt1->isX() ? Size64 : Size32; @@ -781,7 +781,7 @@ A64_ADD_SUB_IMM::A64_ADD_SUB_IMM(void *inst) : InstructionA64(&inst) { A64_ADD_SUB_IMM::A64_ADD_SUB_IMM(A64_ADD_SUB_IMM::OP op, A64_ADD_SUB_IMM::S sign, RegisterA64 &rd, const Operand &operand) : op(op), sign(sign), rd(&rd), operand(operand) {} -void A64_ADD_SUB_IMM::Disassembler() { +void A64_ADD_SUB_IMM::Disassemble() { DECODE_OP; if (Get()->sf == Size64) { DECODE_RD(XReg); @@ -801,7 +801,7 @@ void A64_ADD_SUB_IMM::Disassembler() { } } -void A64_ADD_SUB_IMM::Assembler() { +void A64_ADD_SUB_IMM::Assemble() { SET_OPCODE(ADD_SUB_IMM); ENCODE_OP; ENCODE_RD; @@ -824,13 +824,13 @@ A64_MSR_MRS::A64_MSR_MRS(void *inst) : InstructionA64(&inst) { A64_MSR_MRS::A64_MSR_MRS(OP op, SystemRegister &systemRegister, RegisterA64 &rt) : op(op), system_reg( &systemRegister), rt(&rt) {} -void A64_MSR_MRS::Disassembler() { +void A64_MSR_MRS::Disassemble() { DECODE_OP; DECODE_RT(XReg); system_reg->value = static_cast(Get()->sysreg); } -void A64_MSR_MRS::Assembler() { +void A64_MSR_MRS::Assemble() { SET_OPCODE(MSR_MRS); ENCODE_OP; ENCODE_RT; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h index 8fb5958c..96d2ffa4 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/inst/inst_arm64.h @@ -217,9 +217,9 @@ namespace SandHook { Addr GetImmPCOffsetTarget() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -254,9 +254,9 @@ namespace SandHook { DEFINE_IS(MOV_WIDE) - void Assembler() override; + void Assemble() override; - void Disassembler() override; + void Disassemble() override; public: //can be 16/32/64/128 @@ -297,9 +297,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: @@ -328,9 +328,9 @@ namespace SandHook { Off GetImmPCOffset() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -354,9 +354,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: Condition condition; @@ -385,9 +385,9 @@ namespace SandHook { Off GetImmPCOffset() override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -419,9 +419,9 @@ namespace SandHook { void OnOffsetApply(Off offset) override; - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -445,9 +445,9 @@ namespace SandHook { DEFINE_IS_EXT(BR_BLR_RET, TEST_INST_OPCODE(BR_BLR_RET, 1) && TEST_INST_OPCODE(BR_BLR_RET, 2) && TEST_INST_OPCODE(BR_BLR_RET,3)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -496,9 +496,9 @@ namespace SandHook { DEFINE_IS(STR_IMM) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; }; @@ -512,9 +512,9 @@ namespace SandHook { DEFINE_IS(STR_UIMM) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; }; @@ -527,9 +527,9 @@ namespace SandHook { DEFINE_IS_EXT(MOV_REG, TEST_INST_OPCODE(MOV_REG, 1) && TEST_INST_OPCODE(MOV_REG, 2)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: RegisterA64* rd; @@ -547,9 +547,9 @@ namespace SandHook { DEFINE_IS_EXT(SUB_EXT_REG, TEST_INST_OPCODE(SUB_EXT_REG, 1) && TEST_INST_OPCODE(SUB_EXT_REG, 2)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: @@ -576,9 +576,9 @@ namespace SandHook { DEFINE_IS_EXT(EXCEPTION_GEN, TEST_INST_OPCODE(EXCEPTION_GEN, 1) && TEST_INST_OPCODE(EXCEPTION_GEN, 2)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -608,9 +608,9 @@ namespace SandHook { DEFINE_IS(LDR_IMM) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; }; @@ -623,9 +623,9 @@ namespace SandHook { DEFINE_IS(LDR_UIMM) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; }; DEFINE_INST_EXT(LDRSW_IMM, LDR_IMM) { @@ -638,9 +638,9 @@ namespace SandHook { DEFINE_IS_EXT(LDRSW_IMM, TEST_INST_FIELD(opcode, OPCODE_A64(LDRSW_IMM)) && TEST_INST_FIELD(size , Size32)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; }; @@ -655,9 +655,9 @@ namespace SandHook { DEFINE_IS_EXT(LDRSW_UIMM, TEST_INST_FIELD(opcode, OPCODE_A64(LDRSW_UIMM)) && TEST_INST_FIELD(size, Size32)) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; }; @@ -685,9 +685,9 @@ namespace SandHook { DEFINE_IS(STP_LDP) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -721,9 +721,9 @@ namespace SandHook { DEFINE_IS(ADD_SUB_IMM) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; @@ -747,9 +747,9 @@ namespace SandHook { DEFINE_IS(MSR_MRS) - void Disassembler() override; + void Disassemble() override; - void Assembler() override; + void Assemble() override; public: OP op; diff --git a/nativehook/src/main/cpp/asm/instruction.h b/nativehook/src/main/cpp/asm/instruction.h index 6425e531..eaea231a 100644 --- a/nativehook/src/main/cpp/asm/instruction.h +++ b/nativehook/src/main/cpp/asm/instruction.h @@ -85,11 +85,11 @@ namespace SandHook { label->AddBind(this); } - virtual void Disassembler() { + virtual void Disassemble() { backup_ = *this->pc_; } - virtual void Assembler() { + virtual void Assemble() { *this->pc_ = backup_; } diff --git a/nativehook/src/main/cpp/assembler/assembler.cpp b/nativehook/src/main/cpp/assembler/assembler.cpp index ee8432de..4f634b4a 100644 --- a/nativehook/src/main/cpp/assembler/assembler.cpp +++ b/nativehook/src/main/cpp/assembler/assembler.cpp @@ -46,7 +46,7 @@ void CodeContainer::commit() { (*unit)->Set(reinterpret_cast(pcNow)); } if ((*unit)->UnitType() == UnitInst) { - reinterpret_cast(*unit)->Assembler(); + reinterpret_cast(*unit)->Assemble(); } pcNow += (*unit)->Size(); } diff --git a/nativehook/src/main/cpp/sandhook_native.cpp b/nativehook/src/main/cpp/sandhook_native.cpp index 155f5980..9635ac8f 100644 --- a/nativehook/src/main/cpp/sandhook_native.cpp +++ b/nativehook/src/main/cpp/sandhook_native.cpp @@ -100,7 +100,7 @@ void breakCallback(REG regs[]) { class Visitor : public InstVisitor { bool Visit(Unit *unit, void *pc) override { BaseInst* instruction = reinterpret_cast(unit); - instruction->Assembler(); + instruction->Assemble(); return true; } }; From a1112fb6953360ec913775d9f888e2128b430959 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Wed, 3 Jul 2019 19:35:43 +0800 Subject: [PATCH 4/9] [Reconstitution]tweak code --- .../arm/arm32/assembler/assembler_arm32.cpp | 86 ++++++++--------- .../arm/arm32/assembler/assembler_arm32.h | 12 +-- .../cpp/archs/arm/arm32/hook/hook_arm32.cpp | 57 ++++++----- .../arm32/relocate/code_relocate_arm32.cpp | 58 +++++------ .../arm/arm32/relocate/code_relocate_arm32.h | 4 +- .../arm/arm64/assembler/assembler_arm64.cpp | 96 +++++++++---------- .../arm/arm64/assembler/assembler_arm64.h | 4 +- .../archs/arm/arm64/decoder/decoder_arm64.cpp | 4 +- .../cpp/archs/arm/arm64/hook/hook_arm64.cpp | 46 ++++----- .../arm64/relocate/code_relocate_arm64.cpp | 40 ++++---- .../arm/arm64/relocate/code_relocate_arm64.h | 4 +- .../src/main/cpp/assembler/assembler.cpp | 8 +- .../src/main/cpp/buffer/code_buffer.cpp | 44 ++++----- nativehook/src/main/cpp/buffer/code_buffer.h | 20 ++-- nativehook/src/main/cpp/decoder/decoder.cpp | 8 +- nativehook/src/main/cpp/hook/hook.cpp | 2 +- nativehook/src/main/cpp/includes/assembler.h | 10 +- .../src/main/cpp/includes/code_relocate.h | 24 ++--- nativehook/src/main/cpp/includes/decoder.h | 12 +-- nativehook/src/main/cpp/includes/exception.h | 7 +- nativehook/src/main/cpp/includes/hook.h | 11 +-- .../src/main/cpp/relocate/code_relocate.cpp | 12 +-- nativehook/src/main/cpp/utils/platform.cpp | 4 +- nativehook/src/main/cpp/utils/platform.h | 4 +- 24 files changed, 285 insertions(+), 292 deletions(-) diff --git a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp index 45f2f41a..e2914293 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp @@ -10,44 +10,44 @@ using namespace SandHook::RegistersA32; using namespace SandHook::AsmA32; AssemblerA32::AssemblerA32(CodeBuffer* codeBuffer) { - codeContainer.setCodeBuffer(codeBuffer); + code_container.setCodeBuffer(codeBuffer); } -void *AssemblerA32::getPC() { - return reinterpret_cast(codeContainer.curPc); +void *AssemblerA32::GetPC() { + return reinterpret_cast(code_container.curPc); } -void *AssemblerA32::getStartPC() { - return reinterpret_cast(codeContainer.startPc); +void *AssemblerA32::GetStartPC() { + return reinterpret_cast(code_container.startPc); } -void AssemblerA32::allocBufferFirst(U32 size) { - codeContainer.allocBufferFirst(size); +void AssemblerA32::AllocBufferFirst(U32 size) { + code_container.allocBufferFirst(size); } -void *AssemblerA32::finish() { - codeContainer.commit(); - return reinterpret_cast(codeContainer.startPc); +void *AssemblerA32::Finish() { + code_container.commit(); + return reinterpret_cast(code_container.startPc); } void AssemblerA32::Emit(U32 data32) { - Emit(reinterpret_cast*>(new Data32(data32))); + Emit(reinterpret_cast(new Data32(data32))); } void AssemblerA32::Emit(U16 data16) { - Emit(reinterpret_cast*>(new Data16(data16))); + Emit(reinterpret_cast(new Data16(data16))); } -void AssemblerA32::Emit(Unit *unit) { - codeContainer.append(unit); +void AssemblerA32::Emit(BaseUnit *unit) { + code_container.append(unit); } void AssemblerA32::Mov(RegisterA32 &rd, U16 imm16) { - Emit(reinterpret_cast*>(new INST_T32(MOV_MOVT_IMM)(INST_T32(MOV_MOVT_IMM)::MOV, rd, imm16))); + Emit(reinterpret_cast(new INST_T32(MOV_MOVT_IMM)(INST_T32(MOV_MOVT_IMM)::MOV, rd, imm16))); } void AssemblerA32::Movt(RegisterA32 &rd, U16 imm16) { - Emit(reinterpret_cast*>(new INST_T32(MOV_MOVT_IMM)(INST_T32(MOV_MOVT_IMM)::MOVT, rd, imm16))); + Emit(reinterpret_cast(new INST_T32(MOV_MOVT_IMM)(INST_T32(MOV_MOVT_IMM)::MOVT, rd, imm16))); } void AssemblerA32::Mov(RegisterA32 &rd, U32 imm32) { @@ -58,104 +58,104 @@ void AssemblerA32::Mov(RegisterA32 &rd, U32 imm32) { } void AssemblerA32::Ldr(RegisterA32 &rt, Off offset) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, offset))); + Emit(reinterpret_cast(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, offset))); } void AssemblerA32::Ldr(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, label))); + Emit(reinterpret_cast(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDR, INST_T32(LDR_LIT)::UnSign, rt, label))); } void AssemblerA32::Ldrb(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::UnSign,rt, label))); + Emit(reinterpret_cast(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::UnSign,rt, label))); } void AssemblerA32::Ldrh(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::UnSign,rt, label))); + Emit(reinterpret_cast(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::UnSign,rt, label))); } void AssemblerA32::Ldrsb(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::Sign,rt, label))); + Emit(reinterpret_cast(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRB, INST_T32(LDR_LIT)::Sign,rt, label))); } void AssemblerA32::Ldrsh(RegisterA32 &rt, Label *label) { - Emit(reinterpret_cast*>(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::Sign,rt, label))); + Emit(reinterpret_cast(new INST_T32(LDR_LIT)(INST_T32(LDR_LIT)::LDRH, INST_T32(LDR_LIT)::Sign,rt, label))); } void AssemblerA32::Ldr(RegisterA32 &rt, const MemOperand &operand) { if (operand.addr_mode == Offset && operand.offset >= 0) { - Emit(reinterpret_cast*>(new INST_T32(LDR_UIMM)(rt, *operand.rn, operand.addr_mode))); + Emit(reinterpret_cast(new INST_T32(LDR_UIMM)(rt, *operand.rn, operand.addr_mode))); } else { - Emit(reinterpret_cast*>(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDR, rt, operand))); + Emit(reinterpret_cast(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDR, rt, operand))); } } void AssemblerA32::Ldrb(RegisterA32 &rt, const MemOperand &operand) { - Emit(reinterpret_cast*>(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRB, rt, operand))); + Emit(reinterpret_cast(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRB, rt, operand))); } void AssemblerA32::Ldrh(RegisterA32 &rt, const MemOperand &operand) { - Emit(reinterpret_cast*>(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRH, rt, operand))); + Emit(reinterpret_cast(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRH, rt, operand))); } void AssemblerA32::Ldrsb(RegisterA32 &rt, const MemOperand &operand) { - Emit(reinterpret_cast*>(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRSB, rt, operand))); + Emit(reinterpret_cast(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRSB, rt, operand))); } void AssemblerA32::Ldrsh(RegisterA32 &rt, const MemOperand &operand) { - Emit(reinterpret_cast*>(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRSH, rt, operand))); + Emit(reinterpret_cast(new INST_T32(LDR_IMM)(INST_T32(LDR_IMM)::LDRSH, rt, operand))); } void AssemblerA32::B(Label *label) { - Emit(reinterpret_cast*>(new INST_T16(B)(label))); + Emit(reinterpret_cast(new INST_T16(B)(label))); } void AssemblerA32::Bl(Label *label) { - Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::arm, label))); + Emit(reinterpret_cast(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::arm, label))); } void AssemblerA32::Blx(Label *label) { - Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::thumb, label))); + Emit(reinterpret_cast(new INST_T32(B32)(INST_T32(B32)::BL, INST_T32(B32)::thumb, label))); } void AssemblerA32::Bx(Label *label) { - Emit(reinterpret_cast*>(new INST_T32(B32)(INST_T32(B32)::B, INST_T32(B32)::thumb, label))); + Emit(reinterpret_cast(new INST_T32(B32)(INST_T32(B32)::B, INST_T32(B32)::thumb, label))); } void AssemblerA32::Mov(RegisterA32 &rd, RegisterA32 &rm) { - Emit(reinterpret_cast*>(new INST_T16(MOV_REG)(rd, rm))); + Emit(reinterpret_cast(new INST_T16(MOV_REG)(rd, rm))); } void AssemblerA32::Bx(RegisterA32 &rm) { - Emit(reinterpret_cast*>(new INST_T16(BX_BLX)(INST_T16(BX_BLX)::BX, rm))); + Emit(reinterpret_cast(new INST_T16(BX_BLX)(INST_T16(BX_BLX)::BX, rm))); } void AssemblerA32::Blx(RegisterA32 &rm) { - Emit(reinterpret_cast*>(new INST_T16(BX_BLX)(INST_T16(BX_BLX)::BLX, rm))); + Emit(reinterpret_cast(new INST_T16(BX_BLX)(INST_T16(BX_BLX)::BLX, rm))); } void AssemblerA32::B(Condition condition, Label* label) { - Emit(reinterpret_cast*>(new INST_T16(B_COND)(condition, label))); + Emit(reinterpret_cast(new INST_T16(B_COND)(condition, label))); } void AssemblerA32::Add(RegisterA32 &rdn, U8 imm8) { - Emit(reinterpret_cast*>(new INST_T16(ADD_IMM_RDN)(&rdn, imm8))); + Emit(reinterpret_cast(new INST_T16(ADD_IMM_RDN)(&rdn, imm8))); } void AssemblerA32::Add(RegisterA32 &rd, RegisterA32 &rn, RegisterA32 &rm) { - Emit(reinterpret_cast*>(new INST_T16(ADD_REG)(&rd, &rn, &rm))); + Emit(reinterpret_cast(new INST_T16(ADD_REG)(&rd, &rn, &rm))); } void AssemblerA32::Cmp(RegisterA32 &rd, RegisterA32 &rn) { if (rd.Code() < 8 && rn.Code() < 8) { - Emit(reinterpret_cast*>(new INST_T16(CMP_REG)(rd, rn))); + Emit(reinterpret_cast(new INST_T16(CMP_REG)(rd, rn))); } else { - Emit(reinterpret_cast*>(new INST_T16(CMP_REG_EXT)(rd, rn))); + Emit(reinterpret_cast(new INST_T16(CMP_REG_EXT)(rd, rn))); } } void AssemblerA32::Pop(RegisterA32 &rt) { if (rt.Code() < 8 || rt == PC) { - Emit(reinterpret_cast*>(new INST_T16(POP)(RegisterList(rt)))); + Emit(reinterpret_cast(new INST_T16(POP)(RegisterList(rt)))); } else { throw ErrorCodeException("error pop inst"); } @@ -163,14 +163,14 @@ void AssemblerA32::Pop(RegisterA32 &rt) { void AssemblerA32::Push(RegisterA32 &rt) { if (rt.Code() < 8 || rt == PC) { - Emit(reinterpret_cast*>(new INST_T16(PUSH)(RegisterList(rt)))); + Emit(reinterpret_cast(new INST_T16(PUSH)(RegisterList(rt)))); } else { throw ErrorCodeException("error pop inst"); } } void AssemblerA32::Adr(RegisterA32 &rd, Label *label) { - Emit(reinterpret_cast*>(new INST_T16(ADR)(rd, label))); + Emit(reinterpret_cast(new INST_T16(ADR)(rd, label))); } void AssemblerA32::Nop16() { diff --git a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h index 2d8ede2d..715386ff 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h @@ -11,7 +11,7 @@ #include "inst_t32.h" #define ALIGN_FOR_LDR \ -if ((Addr) __ getPC() % 4 != 0) { \ +if ((Addr) __ GetPC() % 4 != 0) { \ __ Nop16(); \ } @@ -24,10 +24,10 @@ namespace SandHook { public: AssemblerA32(CodeBuffer* codeBuffer); - void allocBufferFirst(U32 size); - void* getStartPC(); - void* getPC(); - void* finish(); + void AllocBufferFirst(U32 size); + void* GetStartPC(); + void* GetPC(); + void* Finish(); void Emit(U32 data32); void Emit(U16 data16); @@ -78,7 +78,7 @@ namespace SandHook { void Nop16(); public: - CodeContainer codeContainer = CodeContainer(nullptr); + CodeContainer code_container = CodeContainer(nullptr); }; } } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp index 63a78c7a..e5dcd7f6 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp @@ -20,9 +20,9 @@ using namespace SandHook::RegistersA32; void *InlineHookArm32Android::Hook(void *origin, void *replace) { AutoLock lock(hookLock); - void* originCode; + void* origin_code; if (IsThumbCode((Addr) origin)) { - originCode = GetThumbCodeAddress(origin); + origin_code = GetThumbCodeAddress(origin); } else { LOGE("hook %d error!, only support thumb2 now!", origin); return nullptr; @@ -31,14 +31,14 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) { bool changeMode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) replace); void* backup = nullptr; - AssemblerA32 assemblerBackup(backupBuffer); + AssemblerA32 assembler_backup(backup_buffer); - StaticCodeBuffer inlineBuffer = StaticCodeBuffer(reinterpret_cast(originCode)); - AssemblerA32 assemblerInline(&inlineBuffer); - CodeContainer* codeContainerInline = &assemblerInline.codeContainer; + StaticCodeBuffer inline_buffer = StaticCodeBuffer(reinterpret_cast(origin_code)); + AssemblerA32 assembler_inline(&inline_buffer); + CodeContainer* code_container_inline = &assembler_inline.code_container; //build inline trampoline -#define __ assemblerInline. +#define __ assembler_inline. if (!changeMode) { Label *target_addr_label = new Label(); ALIGN_FOR_LDR @@ -53,20 +53,20 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) { #undef __ //build backup method - CodeRelocateA32 relocate = CodeRelocateA32(assemblerBackup); - backup = relocate.relocate(origin, codeContainerInline->size(), nullptr); -#define __ assemblerBackup. + CodeRelocateA32 relocate = CodeRelocateA32(assembler_backup); + backup = relocate.Relocate(origin, code_container_inline->size(), nullptr); +#define __ assembler_backup. Label* origin_addr_label = new Label(); ALIGN_FOR_LDR __ Ldr(PC, origin_addr_label); __ Emit(origin_addr_label); __ Emit((Addr) GetThumbPC( - reinterpret_cast(reinterpret_cast(originCode) + relocate.curOffset))); - __ finish(); + reinterpret_cast(reinterpret_cast(origin_code) + relocate.cur_offset))); + __ Finish(); #undef __ //commit inline trampoline - assemblerInline.finish(); + assembler_inline.Finish(); return GetThumbPC(backup); } @@ -77,43 +77,42 @@ IMPORT_LABEL(origin_addr_s, Addr) bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) { AutoLock lock(hookLock); - void* originCode; + void* origin_code; if (IsThumbCode((Addr) origin)) { - originCode = GetThumbCodeAddress(origin); + origin_code = GetThumbCodeAddress(origin); } else { LOGE("hook %d error!, only support thumb2 now!", origin); return false; } - bool changeMode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) callback); + bool change_mode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) callback); void* backup = nullptr; - AssemblerA32 assemblerBackup(backupBuffer); + AssemblerA32 assembler_backup(backup_buffer); - StaticCodeBuffer inlineBuffer = StaticCodeBuffer(reinterpret_cast(originCode)); - AssemblerA32 assemblerInline(&inlineBuffer); + StaticCodeBuffer inline_buffer = StaticCodeBuffer(reinterpret_cast(origin_code)); + AssemblerA32 assembler_inline(&inline_buffer); //build backup method - CodeRelocateA32 relocate = CodeRelocateA32(assemblerBackup); - backup = relocate.relocate(origin, changeMode ? (4 * 2 + 2) : (4 * 2), nullptr); -#define __ assemblerBackup. + CodeRelocateA32 relocate = CodeRelocateA32(assembler_backup); + backup = relocate.Relocate(origin, change_mode ? (4 * 2 + 2) : (4 * 2), nullptr); +#define __ assembler_backup. Label* origin_addr_label = new Label(); ALIGN_FOR_LDR __ Ldr(PC, origin_addr_label); __ Emit(origin_addr_label); - __ Emit((Addr) GetThumbPC( - reinterpret_cast(reinterpret_cast(originCode) + relocate.curOffset))); - __ finish(); + __ Emit((Addr) GetThumbPC(reinterpret_cast(reinterpret_cast(origin_code) + relocate.cur_offset))); + __ Finish(); #undef __ //build trampoline origin_addr_s = (Addr) GetThumbPC(backup); callback_addr_s = (Addr) callback; - void* trampoline = backupBuffer->copy((void*)BP_SHELLCODE, SHELLCODE_LEN(BP_SHELLCODE)); + void* trampoline = backup_buffer->copy((void*)BP_SHELLCODE, SHELLCODE_LEN(BP_SHELLCODE)); //build inline trampoline -#define __ assemblerInline. - if (!changeMode) { +#define __ assembler_inline. + if (!change_mode) { Label *target_addr_label = new Label(); ALIGN_FOR_LDR __ Ldr(PC, target_addr_label); @@ -123,7 +122,7 @@ bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) { __ Mov(IP, (Addr) trampoline); __ Bx(IP); } - __ finish(); + __ Finish(); #undef __ return true; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp index 70f889c9..2ee583b6 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp @@ -20,42 +20,42 @@ case ENUM_VALUE(InstCode##T, InstCode##T::X): \ relocate_##T##_##X(reinterpret_cast(instruction), toPc); \ break; -CodeRelocateA32::CodeRelocateA32(AssemblerA32 &assembler) : CodeRelocate(assembler.codeContainer) { +CodeRelocateA32::CodeRelocateA32(AssemblerA32 &assembler) : CodeRelocate(assembler.code_container) { this->assemblerA32 = &assembler; } bool CodeRelocateA32::Visit(BaseUnit *unit, void *pc) { - relocate(reinterpret_cast(unit), __ getPC()); - curOffset += unit->Size(); + Relocate(reinterpret_cast(unit), __ GetPC()); + cur_offset += unit->Size(); if (unit->RefCount() == 0) { delete unit; } return true; } -void* CodeRelocateA32::relocate(void *startPc, Addr len, void *toPc = nullptr) throw(ErrorCodeException) { - AutoLock autoLock(relocateLock); - startAddr = reinterpret_cast(startPc); - if (IsThumbCode(startAddr)) { - startAddr = reinterpret_cast(GetThumbCodeAddress(startPc)); +void* CodeRelocateA32::Relocate(void *startPc, Addr len, void *toPc = nullptr) throw(ErrorCodeException) { + AutoLock autoLock(relocate_lock); + start_addr = reinterpret_cast(startPc); + if (IsThumbCode(start_addr)) { + start_addr = reinterpret_cast(GetThumbCodeAddress(startPc)); } length = len; - curOffset = 0; - __ allocBufferFirst(static_cast(len * 8)); - void* curPc = __ getPC(); + cur_offset = 0; + __ AllocBufferFirst(static_cast(len * 8)); + void* curPc = __ GetPC(); if (toPc == nullptr) { - Disassembler::get()->Disassembler(startPc, len, *this, true); + Disassembler::Get()->Disassembler(startPc, len, *this, true); } else { //TODO } return curPc; } -void* CodeRelocateA32::relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { - void* curPc = __ getPC(); +void* CodeRelocateA32::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { + void* curPc = __ GetPC(); //insert later AddBind labels - __ Emit(getLaterBindLabel(curOffset)); + __ Emit(GetLaterBindLabel(cur_offset)); if (!instruction->PcRelate()) { __ Emit(instruction); @@ -94,8 +94,8 @@ void* CodeRelocateA32::relocate(BaseInst *instruction, void *toPc) throw(ErrorCo IMPL_RELOCATE(T16, B_COND) { - if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { - __ B(inst->condition, getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + if (InRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { + __ B(inst->condition, GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); return; } @@ -125,8 +125,8 @@ IMPL_RELOCATE(T16, B_COND) { IMPL_RELOCATE(T16, B) { - if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { - __ B(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + if (InRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { + __ B(GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); return; } @@ -149,8 +149,8 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { inst->Ref(); - if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { - inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + if (InRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { + inst->BindLabel(GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -175,9 +175,9 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { IMPL_RELOCATE(T16, LDR_LIT) { - if (inRelocateRange(CODE_OFFSET(inst), inst->rt->Wide())) { + if (InRelocateRange(CODE_OFFSET(inst), inst->rt->Wide())) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->BindLabel(GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -190,9 +190,9 @@ IMPL_RELOCATE(T16, LDR_LIT) { IMPL_RELOCATE(T16, ADR) { - if (inRelocateRange(CODE_OFFSET(inst), inst->rd->Wide())) { + if (InRelocateRange(CODE_OFFSET(inst), inst->rd->Wide())) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->BindLabel(GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -222,9 +222,9 @@ IMPL_RELOCATE(T16, ADD_REG_RDN) { IMPL_RELOCATE(T32, B32) { - if (inRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { + if (InRelocateRange(CODE_OFFSET(inst), sizeof(InstT16))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->BindLabel(GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -247,9 +247,9 @@ IMPL_RELOCATE(T32, B32) { IMPL_RELOCATE(T32, LDR_LIT) { - if (inRelocateRange(CODE_OFFSET(inst), sizeof(Addr))) { + if (InRelocateRange(CODE_OFFSET(inst), sizeof(Addr))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(CODE_OFFSET(inst) + curOffset)); + inst->BindLabel(GetLaterBindLabel(CODE_OFFSET(inst) + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h index 2a4cdcc0..5779978e 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.h @@ -22,9 +22,9 @@ namespace SandHook { public: CodeRelocateA32(AssemblerA32 &assembler); - void* relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) override; + void* Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) override; - void* relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; + void* Relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; bool Visit(BaseUnit *unit, void *pc) override; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp index bbb7ef96..764322fb 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp @@ -9,42 +9,42 @@ using namespace SandHook::RegistersA64; using namespace SandHook::AsmA64; AssemblerA64::AssemblerA64(CodeBuffer* codeBuffer) { - codeContainer.setCodeBuffer(codeBuffer); + code_container.setCodeBuffer(codeBuffer); } void *AssemblerA64::GetPC() { - return reinterpret_cast(codeContainer.curPc); + return reinterpret_cast(code_container.curPc); } void *AssemblerA64::GetStartPC() { - return reinterpret_cast(codeContainer.startPc); + return reinterpret_cast(code_container.startPc); } void AssemblerA64::AllocBufferFirst(U32 size) { - codeContainer.allocBufferFirst(size); + code_container.allocBufferFirst(size); } void *AssemblerA64::Finish() { - codeContainer.commit(); - return reinterpret_cast(codeContainer.startPc); + code_container.commit(); + return reinterpret_cast(code_container.startPc); } void AssemblerA64::Emit(U64 data64) { - Emit(reinterpret_cast*>(new Data64(data64))); + Emit(reinterpret_cast(new Data64(data64))); } void AssemblerA64::Emit(U32 data32) { - Emit(reinterpret_cast*>(new Data32(data32))); + Emit(reinterpret_cast(new Data32(data32))); } -void AssemblerA64::Emit(Unit *unit) { - codeContainer.append(unit); +void AssemblerA64::Emit(BaseUnit *unit) { + code_container.append(unit); } void AssemblerA64::MoveWide(RegisterA64 &rd, INST_A64(MOV_WIDE)::OP op, U64 imme, INST_A64(MOV_WIDE)::Shift shift) { - Emit(reinterpret_cast *>(new INST_A64(MOV_WIDE)(op, &rd, imme, shift))); + Emit(reinterpret_cast(new INST_A64(MOV_WIDE)(op, &rd, imme, shift))); } void AssemblerA64::Mov(WRegister &rd, U32 imme) { @@ -83,101 +83,101 @@ void AssemblerA64::Movn(RegisterA64 &rd, U64 imme, } void AssemblerA64::Br(XRegister &rn) { - Emit(reinterpret_cast *>(new INST_A64(BR_BLR_RET)(INST_A64(BR_BLR_RET)::BR, rn))); + Emit(reinterpret_cast(new INST_A64(BR_BLR_RET)(INST_A64(BR_BLR_RET)::BR, rn))); } void AssemblerA64::Blr(XRegister &rn) { - Emit(reinterpret_cast *>(new INST_A64(BR_BLR_RET)(INST_A64(BR_BLR_RET)::BLR, rn))); + Emit(reinterpret_cast(new INST_A64(BR_BLR_RET)(INST_A64(BR_BLR_RET)::BLR, rn))); } void AssemblerA64::B(Off offset) { - Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::B, offset))); + Emit(reinterpret_cast(new INST_A64(B_BL)(INST_A64(B_BL)::B, offset))); } void AssemblerA64::B(Label *label) { - Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::B, label))); + Emit(reinterpret_cast(new INST_A64(B_BL)(INST_A64(B_BL)::B, label))); } void AssemblerA64::Bl(Off offset) { - Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::BL, offset))); + Emit(reinterpret_cast(new INST_A64(B_BL)(INST_A64(B_BL)::BL, offset))); } void AssemblerA64::Bl(Label *label) { - Emit(reinterpret_cast *>(new INST_A64(B_BL)(INST_A64(B_BL)::BL, label))); + Emit(reinterpret_cast(new INST_A64(B_BL)(INST_A64(B_BL)::BL, label))); } void AssemblerA64::B(Condition condition, Off offset) { - Emit(reinterpret_cast *>(new INST_A64(B_COND)(condition, offset))); + Emit(reinterpret_cast(new INST_A64(B_COND)(condition, offset))); } void AssemblerA64::B(Condition condition, Label *label) { - Emit(reinterpret_cast *>(new INST_A64(B_COND)(condition, label))); + Emit(reinterpret_cast(new INST_A64(B_COND)(condition, label))); } void AssemblerA64::Tbz(RegisterA64 &rt, U32 bit, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBZ, rt, bit, label)))); + Emit((reinterpret_cast(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBZ, rt, bit, label)))); } void AssemblerA64::Tbz(RegisterA64 &rt, U32 bit, Off offset) { - Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBZ, rt, bit, offset)))); + Emit((reinterpret_cast(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBZ, rt, bit, offset)))); } void AssemblerA64::Tbnz(RegisterA64 &rt, U32 bit, Off offset) { - Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBNZ, rt, bit, offset)))); + Emit((reinterpret_cast(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBNZ, rt, bit, offset)))); } void AssemblerA64::Tbnz(RegisterA64 &rt, U32 bit, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBNZ, rt, bit, label)))); + Emit((reinterpret_cast(new INST_A64(TBZ_TBNZ)(INST_A64(TBZ_TBNZ)::TBNZ, rt, bit, label)))); } void AssemblerA64::Cbz(RegisterA64 &rt, Off offset) { - Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBZ, offset, rt)))); + Emit((reinterpret_cast(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBZ, offset, rt)))); } void AssemblerA64::Cbz(RegisterA64 &rt, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBZ, label, rt)))); + Emit((reinterpret_cast(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBZ, label, rt)))); } void AssemblerA64::Cbnz(RegisterA64 &rt, Off offset) { - Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBNZ, offset, rt)))); + Emit((reinterpret_cast(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBNZ, offset, rt)))); } void AssemblerA64::Cbnz(RegisterA64 &rt, Label *label) { - Emit((reinterpret_cast *>(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBNZ, label, rt)))); + Emit((reinterpret_cast(new INST_A64(CBZ_CBNZ)(INST_A64(CBZ_CBNZ)::CBNZ, label, rt)))); } void AssemblerA64::Str(RegisterA64 &rt, const MemOperand& memOperand) { if (memOperand.addr_mode_ == Offset) { - Emit(reinterpret_cast *>(new INST_A64(STR_UIMM)(rt, memOperand))); + Emit(reinterpret_cast(new INST_A64(STR_UIMM)(rt, memOperand))); } else { - Emit(reinterpret_cast *>(new INST_A64(STR_IMM)(rt, memOperand))); + Emit(reinterpret_cast(new INST_A64(STR_IMM)(rt, memOperand))); } } void AssemblerA64::Ldr(RegisterA64 &rt, const MemOperand &memOperand) { if (memOperand.addr_mode_ == Offset && memOperand.offset_ >= 0) { - Emit(reinterpret_cast *>(new INST_A64(LDR_UIMM)(rt, memOperand))); + Emit(reinterpret_cast(new INST_A64(LDR_UIMM)(rt, memOperand))); } else { - Emit(reinterpret_cast *>(new INST_A64(LDR_IMM)(rt, memOperand))); + Emit(reinterpret_cast(new INST_A64(LDR_IMM)(rt, memOperand))); } } void AssemblerA64::Ldr(RegisterA64 &rt, Label* label) { - Emit(reinterpret_cast *>(new INST_A64(LDR_LIT)(rt.isX() ? INST_A64(LDR_LIT)::LDR_X : INST_A64(LDR_LIT)::LDR_W, rt, label))); + Emit(reinterpret_cast(new INST_A64(LDR_LIT)(rt.isX() ? INST_A64(LDR_LIT)::LDR_X : INST_A64(LDR_LIT)::LDR_W, rt, label))); } void AssemblerA64::Ldrsw(RegisterA64 &rt, Label* label) { - Emit(reinterpret_cast *>(new INST_A64(LDR_LIT)(INST_A64(LDR_LIT)::LDR_SW, rt, label))); + Emit(reinterpret_cast(new INST_A64(LDR_LIT)(INST_A64(LDR_LIT)::LDR_SW, rt, label))); } void AssemblerA64::Ldrsw(XRegister &rt, const MemOperand& memOperand) { if (memOperand.addr_mode_ == Offset) { - Emit(reinterpret_cast *>(new INST_A64(LDRSW_UIMM)(rt, memOperand))); + Emit(reinterpret_cast(new INST_A64(LDRSW_UIMM)(rt, memOperand))); } else { - Emit(reinterpret_cast *>(new INST_A64(LDRSW_IMM)(rt, memOperand))); + Emit(reinterpret_cast(new INST_A64(LDRSW_IMM)(rt, memOperand))); } } @@ -208,55 +208,55 @@ void AssemblerA64::Cmp(RegisterA64 &rn, const Operand &operand) { } void AssemblerA64::Subs(RegisterA64 &rd, RegisterA64 &rn, const Operand &operand) { - Emit(reinterpret_cast *>(new INST_A64(SUB_EXT_REG)(rd, rn, operand, SetFlags))); + Emit(reinterpret_cast(new INST_A64(SUB_EXT_REG)(rd, rn, operand, SetFlags))); } void AssemblerA64::Stp(RegisterA64 &rt1, RegisterA64 &rt2, const MemOperand operand) { - Emit(reinterpret_cast *>(new INST_A64(STP_LDP)(INST_A64(STP_LDP)::STP, rt1, rt2, operand))); + Emit(reinterpret_cast(new INST_A64(STP_LDP)(INST_A64(STP_LDP)::STP, rt1, rt2, operand))); } void AssemblerA64::Ldp(RegisterA64 &rt1, RegisterA64 &rt2, const MemOperand operand) { - Emit(reinterpret_cast *>(new INST_A64(STP_LDP)(INST_A64(STP_LDP)::LDP, rt1, rt2, operand))); + Emit(reinterpret_cast(new INST_A64(STP_LDP)(INST_A64(STP_LDP)::LDP, rt1, rt2, operand))); } void AssemblerA64::Add(RegisterA64 &rd, const Operand &operand) { - Emit(reinterpret_cast *>(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::ADD, INST_A64(ADD_SUB_IMM)::UnSign, rd, operand))); + Emit(reinterpret_cast(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::ADD, INST_A64(ADD_SUB_IMM)::UnSign, rd, operand))); } void AssemblerA64::Adds(RegisterA64 &rd, const Operand &operand) { - Emit(reinterpret_cast *>(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::ADD, INST_A64(ADD_SUB_IMM)::Sign, rd, operand))); + Emit(reinterpret_cast(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::ADD, INST_A64(ADD_SUB_IMM)::Sign, rd, operand))); } void AssemblerA64::Sub(RegisterA64 &rd, const Operand &operand) { - Emit(reinterpret_cast *>(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::SUB, INST_A64(ADD_SUB_IMM)::UnSign, rd, operand))); + Emit(reinterpret_cast(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::SUB, INST_A64(ADD_SUB_IMM)::UnSign, rd, operand))); } void AssemblerA64::Subs(RegisterA64 &rd, const Operand &operand) { - Emit(reinterpret_cast *>(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::SUB, INST_A64(ADD_SUB_IMM)::Sign, rd, operand))); + Emit(reinterpret_cast(new INST_A64(ADD_SUB_IMM)(INST_A64(ADD_SUB_IMM)::SUB, INST_A64(ADD_SUB_IMM)::Sign, rd, operand))); } -void AssemblerA64::Mrs(SystemRegister &sysReg, RegisterA64 &rt) { - Emit(reinterpret_cast *>(new INST_A64(MSR_MRS)(INST_A64(MSR_MRS)::MRS, sysReg, rt))); +void AssemblerA64::Mrs(SystemRegister &sys_reg, RegisterA64 &rt) { + Emit(reinterpret_cast(new INST_A64(MSR_MRS)(INST_A64(MSR_MRS)::MRS, sys_reg, rt))); } void AssemblerA64::Msr(SystemRegister &sysReg, RegisterA64 &rt) { - Emit(reinterpret_cast *>(new INST_A64(MSR_MRS)(INST_A64(MSR_MRS)::MSR, sysReg, rt))); + Emit(reinterpret_cast(new INST_A64(MSR_MRS)(INST_A64(MSR_MRS)::MSR, sysReg, rt))); } void AssemblerA64::Mov(RegisterA64 &rd, RegisterA64& rt) { if (rd == SP || rt == SP) { Add(rd, Operand(&rt, 0)); } else { - Emit(reinterpret_cast *>(new INST_A64(MOV_REG)(rd, rt))); + Emit(reinterpret_cast(new INST_A64(MOV_REG)(rd, rt))); } } void AssemblerA64::Svc(U16 imm) { - Emit(reinterpret_cast *>(new INST_A64(SVC)(imm))); + Emit(reinterpret_cast(new INST_A64(SVC)(imm))); } void AssemblerA64::Hvc(U16 imm) { - Emit(reinterpret_cast *>(new INST_A64(EXCEPTION_GEN)(INST_A64(EXCEPTION_GEN)::XXC, EL2, imm))); + Emit(reinterpret_cast(new INST_A64(EXCEPTION_GEN)(INST_A64(EXCEPTION_GEN)::XXC, EL2, imm))); } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h index ccb8ef48..a9a4d62e 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h @@ -84,7 +84,7 @@ namespace SandHook { void Subs(RegisterA64& rd, const Operand& operand); void Msr(SystemRegister &sysReg, RegisterA64& rt); - void Mrs(SystemRegister &sysReg, RegisterA64& rt); + void Mrs(SystemRegister &sys_reg, RegisterA64& rt); void Mov(RegisterA64& rd, RegisterA64& rt); @@ -94,7 +94,7 @@ namespace SandHook { public: - CodeContainer codeContainer = CodeContainer(nullptr); + CodeContainer code_container = CodeContainer(nullptr); }; } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp index 53a2d888..e28a8547 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp @@ -19,9 +19,9 @@ Arm64Decoder* Arm64Decoder::instant = new Arm64Decoder(); void Arm64Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, bool onlyPcRelInst) { InstA64 *pc = reinterpret_cast(codeStart); - Addr endAddr = (Addr) codeStart + codeLen; + Addr end_addr = (Addr) codeStart + codeLen; Unit* unit = nullptr; - while((Addr) pc < endAddr) { + while((Addr) pc < end_addr) { // pc relate insts CASE(B_BL) CASE(B_COND) diff --git a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp index bb870ce2..73003bef 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp @@ -16,17 +16,17 @@ using namespace SandHook::Utils; #include "code_relocate_arm64.h" using namespace SandHook::RegistersA64; void *InlineHookArm64Android::Hook(void *origin, void *replace) { - AutoLock lock(hookLock); + AutoLock lock(hook_lock); void* backup = nullptr; - AssemblerA64 assemblerBackup(backupBuffer); + AssemblerA64 assembler_backup(backup_buffer); - StaticCodeBuffer inlineBuffer = StaticCodeBuffer(reinterpret_cast(origin)); - AssemblerA64 assemblerInline(&inlineBuffer); - CodeContainer* codeContainerInline = &assemblerInline.codeContainer; + StaticCodeBuffer inline_buffer = StaticCodeBuffer(reinterpret_cast(origin)); + AssemblerA64 assembler_inline(&inline_buffer); + CodeContainer* code_container_inline = &assembler_inline.code_container; //build inline trampoline -#define __ assemblerInline. +#define __ assembler_inline. Label* target_addr_label = new Label(); __ Ldr(IP1, target_addr_label); __ Br(IP1); @@ -35,37 +35,37 @@ void *InlineHookArm64Android::Hook(void *origin, void *replace) { #undef __ //build backup method - CodeRelocateA64 relocate = CodeRelocateA64(assemblerBackup); - backup = relocate.relocate(origin, codeContainerInline->size(), nullptr); -#define __ assemblerBackup. + CodeRelocateA64 relocate = CodeRelocateA64(assembler_backup); + backup = relocate.Relocate(origin, code_container_inline->size(), nullptr); +#define __ assembler_backup. Label* origin_addr_label = new Label(); __ Ldr(IP1, origin_addr_label); __ Br(IP1); __ Emit(origin_addr_label); - __ Emit((Addr) origin + codeContainerInline->size()); + __ Emit((Addr) origin + code_container_inline->size()); __ Finish(); #undef __ //commit inline trampoline - assemblerInline.Finish(); + assembler_inline.Finish(); return backup; } bool InlineHookArm64Android::BreakPoint(void *point, void (*callback)(REG regs[])) { - AutoLock lock(hookLock); + AutoLock lock(hook_lock); void* backup = nullptr; - AssemblerA64 assemblerBackup(backupBuffer); - AssemblerA64 assemblerTrampoline(backupBuffer); + AssemblerA64 assembler_backup(backup_buffer); + AssemblerA64 assembler_trampoline(backup_buffer); - StaticCodeBuffer inlineBuffer = StaticCodeBuffer(reinterpret_cast(point)); - AssemblerA64 assemblerInline(&inlineBuffer); + StaticCodeBuffer inline_buffer = StaticCodeBuffer(reinterpret_cast(point)); + AssemblerA64 assembler_inline(&inline_buffer); //build backup inst - CodeRelocateA64 relocate = CodeRelocateA64(assemblerBackup); - backup = relocate.relocate(point, 4 * 4, nullptr); -#define __ assemblerBackup. + CodeRelocateA64 relocate = CodeRelocateA64(assembler_backup); + backup = relocate.Relocate(point, 4 * 4, nullptr); +#define __ assembler_backup. Label* origin_addr_label = new Label(); __ Ldr(IP1, origin_addr_label); __ Br(IP1); @@ -76,7 +76,7 @@ bool InlineHookArm64Android::BreakPoint(void *point, void (*callback)(REG regs[] //build shell code -#define __ assemblerTrampoline. +#define __ assembler_trampoline. //backup NZCV __ Sub(SP, Operand(&SP, 0x20)); @@ -118,14 +118,14 @@ bool InlineHookArm64Android::BreakPoint(void *point, void (*callback)(REG regs[] #undef __ - void* secondTrampoline = assemblerTrampoline.GetStartPC(); + void* second_trampoline = assembler_trampoline.GetStartPC(); //build inline trampoline -#define __ assemblerInline. +#define __ assembler_inline. Label* target_addr_label = new Label(); __ Ldr(IP1, target_addr_label); __ Br(IP1); __ Emit(target_addr_label); - __ Emit((Addr) secondTrampoline); + __ Emit((Addr) second_trampoline); __ Finish(); #undef __ diff --git a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp index 8519a1c7..b3365411 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp @@ -20,39 +20,39 @@ case ENUM_VALUE(InstCodeA64, InstCodeA64::X): \ relocate_##X(reinterpret_cast(instruction), toPc); \ break; -CodeRelocateA64::CodeRelocateA64(AssemblerA64 &assembler) : CodeRelocate(assembler.codeContainer) { +CodeRelocateA64::CodeRelocateA64(AssemblerA64 &assembler) : CodeRelocate(assembler.code_container) { assemblerA64 = &assembler; } bool CodeRelocateA64::Visit(Unit *unit, void *pc) { - relocate(reinterpret_cast(unit), __ GetPC()); - curOffset += unit->Size(); + Relocate(reinterpret_cast(unit), __ GetPC()); + cur_offset += unit->Size(); if (unit->RefCount() == 0) { delete unit; } return true; } -void* CodeRelocateA64::relocate(void *startPc, Addr len, void *toPc = nullptr) throw(ErrorCodeException) { - AutoLock autoLock(relocateLock); - startAddr = reinterpret_cast(startPc); +void* CodeRelocateA64::Relocate(void *startPc, Addr len, void *toPc = nullptr) throw(ErrorCodeException) { + AutoLock autoLock(relocate_lock); + start_addr = reinterpret_cast(startPc); length = len; - curOffset = 0; + cur_offset = 0; __ AllocBufferFirst(static_cast(len * 8)); void* curPc = __ GetPC(); if (toPc == nullptr) { - Disassembler::get()->Disassembler(startPc, len, *this, true); + Disassembler::Get()->Disassembler(startPc, len, *this, true); } else { //TODO } return curPc; } -void* CodeRelocateA64::relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { +void* CodeRelocateA64::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { void* curPc = __ GetPC(); //insert later AddBind labels - __ Emit(getLaterBindLabel(curOffset)); + __ Emit(GetLaterBindLabel(cur_offset)); if (!instruction->PcRelate()) { __ Emit(instruction); @@ -75,9 +75,9 @@ void* CodeRelocateA64::relocate(BaseInst *instruction, void *toPc) throw(ErrorCo IMPL_RELOCATE(B_BL) { - if (inRelocateRange(inst->offset, sizeof(InstA64))) { + if (InRelocateRange(inst->offset, sizeof(InstA64))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + inst->BindLabel(GetLaterBindLabel(inst->offset + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -97,9 +97,9 @@ IMPL_RELOCATE(B_BL) { IMPL_RELOCATE(B_COND) { - if (inRelocateRange(inst->offset, sizeof(InstA64))) { + if (InRelocateRange(inst->offset, sizeof(InstA64))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + inst->BindLabel(GetLaterBindLabel(inst->offset + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -121,9 +121,9 @@ IMPL_RELOCATE(B_COND) { IMPL_RELOCATE(TBZ_TBNZ) { - if (inRelocateRange(inst->offset, sizeof(InstA64))) { + if (InRelocateRange(inst->offset, sizeof(InstA64))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + inst->BindLabel(GetLaterBindLabel(inst->offset + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -149,9 +149,9 @@ IMPL_RELOCATE(TBZ_TBNZ) { IMPL_RELOCATE(CBZ_CBNZ) { - if (inRelocateRange(inst->offset, sizeof(InstA64))) { + if (InRelocateRange(inst->offset, sizeof(InstA64))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + inst->BindLabel(GetLaterBindLabel(inst->offset + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } @@ -181,9 +181,9 @@ IMPL_RELOCATE(LDR_LIT) { XRegister* rtX = XReg(inst->rt->Code()); WRegister* rtW = WReg(inst->rt->Code()); - if (inRelocateRange(inst->offset, sizeof(Addr))) { + if (InRelocateRange(inst->offset, sizeof(Addr))) { inst->Ref(); - inst->BindLabel(getLaterBindLabel(inst->offset + curOffset)); + inst->BindLabel(GetLaterBindLabel(inst->offset + cur_offset)); __ Emit(reinterpret_cast(inst)); return; } diff --git a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h index d553dfd8..57a5602d 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h @@ -22,9 +22,9 @@ namespace SandHook { public: CodeRelocateA64(AssemblerA64 &assembler); - void* relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) override; + void* Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) override; - void* relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; + void* Relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; bool Visit(Unit *unit, void *pc) override; diff --git a/nativehook/src/main/cpp/assembler/assembler.cpp b/nativehook/src/main/cpp/assembler/assembler.cpp index 4f634b4a..c93d8e16 100644 --- a/nativehook/src/main/cpp/assembler/assembler.cpp +++ b/nativehook/src/main/cpp/assembler/assembler.cpp @@ -31,9 +31,9 @@ void CodeContainer::commit() { void* bufferStart; if (startPc > 0) { bufferStart = reinterpret_cast(startPc); - codeBuffer->resetLastBufferSize(bufferSize); + codeBuffer->ResetLastBufferSize(bufferSize); } else { - bufferStart = codeBuffer->getBuffer(bufferSize); + bufferStart = codeBuffer->GetBuffer(bufferSize); } Addr pcNow = reinterpret_cast(bufferStart); @@ -58,7 +58,7 @@ void CodeContainer::commit() { } //flush I cache - flushCache(reinterpret_cast(bufferStart), pcNow - reinterpret_cast(bufferStart)); + FlushCache(reinterpret_cast(bufferStart), pcNow - reinterpret_cast(bufferStart)); //Set pc startPc = reinterpret_cast(bufferStart); @@ -67,7 +67,7 @@ void CodeContainer::commit() { } void CodeContainer::allocBufferFirst(U32 size) { - startPc = reinterpret_cast(codeBuffer->getBuffer(size)); + startPc = reinterpret_cast(codeBuffer->GetBuffer(size)); curPc = startPc; } diff --git a/nativehook/src/main/cpp/buffer/code_buffer.cpp b/nativehook/src/main/cpp/buffer/code_buffer.cpp index 78343a83..fabe4704 100644 --- a/nativehook/src/main/cpp/buffer/code_buffer.cpp +++ b/nativehook/src/main/cpp/buffer/code_buffer.cpp @@ -11,31 +11,31 @@ using namespace SandHook::Assembler; using namespace SandHook::Utils; -void *AndroidCodeBuffer::getBuffer(U32 size) { - AutoLock autoLock(allocSpaceLock); +void *AndroidCodeBuffer::GetBuffer(U32 size) { + AutoLock autoLock(alloc_space_lock); void* mmapRes; Addr exeSpace = 0; - if (executeSpaceList.size() == 0) { + if (execute_space_list.size() == 0) { goto label_alloc_new_space; - } else if (executePageOffset + size + 4> currentExecutePageSize) { + } else if (execute_page_offset + size + 4> current_execute_page_size) { goto label_alloc_new_space; } else { - exeSpace = reinterpret_cast(executeSpaceList.back()); + exeSpace = reinterpret_cast(execute_space_list.back()); //4 字节对齐 - Addr retSpace = RoundUp(exeSpace + executePageOffset, 4); - executePageOffset = retSpace + size - exeSpace; + Addr retSpace = RoundUp(exeSpace + execute_page_offset, 4); + execute_page_offset = retSpace + size - exeSpace; return reinterpret_cast(retSpace); } label_alloc_new_space: - currentExecutePageSize = static_cast(FIT(size, P_SIZE)); - mmapRes = mmap(NULL, currentExecutePageSize, PROT_READ | PROT_WRITE | PROT_EXEC, + current_execute_page_size = static_cast(FIT(size, P_SIZE)); + mmapRes = mmap(NULL, current_execute_page_size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); if (mmapRes == MAP_FAILED) { return 0; } - memset(mmapRes, 0, currentExecutePageSize); - executeSpaceList.push_back(mmapRes); - executePageOffset = size; + memset(mmapRes, 0, current_execute_page_size); + execute_space_list.push_back(mmapRes); + execute_page_offset = size; return mmapRes; } @@ -43,24 +43,24 @@ AndroidCodeBuffer::AndroidCodeBuffer() {} StaticCodeBuffer::StaticCodeBuffer(Addr pc) : pc(pc) {} -void *StaticCodeBuffer::getBuffer(U32 bufferSize) { - if (!memUnprotect(pc, bufferSize)) { - LOGE("error memUnprotect!"); +void *StaticCodeBuffer::GetBuffer(U32 bufferSize) { + if (!MemUnprotect(pc, bufferSize)) { + LOGE("error MemUnprotect!"); } return reinterpret_cast(pc); } -void AndroidRellocBufferUnsafe::resetLastBufferSize(U32 size) { - if (executePageOffset + (size - lastAllocSize) <= currentExecutePageSize) { - executePageOffset += size - lastAllocSize; - lastAllocSize = size; +void AndroidReSizableBufferUnsafe::ResetLastBufferSize(U32 size) { + if (execute_page_offset + (size - last_alloc_size) <= current_execute_page_size) { + execute_page_offset += size - last_alloc_size; + last_alloc_size = size; } } -void *AndroidRellocBufferUnsafe::getBuffer(U32 bufferSize) { - void* res = AndroidCodeBuffer::getBuffer(bufferSize); +void *AndroidReSizableBufferUnsafe::GetBuffer(U32 bufferSize) { + void* res = AndroidCodeBuffer::GetBuffer(bufferSize); if (res) { - lastAllocSize = bufferSize; + last_alloc_size = bufferSize; } return res; } diff --git a/nativehook/src/main/cpp/buffer/code_buffer.h b/nativehook/src/main/cpp/buffer/code_buffer.h index 0cc1e2b4..2830bd53 100644 --- a/nativehook/src/main/cpp/buffer/code_buffer.h +++ b/nativehook/src/main/cpp/buffer/code_buffer.h @@ -14,25 +14,25 @@ namespace SandHook { AndroidCodeBuffer(); - void *getBuffer(U32 bufferSize) override; + void *GetBuffer(U32 bufferSize) override; protected: - std::list executeSpaceList = std::list(); - std::mutex allocSpaceLock; - Addr executePageOffset = 0; - U32 currentExecutePageSize = 0; + std::list execute_space_list = std::list(); + std::mutex alloc_space_lock; + Addr execute_page_offset = 0; + U32 current_execute_page_size = 0; }; //thread unsafe - class AndroidRellocBufferUnsafe : public AndroidCodeBuffer { + class AndroidReSizableBufferUnsafe : public AndroidCodeBuffer { public: public: - void resetLastBufferSize(U32 size) override; + void ResetLastBufferSize(U32 size) override; - void *getBuffer(U32 bufferSize) override; + void *GetBuffer(U32 bufferSize) override; private: - U32 lastAllocSize; + U32 last_alloc_size; }; class StaticCodeBuffer : public CodeBuffer { @@ -40,7 +40,7 @@ namespace SandHook { StaticCodeBuffer(Addr pc); - void *getBuffer(U32 bufferSize) override; + void *GetBuffer(U32 bufferSize) override; private: Addr pc; diff --git a/nativehook/src/main/cpp/decoder/decoder.cpp b/nativehook/src/main/cpp/decoder/decoder.cpp index 4f329fe4..fd9948fe 100644 --- a/nativehook/src/main/cpp/decoder/decoder.cpp +++ b/nativehook/src/main/cpp/decoder/decoder.cpp @@ -20,18 +20,18 @@ bool DefaultVisitor::Visit(Unit *unit, void *pc) { DefaultVisitor::DefaultVisitor(bool (*visitor)(Unit *, void *)) : visitor(visitor) {} //do not support now -InstDecoder* Disassembler::get(Arch arch) { +InstDecoder* Disassembler::Get(Arch arch) { switch (arch) { case arm32: - return get(); + return Get(); case arm64: - return get(); + return Get(); default: return nullptr; } } -InstDecoder *Disassembler::get() { +InstDecoder *Disassembler::Get() { #if defined(__arm__) return Arm32Decoder::instant; #elif defined(__aarch64__) diff --git a/nativehook/src/main/cpp/hook/hook.cpp b/nativehook/src/main/cpp/hook/hook.cpp index eb181c77..9b947cdc 100644 --- a/nativehook/src/main/cpp/hook/hook.cpp +++ b/nativehook/src/main/cpp/hook/hook.cpp @@ -12,7 +12,7 @@ using namespace SandHook::Hook; -CodeBuffer* InlineHook::backupBuffer = new AndroidCodeBuffer(); +CodeBuffer* InlineHook::backup_buffer = new AndroidCodeBuffer(); #if defined(__arm__) InlineHook* InlineHook::instance = new InlineHookArm32Android(); diff --git a/nativehook/src/main/cpp/includes/assembler.h b/nativehook/src/main/cpp/includes/assembler.h index 43eb97a6..021fbb47 100644 --- a/nativehook/src/main/cpp/includes/assembler.h +++ b/nativehook/src/main/cpp/includes/assembler.h @@ -21,14 +21,14 @@ namespace SandHook { class CodeBuffer { public: - virtual void* getBuffer(U32 size) = 0; - virtual void resetLastBufferSize(U32 size){}; + virtual void* GetBuffer(U32 size) = 0; + virtual void ResetLastBufferSize(U32 size){}; virtual void* copy(void* start, U32 size) { - void* bufferStart = getBuffer(size); + void* bufferStart = GetBuffer(size); if (bufferStart == nullptr) return nullptr; memcpy(bufferStart, start, size); - flushCache((Addr)bufferStart, size); + FlushCache((Addr) bufferStart, size); return bufferStart; }; }; @@ -40,7 +40,7 @@ namespace SandHook { void setCodeBuffer(CodeBuffer *codeBuffer); - //allow code relocate to Get new pc first + //allow code Relocate to Get new pc first void allocBufferFirst(U32 size); void append(Unit* unit); void commit(); diff --git a/nativehook/src/main/cpp/includes/code_relocate.h b/nativehook/src/main/cpp/includes/code_relocate.h index 0bd84a18..52c6850e 100644 --- a/nativehook/src/main/cpp/includes/code_relocate.h +++ b/nativehook/src/main/cpp/includes/code_relocate.h @@ -20,27 +20,27 @@ namespace SandHook { class CodeRelocate : public InstVisitor { public: - CodeRelocate(CodeContainer &codeContainer) : codeContainer(&codeContainer) {} + CodeRelocate(CodeContainer &codeContainer) : code_container(&codeContainer) {} - virtual void* relocate(BaseInst *instruction, void* toPc) throw(ErrorCodeException) = 0; - virtual void* relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) = 0; + virtual void* Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) = 0; + virtual void* Relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) = 0; - bool inRelocateRange(Off targetOffset, Addr targetLen); + bool InRelocateRange(Off targetOffset, Addr targetLen); - Label* getLaterBindLabel(Addr offset); + Label* GetLaterBindLabel(Addr offset); virtual ~CodeRelocate() { - delete relocateLock; - delete laterBindlabels; + delete relocate_lock; + delete later_bind_labels; } public: - CodeContainer* codeContainer; - std::mutex* relocateLock = new std::mutex(); - std::map* laterBindlabels = new std::map(); - Addr startAddr = 0; + CodeContainer* code_container; + std::mutex* relocate_lock = new std::mutex(); + std::map* later_bind_labels = new std::map(); + Addr start_addr = 0; Addr length = 0; - Addr curOffset = 0; + Addr cur_offset = 0; }; } diff --git a/nativehook/src/main/cpp/includes/decoder.h b/nativehook/src/main/cpp/includes/decoder.h index 3b88a6af..db978cfe 100644 --- a/nativehook/src/main/cpp/includes/decoder.h +++ b/nativehook/src/main/cpp/includes/decoder.h @@ -32,19 +32,19 @@ namespace SandHook { class InstDecoder { public: - virtual void Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, - bool onlyPcRelInst = false) = 0; - inline void Disassembler(void* codeStart, Addr codeLen, bool (*visitor)(Unit*, void*), bool onlyPcRelInst = false) { + virtual void Disassembler(void *code_start, Addr code_len, InstVisitor &visitor, + bool only_pc_rel = false) = 0; + inline void Disassembler(void* codeStart, Addr codeLen, bool (*visitor)(Unit*, void*), bool only_pc_rel = false) { InstVisitor vis = DefaultVisitor(visitor); - Disassembler(codeStart, codeLen, vis, onlyPcRelInst); + Disassembler(codeStart, codeLen, vis, only_pc_rel); }; }; class Disassembler { public: - static InstDecoder* get(Arch arch); - static InstDecoder* get(); + static InstDecoder* Get(Arch arch); + static InstDecoder* Get(); }; } } diff --git a/nativehook/src/main/cpp/includes/exception.h b/nativehook/src/main/cpp/includes/exception.h index 395514b4..29d7b04a 100644 --- a/nativehook/src/main/cpp/includes/exception.h +++ b/nativehook/src/main/cpp/includes/exception.h @@ -1,11 +1,10 @@ // // Created by swift on 2019/5/10. // +#pragma once #include "exception" -#ifndef SANDHOOK_NH_EXCEPTION_H -#define SANDHOOK_NH_EXCEPTION_H namespace SandHook { namespace Asm { @@ -24,6 +23,4 @@ namespace SandHook { }; } -} - -#endif //SANDHOOK_NH_EXCEPTION_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/includes/hook.h b/nativehook/src/main/cpp/includes/hook.h index 8a14ae10..716e4014 100644 --- a/nativehook/src/main/cpp/includes/hook.h +++ b/nativehook/src/main/cpp/includes/hook.h @@ -2,8 +2,7 @@ // Created by swift on 2019/5/14. // -#ifndef SANDHOOK_NH_HOOK_H -#define SANDHOOK_NH_HOOK_H +#pragma once #include @@ -25,13 +24,11 @@ namespace SandHook { return false; }; protected: - static CodeBuffer* backupBuffer; - std::mutex hookLock; + static CodeBuffer* backup_buffer; + std::mutex hook_lock; public: static InlineHook* instance; }; } -} - -#endif //SANDHOOK_NH_HOOK_H +} \ No newline at end of file diff --git a/nativehook/src/main/cpp/relocate/code_relocate.cpp b/nativehook/src/main/cpp/relocate/code_relocate.cpp index ee7da626..4d2a2b80 100644 --- a/nativehook/src/main/cpp/relocate/code_relocate.cpp +++ b/nativehook/src/main/cpp/relocate/code_relocate.cpp @@ -7,21 +7,21 @@ using namespace SandHook::Asm; //in range of Copy -bool CodeRelocate::inRelocateRange(Off targetOffset, Addr targetLen) { - Off startP = curOffset + targetOffset; +bool CodeRelocate::InRelocateRange(Off targetOffset, Addr targetLen) { + Off startP = cur_offset + targetOffset; Off endP = startP + targetLen; return startP >= 0 && endP <= length; } -Label *CodeRelocate::getLaterBindLabel(Addr offset) { +Label *CodeRelocate::GetLaterBindLabel(Addr offset) { Label* label_per_unit = nullptr; - std::map::iterator it = laterBindlabels->find(offset); - if (it != laterBindlabels->end()) { + std::map::iterator it = later_bind_labels->find(offset); + if (it != later_bind_labels->end()) { label_per_unit = it->second; } if (label_per_unit == nullptr) { label_per_unit = new Label(); - laterBindlabels->insert(std::map::value_type(offset, label_per_unit)); + later_bind_labels->insert(std::map::value_type(offset, label_per_unit)); } return label_per_unit; } \ No newline at end of file diff --git a/nativehook/src/main/cpp/utils/platform.cpp b/nativehook/src/main/cpp/utils/platform.cpp index 1338b6df..38ece6ba 100644 --- a/nativehook/src/main/cpp/utils/platform.cpp +++ b/nativehook/src/main/cpp/utils/platform.cpp @@ -6,7 +6,7 @@ #include #include "platform.h" -bool flushCache(Addr addr, Off len) { +bool FlushCache(Addr addr, Off len) { #if defined(__arm__) int i = cacheflush(addr, addr + len, 0); if (i == -1) { @@ -21,7 +21,7 @@ bool flushCache(Addr addr, Off len) { } -extern "C" bool memUnprotect(Addr addr, Addr len) { +extern "C" bool MemUnprotect(Addr addr, Addr len) { long pagesize = P_SIZE; unsigned alignment = (unsigned)((unsigned long long)addr % pagesize); int i = mprotect((void *) (addr - alignment), (size_t) (alignment + len), diff --git a/nativehook/src/main/cpp/utils/platform.h b/nativehook/src/main/cpp/utils/platform.h index 0df0d725..53e951c2 100644 --- a/nativehook/src/main/cpp/utils/platform.h +++ b/nativehook/src/main/cpp/utils/platform.h @@ -6,6 +6,6 @@ #include "base.h" -extern "C" bool flushCache(Addr addr, Off len); +extern "C" bool FlushCache(Addr addr, Off len); -extern "C" bool memUnprotect(Addr addr, Addr len); \ No newline at end of file +extern "C" bool MemUnprotect(Addr addr, Addr len); \ No newline at end of file From 76661ced0098201fb66d92453c43f47b7596bfc5 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Mon, 8 Jul 2019 15:38:54 +0800 Subject: [PATCH 5/9] [Reconstitution]fix hook 32bit --- nativehook/build.gradle | 2 +- .../cpp/archs/arm/arm32/decoder/decoder_arm32.cpp | 15 ++++++++------- .../main/cpp/archs/arm/arm32/hook/hook_arm32.cpp | 3 +-- .../main/cpp/archs/arm/arm32/inst/inst_t16.cpp | 2 +- .../cpp/archs/arm/arm64/decoder/decoder_arm64.cpp | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/nativehook/build.gradle b/nativehook/build.gradle index 839a63ff..3f83f710 100644 --- a/nativehook/build.gradle +++ b/nativehook/build.gradle @@ -17,7 +17,7 @@ android { cmake { arguments '-DBUILD_TESTING=OFF' cppFlags "-frtti -fexceptions -Wpointer-arith" - abiFilters 'armeabi-v7a', 'arm64-v8a' + abiFilters 'armeabi-v7a' } } } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp index ff83f1e2..2eca81eb 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp @@ -11,7 +11,7 @@ using namespace SandHook::AsmA32; #define CASE(T, X) \ if (IS_OPCODE_##T(*reinterpret_cast(pc), X)) { \ -unit = reinterpret_cast *>(new INST_##T(X)(pc)); \ +unit = reinterpret_cast(new INST_##T(X)(pc)); \ goto label_matched; \ } @@ -30,9 +30,9 @@ void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi } void *pc = codeStart; Addr endAddr = (Addr) codeStart + codeLen; - Unit* unit = nullptr; + BaseUnit *unit = nullptr; while((Addr) pc < endAddr) { - bool thumb32 = IsThumb32(*reinterpret_cast(pc)); + bool thumb32 = IsThumb32(*reinterpret_cast(pc)); if (thumb && thumb32) { CASE_T32(SUB_IMM) CASE_T32(B32) @@ -43,7 +43,7 @@ void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi CASE_T32(MOV_MOVT_IMM) } if (unit == nullptr) { - unit = reinterpret_cast *>(new INST_T32(UNKNOW)(pc)); + unit = reinterpret_cast(new INST_T32(UNKNOW)(pc)); } } else if (thumb) { CASE_T16(B) @@ -63,18 +63,19 @@ void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi CASE_T16(PUSH) } if (unit == nullptr) { - unit = reinterpret_cast *>(new INST_T16(UNKNOW)(pc)); + unit = reinterpret_cast(new INST_T16(UNKNOW)(pc)); } } else { //TODO arm32 support - unit = reinterpret_cast *>(new INST_T32(UNKNOW)(pc)); + unit = reinterpret_cast(new INST_T32(UNKNOW)(pc)); } label_matched: + reinterpret_cast(unit)->Disassemble(); if (!visitor.Visit(unit, pc)) { break; } - pc = reinterpret_cast((Addr)pc + unit->Size()); + pc = reinterpret_cast((Addr)pc + unit->Size()); unit = nullptr; } } diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp index e5dcd7f6..55c8bb6f 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp @@ -60,8 +60,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) { ALIGN_FOR_LDR __ Ldr(PC, origin_addr_label); __ Emit(origin_addr_label); - __ Emit((Addr) GetThumbPC( - reinterpret_cast(reinterpret_cast(origin_code) + relocate.cur_offset))); + __ Emit((Addr) GetThumbPC(reinterpret_cast(reinterpret_cast(origin_code) + relocate.cur_offset))); __ Finish(); #undef __ diff --git a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp index ec366f6d..5238656c 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/inst/inst_t16.cpp @@ -17,7 +17,7 @@ using namespace SandHook::RegistersA32; //Unknow -T16_UNKNOW::T16_UNKNOW(void *inst) : InstructionT16(&inst) { +T16_UNKNOW::T16_UNKNOW(void *inst) : InstructionT16(inst) { } //B diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp index e28a8547..6a3947be 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp @@ -20,7 +20,7 @@ void Arm64Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visi bool onlyPcRelInst) { InstA64 *pc = reinterpret_cast(codeStart); Addr end_addr = (Addr) codeStart + codeLen; - Unit* unit = nullptr; + BaseUnit* unit = nullptr; while((Addr) pc < end_addr) { // pc relate insts CASE(B_BL) From 8eac60f21052e688721f1850b14796288f71f2d3 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Mon, 8 Jul 2019 15:42:35 +0800 Subject: [PATCH 6/9] [Reconstitution]revert gradle --- doc/doc.md | 2 +- nativehook/build.gradle | 2 +- xposedcompat_new/CMakeLists.txt | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/doc/doc.md b/doc/doc.md index c50fcd08..31a5875d 100644 --- a/doc/doc.md +++ b/doc/doc.md @@ -1330,7 +1330,7 @@ JitCompile->CommitCode->CommitCodeInternal - 并且在跳转的时候要注意入口地址符合要求 ```cpp -bool isThumbCode(Size codeAddr) { +bool IsThumbCode(Size codeAddr) { return (codeAddr & 0x1) == 0x1; } ``` diff --git a/nativehook/build.gradle b/nativehook/build.gradle index 3f83f710..839a63ff 100644 --- a/nativehook/build.gradle +++ b/nativehook/build.gradle @@ -17,7 +17,7 @@ android { cmake { arguments '-DBUILD_TESTING=OFF' cppFlags "-frtti -fexceptions -Wpointer-arith" - abiFilters 'armeabi-v7a' + abiFilters 'armeabi-v7a', 'arm64-v8a' } } } diff --git a/xposedcompat_new/CMakeLists.txt b/xposedcompat_new/CMakeLists.txt index 8c574eb3..ec8a06e3 100644 --- a/xposedcompat_new/CMakeLists.txt +++ b/xposedcompat_new/CMakeLists.txt @@ -34,7 +34,6 @@ add_library( # Sets the name of the library. src/main/cpp/art_jni_trampoline.cpp # Provides a relative path to your source file(s). src/main/cpp/libffi/closures.c - src/main/cpp/libffi/closures.c src/main/cpp/libffi/debug.c src/main/cpp/libffi/dlmalloc.c src/main/cpp/libffi/java_raw_api.c From a294625b48a4543afa5a1624cd08ee5a5f6df52e Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Wed, 10 Jul 2019 11:51:49 +0800 Subject: [PATCH 7/9] [Reconstitution]typo --- .../arm/arm32/assembler/assembler_arm32.cpp | 14 +- .../arm/arm32/assembler/assembler_arm32.h | 2 +- .../archs/arm/arm32/decoder/decoder_arm32.cpp | 4 +- .../archs/arm/arm32/decoder/decoder_arm32.h | 4 +- .../cpp/archs/arm/arm32/hook/hook_arm32.cpp | 8 +- .../arm32/relocate/code_relocate_arm32.cpp | 40 +++--- .../arm/arm64/assembler/assembler_arm64.cpp | 14 +- .../arm/arm64/assembler/assembler_arm64.h | 2 +- .../archs/arm/arm64/decoder/decoder_arm64.cpp | 4 +- .../archs/arm/arm64/decoder/decoder_arm64.h | 4 +- .../cpp/archs/arm/arm64/hook/hook_arm64.cpp | 4 +- .../arm64/relocate/code_relocate_arm64.cpp | 40 +++--- .../arm/arm64/relocate/code_relocate_arm64.h | 2 +- nativehook/src/main/cpp/asm/instruction.h | 2 +- nativehook/src/main/cpp/asm/label.h | 2 +- .../src/main/cpp/assembler/assembler.cpp | 40 +++--- nativehook/src/main/cpp/decoder/decoder.cpp | 4 +- nativehook/src/main/cpp/includes/assembler.h | 22 +-- nativehook/src/main/cpp/includes/decoder.h | 11 +- nativehook/src/main/cpp/sandhook_native.cpp | 134 ------------------ 20 files changed, 112 insertions(+), 245 deletions(-) diff --git a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp index e2914293..a51298fe 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.cpp @@ -10,24 +10,24 @@ using namespace SandHook::RegistersA32; using namespace SandHook::AsmA32; AssemblerA32::AssemblerA32(CodeBuffer* codeBuffer) { - code_container.setCodeBuffer(codeBuffer); + code_container.SetCodeBuffer(codeBuffer); } void *AssemblerA32::GetPC() { - return reinterpret_cast(code_container.curPc); + return reinterpret_cast(code_container.cur_pc); } void *AssemblerA32::GetStartPC() { - return reinterpret_cast(code_container.startPc); + return reinterpret_cast(code_container.start_pc); } void AssemblerA32::AllocBufferFirst(U32 size) { - code_container.allocBufferFirst(size); + code_container.AllocBufferFirst(size); } void *AssemblerA32::Finish() { - code_container.commit(); - return reinterpret_cast(code_container.startPc); + code_container.Commit(); + return reinterpret_cast(code_container.start_pc); } void AssemblerA32::Emit(U32 data32) { @@ -39,7 +39,7 @@ void AssemblerA32::Emit(U16 data16) { } void AssemblerA32::Emit(BaseUnit *unit) { - code_container.append(unit); + code_container.Append(unit); } void AssemblerA32::Mov(RegisterA32 &rd, U16 imm16) { diff --git a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h index 715386ff..d6337d3b 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/assembler/assembler_arm32.h @@ -31,7 +31,7 @@ namespace SandHook { void Emit(U32 data32); void Emit(U16 data16); - void Emit(Unit* unit); + void Emit(BaseUnit* unit); void Mov(RegisterA32 &rd, U16 imm16); diff --git a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp index 2eca81eb..fecc9fd2 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.cpp @@ -22,8 +22,8 @@ goto label_matched; \ Arm32Decoder* Arm32Decoder::instant = new Arm32Decoder(); -void Arm32Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, - bool onlyPcRelInst) { +void Arm32Decoder::Disassemble(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) { bool thumb = IsThumbCode(reinterpret_cast(codeStart)); if (thumb) { codeStart = GetThumbCodeAddress(codeStart); diff --git a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h index 01fbdc37..4708b765 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h +++ b/nativehook/src/main/cpp/archs/arm/arm32/decoder/decoder_arm32.h @@ -12,8 +12,8 @@ namespace SandHook { class Arm32Decoder : public InstDecoder { public: - void Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, - bool onlyPcRelInst) override; + void Disassemble(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) override; public: static Arm32Decoder* instant; }; diff --git a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp index 55c8bb6f..e0ecedbe 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/hook/hook_arm32.cpp @@ -28,7 +28,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) { return nullptr; } - bool changeMode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) replace); + bool change_mode = IsThumbCode((Addr) origin) != IsThumbCode((Addr) replace); void* backup = nullptr; AssemblerA32 assembler_backup(backup_buffer); @@ -39,7 +39,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) { //build inline trampoline #define __ assembler_inline. - if (!changeMode) { + if (!change_mode) { Label *target_addr_label = new Label(); ALIGN_FOR_LDR __ Ldr(PC, target_addr_label); @@ -54,7 +54,7 @@ void *InlineHookArm32Android::Hook(void *origin, void *replace) { //build backup method CodeRelocateA32 relocate = CodeRelocateA32(assembler_backup); - backup = relocate.Relocate(origin, code_container_inline->size(), nullptr); + backup = relocate.Relocate(origin, code_container_inline->Size(), nullptr); #define __ assembler_backup. Label* origin_addr_label = new Label(); ALIGN_FOR_LDR @@ -107,7 +107,7 @@ bool InlineHookArm32Android::BreakPoint(void *origin, void (*callback)(REG *)) { //build trampoline origin_addr_s = (Addr) GetThumbPC(backup); callback_addr_s = (Addr) callback; - void* trampoline = backup_buffer->copy((void*)BP_SHELLCODE, SHELLCODE_LEN(BP_SHELLCODE)); + void* trampoline = backup_buffer->Copy((void*)BP_SHELLCODE, SHELLCODE_LEN(BP_SHELLCODE)); //build inline trampoline #define __ assembler_inline. diff --git a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp index 2ee583b6..7db19a4f 100644 --- a/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm32/relocate/code_relocate_arm32.cpp @@ -44,7 +44,7 @@ void* CodeRelocateA32::Relocate(void *startPc, Addr len, void *toPc = nullptr) t __ AllocBufferFirst(static_cast(len * 8)); void* curPc = __ GetPC(); if (toPc == nullptr) { - Disassembler::Get()->Disassembler(startPc, len, *this, true); + Disassembler::Get()->Disassemble(startPc, len, *this, true); } else { //TODO } @@ -52,7 +52,7 @@ void* CodeRelocateA32::Relocate(void *startPc, Addr len, void *toPc = nullptr) t } void* CodeRelocateA32::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { - void* curPc = __ GetPC(); + void* cur_pc = __ GetPC(); //insert later AddBind labels __ Emit(GetLaterBindLabel(cur_offset)); @@ -60,7 +60,7 @@ void* CodeRelocateA32::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo if (!instruction->PcRelate()) { __ Emit(instruction); instruction->Ref(); - return curPc; + return cur_pc; } if (instruction->InstType() == thumb32) { @@ -88,7 +88,7 @@ void* CodeRelocateA32::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo __ Emit(instruction); instruction->Ref(); } - return curPc; + return cur_pc; } @@ -99,14 +99,14 @@ IMPL_RELOCATE(T16, B_COND) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); if (inst->condition == al) { Label* target_label = new Label; ALIGN_FOR_LDR __ Ldr(PC, target_label); __ Emit(target_label); - __ Emit(targetAddr); + __ Emit(target_addr); } else { Label* true_label = new Label(); Label* false_label = new Label(); @@ -117,7 +117,7 @@ IMPL_RELOCATE(T16, B_COND) { ALIGN_FOR_LDR __ Ldr(PC, target_label); __ Emit(target_label); - __ Emit(targetAddr); + __ Emit(target_addr); __ Emit(false_label); } @@ -130,13 +130,13 @@ IMPL_RELOCATE(T16, B) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); Label* target_label = new Label(); ALIGN_FOR_LDR __ Ldr(PC, target_label); __ Emit(target_label); - __ Emit((Addr) GetThumbPC(reinterpret_cast(targetAddr))); + __ Emit((Addr) GetThumbPC(reinterpret_cast(target_addr))); } @@ -155,7 +155,7 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); Label* true_label = new Label; Label* false_label = new Label; @@ -168,7 +168,7 @@ IMPL_RELOCATE(T16, CBZ_CBNZ) { ALIGN_FOR_LDR __ Ldr(PC, target_label); __ Emit(target_label); - __ Emit((Addr) GetThumbPC(reinterpret_cast(targetAddr))); + __ Emit((Addr) GetThumbPC(reinterpret_cast(target_addr))); __ Emit(false_label); } @@ -182,9 +182,9 @@ IMPL_RELOCATE(T16, LDR_LIT) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); - __ Mov(*inst->rt, targetAddr); + __ Mov(*inst->rt, target_addr); __ Ldr(*inst->rt, MemOperand(inst->rt, 0)); } @@ -197,9 +197,9 @@ IMPL_RELOCATE(T16, ADR) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); - __ Mov(*inst->rd, targetAddr); + __ Mov(*inst->rd, target_addr); } @@ -229,14 +229,14 @@ IMPL_RELOCATE(T32, B32) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); if (inst->x == T32_B32::thumb) { //Thumb mode - targetAddr = reinterpret_cast(GetThumbPC(reinterpret_cast(targetAddr))); + target_addr = reinterpret_cast(GetThumbPC(reinterpret_cast(target_addr))); } - __ Mov(IP, targetAddr); + __ Mov(IP, target_addr); if (inst->op == T32_B32::BL) { __ Blx(IP); } else { @@ -254,9 +254,9 @@ IMPL_RELOCATE(T32, LDR_LIT) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); - __ Mov(*inst->rt, targetAddr); + __ Mov(*inst->rt, target_addr); switch (inst->op) { case T32_LDR_LIT::LDR: __ Ldr(*inst->rt, MemOperand(inst->rt, 0)); diff --git a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp index 764322fb..6233c6e3 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.cpp @@ -9,24 +9,24 @@ using namespace SandHook::RegistersA64; using namespace SandHook::AsmA64; AssemblerA64::AssemblerA64(CodeBuffer* codeBuffer) { - code_container.setCodeBuffer(codeBuffer); + code_container.SetCodeBuffer(codeBuffer); } void *AssemblerA64::GetPC() { - return reinterpret_cast(code_container.curPc); + return reinterpret_cast(code_container.cur_pc); } void *AssemblerA64::GetStartPC() { - return reinterpret_cast(code_container.startPc); + return reinterpret_cast(code_container.start_pc); } void AssemblerA64::AllocBufferFirst(U32 size) { - code_container.allocBufferFirst(size); + code_container.AllocBufferFirst(size); } void *AssemblerA64::Finish() { - code_container.commit(); - return reinterpret_cast(code_container.startPc); + code_container.Commit(); + return reinterpret_cast(code_container.start_pc); } @@ -39,7 +39,7 @@ void AssemblerA64::Emit(U32 data32) { } void AssemblerA64::Emit(BaseUnit *unit) { - code_container.append(unit); + code_container.Append(unit); } void AssemblerA64::MoveWide(RegisterA64 &rd, INST_A64(MOV_WIDE)::OP op, U64 imme, diff --git a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h index a9a4d62e..a70e1c79 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/assembler/assembler_arm64.h @@ -25,7 +25,7 @@ namespace SandHook { void Emit(U32 data32); void Emit(U64 data64); - void Emit(Unit* unit); + void Emit(BaseUnit* unit); void MoveWide(RegisterA64& rd, INST_A64(MOV_WIDE)::OP op, U64 imme, INST_A64(MOV_WIDE)::Shift shift); diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp index 6a3947be..221802e9 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.cpp @@ -16,8 +16,8 @@ goto label_matched; \ Arm64Decoder* Arm64Decoder::instant = new Arm64Decoder(); -void Arm64Decoder::Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, - bool onlyPcRelInst) { +void Arm64Decoder::Disassemble(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) { InstA64 *pc = reinterpret_cast(codeStart); Addr end_addr = (Addr) codeStart + codeLen; BaseUnit* unit = nullptr; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h index b237d0cd..a0e90c34 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/decoder/decoder_arm64.h @@ -11,8 +11,8 @@ namespace SandHook { class Arm64Decoder : public InstDecoder { public: - void Disassembler(void *codeStart, Addr codeLen, InstVisitor &visitor, - bool onlyPcRelInst) override; + void Disassemble(void *codeStart, Addr codeLen, InstVisitor &visitor, + bool onlyPcRelInst) override; public: static Arm64Decoder* instant; }; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp index 73003bef..c65d8964 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/hook/hook_arm64.cpp @@ -36,13 +36,13 @@ void *InlineHookArm64Android::Hook(void *origin, void *replace) { //build backup method CodeRelocateA64 relocate = CodeRelocateA64(assembler_backup); - backup = relocate.Relocate(origin, code_container_inline->size(), nullptr); + backup = relocate.Relocate(origin, code_container_inline->Size(), nullptr); #define __ assembler_backup. Label* origin_addr_label = new Label(); __ Ldr(IP1, origin_addr_label); __ Br(IP1); __ Emit(origin_addr_label); - __ Emit((Addr) origin + code_container_inline->size()); + __ Emit((Addr) origin + code_container_inline->Size()); __ Finish(); #undef __ diff --git a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp index b3365411..3bde410f 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp +++ b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.cpp @@ -24,7 +24,7 @@ CodeRelocateA64::CodeRelocateA64(AssemblerA64 &assembler) : CodeRelocate(assembl assemblerA64 = &assembler; } -bool CodeRelocateA64::Visit(Unit *unit, void *pc) { +bool CodeRelocateA64::Visit(BaseUnit *unit, void *pc) { Relocate(reinterpret_cast(unit), __ GetPC()); cur_offset += unit->Size(); if (unit->RefCount() == 0) { @@ -39,17 +39,17 @@ void* CodeRelocateA64::Relocate(void *startPc, Addr len, void *toPc = nullptr) t length = len; cur_offset = 0; __ AllocBufferFirst(static_cast(len * 8)); - void* curPc = __ GetPC(); + void* cur_pc = __ GetPC(); if (toPc == nullptr) { - Disassembler::Get()->Disassembler(startPc, len, *this, true); + Disassembler::Get()->Disassemble(startPc, len, *this, true); } else { //TODO } - return curPc; + return cur_pc; } void* CodeRelocateA64::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCodeException) { - void* curPc = __ GetPC(); + void* cur_pc = __ GetPC(); //insert later AddBind labels __ Emit(GetLaterBindLabel(cur_offset)); @@ -57,7 +57,7 @@ void* CodeRelocateA64::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo if (!instruction->PcRelate()) { __ Emit(instruction); instruction->Ref(); - return curPc; + return cur_pc; } switch (instruction->InstCode()) { CASE(B_BL) @@ -70,7 +70,7 @@ void* CodeRelocateA64::Relocate(BaseInst *instruction, void *toPc) throw(ErrorCo __ Emit(instruction); instruction->Ref(); } - return curPc; + return cur_pc; } IMPL_RELOCATE(B_BL) { @@ -82,7 +82,7 @@ IMPL_RELOCATE(B_BL) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); if (inst->op == inst->BL) { Addr lr = reinterpret_cast(toPc); @@ -91,7 +91,7 @@ IMPL_RELOCATE(B_BL) { lr += 4; // Br __ Mov(LR, lr); } - __ Mov(IP1, targetAddr); + __ Mov(IP1, target_addr); __ Br(IP1); } @@ -104,7 +104,7 @@ IMPL_RELOCATE(B_COND) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); Label *true_label = new Label(); Label *false_label = new Label(); @@ -113,7 +113,7 @@ IMPL_RELOCATE(B_COND) { __ B(false_label); __ Emit(true_label); - __ Mov(IP1, targetAddr); + __ Mov(IP1, target_addr); __ Br(IP1); __ Emit(false_label); @@ -128,7 +128,7 @@ IMPL_RELOCATE(TBZ_TBNZ) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); Label *true_label = new Label(); Label *false_label = new Label(); @@ -141,7 +141,7 @@ IMPL_RELOCATE(TBZ_TBNZ) { __ B(false_label); __ Emit(true_label); - __ Mov(IP1, targetAddr); + __ Mov(IP1, target_addr); __ Br(IP1); __ Emit(false_label); @@ -156,7 +156,7 @@ IMPL_RELOCATE(CBZ_CBNZ) { return; } - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); Label *true_label = new Label(); Label *false_label = new Label(); @@ -170,14 +170,14 @@ IMPL_RELOCATE(CBZ_CBNZ) { __ B(false_label); __ Emit(true_label); - __ Mov(IP1, targetAddr); + __ Mov(IP1, target_addr); __ Br(IP1); __ Emit(false_label); } IMPL_RELOCATE(LDR_LIT) { - Addr targetAddr = inst->GetImmPCOffsetTarget(); + Addr target_addr = inst->GetImmPCOffsetTarget(); XRegister* rtX = XReg(inst->rt->Code()); WRegister* rtW = WReg(inst->rt->Code()); @@ -190,20 +190,20 @@ IMPL_RELOCATE(LDR_LIT) { switch (inst->op) { case INST_A64(LDR_LIT)::LDR_X: - __ Mov(*rtX, targetAddr); + __ Mov(*rtX, target_addr); __ Ldr(*rtX, MemOperand(rtX, 0, Offset)); break; case INST_A64(LDR_LIT)::LDR_W: - __ Mov(*rtX, targetAddr); + __ Mov(*rtX, target_addr); __ Ldr(*rtW, MemOperand(rtX, 0, Offset)); break; case INST_A64(LDR_LIT)::LDR_SW: - __ Mov(*rtX, targetAddr); + __ Mov(*rtX, target_addr); __ Ldrsw(*rtX, MemOperand(rtX, 0, Offset)); break; case INST_A64(LDR_LIT)::LDR_PRFM: __ Push(X0); - __ Mov(X0, targetAddr); + __ Mov(X0, target_addr); __ Ldrsw(X0, MemOperand(rtX, 0, Offset)); __ Pop(X0); break; diff --git a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h index 57a5602d..a4b4ffaa 100644 --- a/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h +++ b/nativehook/src/main/cpp/archs/arm/arm64/relocate/code_relocate_arm64.h @@ -26,7 +26,7 @@ namespace SandHook { void* Relocate(void *startPc, Addr len, void *toPc) throw(ErrorCodeException) override; - bool Visit(Unit *unit, void *pc) override; + bool Visit(BaseUnit *unit, void *pc) override; DEFINE_RELOCATE(B_BL) diff --git a/nativehook/src/main/cpp/asm/instruction.h b/nativehook/src/main/cpp/asm/instruction.h index eaea231a..36515717 100644 --- a/nativehook/src/main/cpp/asm/instruction.h +++ b/nativehook/src/main/cpp/asm/instruction.h @@ -99,7 +99,7 @@ namespace SandHook { S backup_; }; - class Void : public Unit { + class Void : public BaseUnit { public: Void(U32 size) : size_(size) {} diff --git a/nativehook/src/main/cpp/asm/label.h b/nativehook/src/main/cpp/asm/label.h index ec952d0e..59a9a945 100644 --- a/nativehook/src/main/cpp/asm/label.h +++ b/nativehook/src/main/cpp/asm/label.h @@ -20,7 +20,7 @@ namespace SandHook { Label() {} - Label(void *pc) : Unit(pc) {} + Label(void *pc) : BaseUnit(pc) {} enum UnitTypeDef UnitType() override { return UnitTypeDef::UnitLabel; diff --git a/nativehook/src/main/cpp/assembler/assembler.cpp b/nativehook/src/main/cpp/assembler/assembler.cpp index c93d8e16..3f78e638 100644 --- a/nativehook/src/main/cpp/assembler/assembler.cpp +++ b/nativehook/src/main/cpp/assembler/assembler.cpp @@ -8,32 +8,32 @@ using namespace SandHook::Assembler; using namespace SandHook::Asm; -CodeContainer::CodeContainer(CodeBuffer *codeBuffer) : codeBuffer(codeBuffer) {} +CodeContainer::CodeContainer(CodeBuffer *codeBuffer) : code_buffer(codeBuffer) {} -void CodeContainer::setCodeBuffer(CodeBuffer *codeBuffer) { - this->codeBuffer = codeBuffer; +void CodeContainer::SetCodeBuffer(CodeBuffer *codeBuffer) { + this->code_buffer = codeBuffer; } -void CodeContainer::append(Unit *unit) { +void CodeContainer::Append(BaseUnit *unit) { units.push_back(unit); - unit->SetVPC(curPc); + unit->SetVPC(cur_pc); switch (unit->UnitType()) { case UnitLabel: labels.push_back((Label*)unit); break; default: - curPc += unit->Size(); + cur_pc += unit->Size(); } } -void CodeContainer::commit() { - U32 bufferSize = static_cast(curPc - startPc); +void CodeContainer::Commit() { + U32 bufferSize = static_cast(cur_pc - start_pc); void* bufferStart; - if (startPc > 0) { - bufferStart = reinterpret_cast(startPc); - codeBuffer->ResetLastBufferSize(bufferSize); + if (start_pc > 0) { + bufferStart = reinterpret_cast(start_pc); + code_buffer->ResetLastBufferSize(bufferSize); } else { - bufferStart = codeBuffer->GetBuffer(bufferSize); + bufferStart = code_buffer->GetBuffer(bufferSize); } Addr pcNow = reinterpret_cast(bufferStart); @@ -61,23 +61,23 @@ void CodeContainer::commit() { FlushCache(reinterpret_cast(bufferStart), pcNow - reinterpret_cast(bufferStart)); //Set pc - startPc = reinterpret_cast(bufferStart); - curPc = pcNow; + start_pc = reinterpret_cast(bufferStart); + cur_pc = pcNow; } -void CodeContainer::allocBufferFirst(U32 size) { - startPc = reinterpret_cast(codeBuffer->GetBuffer(size)); - curPc = startPc; +void CodeContainer::AllocBufferFirst(U32 size) { + start_pc = reinterpret_cast(code_buffer->GetBuffer(size)); + cur_pc = start_pc; } CodeContainer::~CodeContainer() { - std::list*>::iterator unit; + std::list::iterator unit; for(unit = units.begin();unit != units.end(); ++unit) { delete (*unit); } } -Addr CodeContainer::size() { - return curPc - startPc; +Addr CodeContainer::Size() { + return cur_pc - start_pc; } diff --git a/nativehook/src/main/cpp/decoder/decoder.cpp b/nativehook/src/main/cpp/decoder/decoder.cpp index fd9948fe..a2729e2d 100644 --- a/nativehook/src/main/cpp/decoder/decoder.cpp +++ b/nativehook/src/main/cpp/decoder/decoder.cpp @@ -11,13 +11,13 @@ using namespace SandHook::Decoder; -bool DefaultVisitor::Visit(Unit *unit, void *pc) { +bool DefaultVisitor::Visit(BaseUnit *unit, void *pc) { bool res = visitor(unit, pc); delete unit; return res; } -DefaultVisitor::DefaultVisitor(bool (*visitor)(Unit *, void *)) : visitor(visitor) {} +DefaultVisitor::DefaultVisitor(bool (*visitor)(BaseUnit *, void *)) : visitor(visitor) {} //do not support now InstDecoder* Disassembler::Get(Arch arch) { diff --git a/nativehook/src/main/cpp/includes/assembler.h b/nativehook/src/main/cpp/includes/assembler.h index 021fbb47..0447fa2f 100644 --- a/nativehook/src/main/cpp/includes/assembler.h +++ b/nativehook/src/main/cpp/includes/assembler.h @@ -23,7 +23,7 @@ namespace SandHook { public: virtual void* GetBuffer(U32 size) = 0; virtual void ResetLastBufferSize(U32 size){}; - virtual void* copy(void* start, U32 size) { + virtual void* Copy(void* start, U32 size) { void* bufferStart = GetBuffer(size); if (bufferStart == nullptr) return nullptr; @@ -38,26 +38,26 @@ namespace SandHook { CodeContainer(CodeBuffer *codeBuffer); - void setCodeBuffer(CodeBuffer *codeBuffer); + void SetCodeBuffer(CodeBuffer *codeBuffer); //allow code Relocate to Get new pc first - void allocBufferFirst(U32 size); - void append(Unit* unit); - void commit(); + void AllocBufferFirst(U32 size); + void Append(BaseUnit *unit); + void Commit(); - Addr size(); + Addr Size(); virtual ~CodeContainer(); public: //before commit is virtual address so = 0, after commit is real address - Addr startPc = 0; - Addr curPc = 0; + Addr start_pc = 0; + Addr cur_pc = 0; private: - Addr maxSize = 0; - std::list*> units = std::list*>(); + Addr max_size = 0; + std::list units = std::list(); std::list labels = std::list(); - CodeBuffer* codeBuffer = nullptr; + CodeBuffer* code_buffer = nullptr; }; diff --git a/nativehook/src/main/cpp/includes/decoder.h b/nativehook/src/main/cpp/includes/decoder.h index db978cfe..f94b24dc 100644 --- a/nativehook/src/main/cpp/includes/decoder.h +++ b/nativehook/src/main/cpp/includes/decoder.h @@ -15,7 +15,7 @@ namespace SandHook { class InstVisitor { public: //need free unit - virtual bool Visit(Unit *unit, void *pc) { + virtual bool Visit(BaseUnit *unit, void *pc) { delete unit; return false; }; @@ -32,11 +32,12 @@ namespace SandHook { class InstDecoder { public: - virtual void Disassembler(void *code_start, Addr code_len, InstVisitor &visitor, - bool only_pc_rel = false) = 0; - inline void Disassembler(void* codeStart, Addr codeLen, bool (*visitor)(Unit*, void*), bool only_pc_rel = false) { + virtual void Disassemble(void *code_start, Addr code_len, InstVisitor &visitor, + bool only_pc_rel = false) = 0; + inline void Disassemble(void *codeStart, Addr codeLen, + bool (*visitor)(BaseUnit *, void *), bool only_pc_rel = false) { InstVisitor vis = DefaultVisitor(visitor); - Disassembler(codeStart, codeLen, vis, only_pc_rel); + Disassemble(codeStart, codeLen, vis, only_pc_rel); }; }; diff --git a/nativehook/src/main/cpp/sandhook_native.cpp b/nativehook/src/main/cpp/sandhook_native.cpp index 9635ac8f..481f6ae5 100644 --- a/nativehook/src/main/cpp/sandhook_native.cpp +++ b/nativehook/src/main/cpp/sandhook_native.cpp @@ -3,8 +3,6 @@ // #include -#include -#include #include "sandhook_native.h" #include "hook.h" #include "elf.h" @@ -12,138 +10,6 @@ using namespace SandHook::Hook; using namespace SandHook::Elf; -int m1 = 5; -int m3 = 1036; -int m2 = 1035; -int m4 = 5; - -void (*dosth3Backup)(int, int) = nullptr; -void (*dosth4Backup)() = nullptr; -void (*dosth4Backup2)() = nullptr; - -void (*innerSuspendVM)() = nullptr; - - -static void (*heapPreForkBackup)(void *) = nullptr; - - -static void myHeapPreFork(void *heap) { - heapPreForkBackup(heap); -} - - -void SuspendVMReplace() { - LOGE("VM Suspend!"); - innerSuspendVM(); -} - -void do2() { - int a = 1 + 1; - int b = 1 + 1; - int c = 1 + 1; - int d = 1 + 1; -} - -void do3(int x, int y) { - do2(); - int a = 1 + 1; - int b = 1 + 1; - int c = 1 + 1; - int d = a + b + c; - LOGE("do3 = %d", y); -} - -void do5() { - LOGE("x = %d", 5); -} - -void do4() { - int a = 1 + 1; - int b = a + 1; - int d = a + 1; - int e = a + 1; - LOGE("x = %d", 7); -} - -void do4replace() { - int a = 1 + 1; - int b = 1 + 1; - int c = 1 + 1; - int d = 1 + 1; - dosth4Backup(); -} - -void do4replace2() { - int a = 1 + 1; - int c = 1 + 1; - int d = 1 + 1; - dosth4Backup2(); -} - -void do3replace(int x, int y) { - int a = 1 + 1; - int b = 1 + 1; - int c = 1 + 1; - int d = 1 + 1; - dosth3Backup(x, y); -} - -void do1() { - do2(); -} - -void breakCallback(REG regs[]) { - LOGE("breakCallback = %d SP = %d", regs[0], regs); -} - - -class Visitor : public InstVisitor { - bool Visit(Unit *unit, void *pc) override { - BaseInst* instruction = reinterpret_cast(unit); - instruction->Assemble(); - return true; - } -}; - -extern "C" -JNIEXPORT void JNICALL -Java_com_swift_sandhook_nativehook_NativeHook_test(JNIEnv *env, jclass jclass1) { - - - dosth4Backup = reinterpret_cast(InlineHook::instance->Hook( - reinterpret_cast(do4), - reinterpret_cast(do4replace))); - - dosth4Backup2 = reinterpret_cast(InlineHook::instance->Hook( - reinterpret_cast(do4), - reinterpret_cast(do4replace2))); - - - do4(); - - if (sizeof(void*) == 8) { - heapPreForkBackup = reinterpret_cast(SandInlineHookSym("/system/lib64/libart.so", "_ZN3art2gc4Heap13PreZygoteForkEv", - reinterpret_cast(myHeapPreFork))); - innerSuspendVM = reinterpret_cast(SandInlineHookSym("/system/lib64/libart.so", "_ZN3art3Dbg9SuspendVMEv", - reinterpret_cast(SuspendVMReplace))); - } else { - heapPreForkBackup = reinterpret_cast(SandInlineHookSym("/system/lib/libart.so", "_ZN3art2gc4Heap13PreZygoteForkEv", - reinterpret_cast(myHeapPreFork))); - innerSuspendVM = reinterpret_cast(SandInlineHookSym("/system/lib/libart.so", "_ZN3art3Dbg9SuspendVMEv", - reinterpret_cast(SuspendVMReplace))); - } - - void* do3P = reinterpret_cast(do3); - - InlineHook::instance->BreakPoint(reinterpret_cast((Addr)do3), breakCallback); - - LOGE("ok"); - - do3(100, 2); - - -} - extern "C" EXPORT void* SandGetSym(const char* so, const char* symb) { From bf7da1fd9f3bed7ef3b94ff5e207df8a5c8e4509 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Thu, 11 Jul 2019 23:35:23 +0800 Subject: [PATCH 8/9] [Reconstitution]remove test code --- app/src/main/java/com/swift/sandhook/MyApp.java | 2 -- hooklib/build.gradle | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/com/swift/sandhook/MyApp.java b/app/src/main/java/com/swift/sandhook/MyApp.java index 7e261b2c..68c8ed39 100644 --- a/app/src/main/java/com/swift/sandhook/MyApp.java +++ b/app/src/main/java/com/swift/sandhook/MyApp.java @@ -37,8 +37,6 @@ public void onCreate() { SandHookConfig.SDK_INT = 29; } - NativeHook.test(); - SandHook.disableVMInline(); SandHook.tryDisableProfile(getPackageName()); SandHook.disableDex2oatInline(false); diff --git a/hooklib/build.gradle b/hooklib/build.gradle index e9e860aa..17f81b36 100644 --- a/hooklib/build.gradle +++ b/hooklib/build.gradle @@ -15,7 +15,7 @@ android { cmake { arguments '-DBUILD_TESTING=OFF' cppFlags "-frtti -fexceptions" - abiFilters 'armeabi-v7a', 'arm64-v8a' + abiFilters 'armeabi-v7a' } } } From f9a5dd1028422f15a9a5fa85952e5c96791a6837 Mon Sep 17 00:00:00 2001 From: swift_gan <939543405@qq.com> Date: Thu, 11 Jul 2019 23:38:11 +0800 Subject: [PATCH 9/9] [Reconstitution]revert gradle --- hooklib/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hooklib/build.gradle b/hooklib/build.gradle index 17f81b36..e9e860aa 100644 --- a/hooklib/build.gradle +++ b/hooklib/build.gradle @@ -15,7 +15,7 @@ android { cmake { arguments '-DBUILD_TESTING=OFF' cppFlags "-frtti -fexceptions" - abiFilters 'armeabi-v7a' + abiFilters 'armeabi-v7a', 'arm64-v8a' } } }