Commit 8cabbbda authored by swift_gan's avatar swift_gan Committed by swift_gan

tweak framework

parent 9bdcf2b6
...@@ -24,6 +24,7 @@ add_library( # Sets the name of the library. ...@@ -24,6 +24,7 @@ add_library( # Sets the name of the library.
src/main/cpp/archs/arm64/register/register_a64.cpp src/main/cpp/archs/arm64/register/register_a64.cpp
src/main/cpp/archs/arm64/register/register_list_a64.cpp src/main/cpp/archs/arm64/register/register_list_a64.cpp
src/main/cpp/archs/arm64/decoder/decoder_arm64.cpp src/main/cpp/archs/arm64/decoder/decoder_arm64.cpp
src/main/cpp/archs/arm64/relocate/code_relocate_a64.cpp
src/main/cpp/archs/arm32/inst/inst_arm32.cpp src/main/cpp/archs/arm32/inst/inst_arm32.cpp
src/main/cpp/archs/arm32/register/register_a32.cpp src/main/cpp/archs/arm32/register/register_a32.cpp
src/main/cpp/relocate/code_relocate.cpp src/main/cpp/relocate/code_relocate.cpp
......
...@@ -57,3 +57,11 @@ void SandHook::Assembler::AssemblerA64::Movn(RegisterA64 &rd, U64 imme, ...@@ -57,3 +57,11 @@ void SandHook::Assembler::AssemblerA64::Movn(RegisterA64 &rd, U64 imme,
void SandHook::Assembler::AssemblerA64::Emit(Unit<Base> &unit) { void SandHook::Assembler::AssemblerA64::Emit(Unit<Base> &unit) {
codeContainer.append(&unit); codeContainer.append(&unit);
} }
void *SandHook::Assembler::AssemblerA64::getPC() {
return reinterpret_cast<void *>(codeContainer.curPc);
}
void *SandHook::Assembler::AssemblerA64::getStartPC() {
return reinterpret_cast<void *>(codeContainer.startPc);
}
...@@ -16,6 +16,8 @@ namespace SandHook { ...@@ -16,6 +16,8 @@ namespace SandHook {
public: public:
AssemblerA64(CodeBuffer* codeBuffer); AssemblerA64(CodeBuffer* codeBuffer);
void* getStartPC();
void* getPC();
void* finish(); void* finish();
...@@ -33,8 +35,7 @@ namespace SandHook { ...@@ -33,8 +35,7 @@ namespace SandHook {
void Mov(XRegister& rd, U64 imme); void Mov(XRegister& rd, U64 imme);
public:
private:
CodeContainer codeContainer = CodeContainer(nullptr); CodeContainer codeContainer = CodeContainer(nullptr);
}; };
......
//
// Created by swift on 2019/5/12.
//
#include "code_relocate_a64.h"
#define __ assemblerA64->
CodeRelocateA64::CodeRelocateA64(AssemblerA64 &assembler) : CodeRelocate(assembler.codeContainer) {
this->assemblerA64 = &assembler;
}
bool CodeRelocateA64::relocate(Instruction<Base> *instruction, void *toPc) throw(ErrorCodeException) {
__ finish();
return false;
}
bool CodeRelocateA64::relocate(void *startPc, void *toPc, Addr len) throw(ErrorCodeException) {
return false;
}
//
// Created by swift on 2019/5/12.
//
#ifndef SANDHOOK_NH_CODE_RELOCATE_A64_H
#define SANDHOOK_NH_CODE_RELOCATE_A64_H
#include "code_relocate.h"
#include "assembler_a64.h"
using namespace SandHook::Assembler;
using namespace SandHook::Decoder;
namespace SandHook {
namespace Asm {
class CodeRelocateA64 : public CodeRelocate {
public:
CodeRelocateA64(AssemblerA64 &assembler);
bool relocate(Instruction<Base> *instruction, void *toPc) throw(ErrorCodeException) override;
bool relocate(void *startPc, void *toPc, Addr len) throw(ErrorCodeException) override;
private:
AssemblerA64* assemblerA64;
};
}
}
#endif //SANDHOOK_NH_CODE_RELOCATE_A64_H
...@@ -16,6 +16,7 @@ void CodeContainer::setCodeBuffer(CodeBuffer *codeBuffer) { ...@@ -16,6 +16,7 @@ void CodeContainer::setCodeBuffer(CodeBuffer *codeBuffer) {
void CodeContainer::append(Unit<Base> *unit) { void CodeContainer::append(Unit<Base> *unit) {
units.push_back(unit); units.push_back(unit);
unit->setVPC(curPc);
switch (unit->unitType()) { switch (unit->unitType()) {
case UnitLabel: case UnitLabel:
labels.push_back((Label*)unit); labels.push_back((Label*)unit);
...@@ -23,12 +24,17 @@ void CodeContainer::append(Unit<Base> *unit) { ...@@ -23,12 +24,17 @@ void CodeContainer::append(Unit<Base> *unit) {
default: default:
curPc += unit->size(); curPc += unit->size();
} }
unit->setVPC(curPc);
} }
void CodeContainer::commit() { void CodeContainer::commit() {
U32 bufferSize = static_cast<U32>(curPc - startPc); U32 bufferSize = static_cast<U32>(curPc - startPc);
void* bufferStart = codeBuffer->getBuffer(bufferSize); void* bufferStart;
if (startPc > 0) {
bufferStart = reinterpret_cast<void *>(startPc);
codeBuffer->resetLastBufferSize(bufferSize);
} else {
bufferStart = codeBuffer->getBuffer(bufferSize);
}
Addr pcNow = reinterpret_cast<Addr>(bufferStart); Addr pcNow = reinterpret_cast<Addr>(bufferStart);
//commit to code buffer & assembler inst //commit to code buffer & assembler inst
...@@ -59,3 +65,8 @@ void CodeContainer::commit() { ...@@ -59,3 +65,8 @@ void CodeContainer::commit() {
curPc = pcNow; curPc = pcNow;
} }
void CodeContainer::allocBufferFirst(U32 size) {
startPc = reinterpret_cast<Addr>(codeBuffer->getBuffer(size));
curPc = startPc;
}
...@@ -46,3 +46,18 @@ void *StaticCodeBuffer::getBuffer(U32 bufferSize) { ...@@ -46,3 +46,18 @@ void *StaticCodeBuffer::getBuffer(U32 bufferSize) {
memUnprotect(pc, bufferSize); memUnprotect(pc, bufferSize);
return reinterpret_cast<void *>(pc); return reinterpret_cast<void *>(pc);
} }
void AndroidRellocBufferUnsafe::resetLastBufferSize(U32 size) {
if (executePageOffset + (size - lastAllocSize) <= currentExecutePageSize) {
executePageOffset += size - lastAllocSize;
lastAllocSize = size;
}
}
void *AndroidRellocBufferUnsafe::getBuffer(U32 bufferSize) {
void* res = AndroidCodeBuffer::getBuffer(bufferSize);
if (res) {
lastAllocSize = bufferSize;
}
return res;
}
...@@ -14,13 +14,25 @@ namespace SandHook { ...@@ -14,13 +14,25 @@ namespace SandHook {
public: public:
void *getBuffer(U32 bufferSize) override; void *getBuffer(U32 bufferSize) override;
private: protected:
std::list<void*> executeSpaceList = std::list<void*>(); std::list<void*> executeSpaceList = std::list<void*>();
std::mutex allocSpaceLock; std::mutex allocSpaceLock;
Addr executePageOffset = 0; Addr executePageOffset = 0;
U32 currentExecutePageSize = 0; U32 currentExecutePageSize = 0;
}; };
//thread unsafe
class AndroidRellocBufferUnsafe : public AndroidCodeBuffer {
public:
public:
void resetLastBufferSize(U32 size) override;
void *getBuffer(U32 bufferSize) override;
private:
U32 lastAllocSize;
};
class StaticCodeBuffer : public CodeBuffer { class StaticCodeBuffer : public CodeBuffer {
public: public:
......
...@@ -22,6 +22,7 @@ namespace SandHook { ...@@ -22,6 +22,7 @@ namespace SandHook {
class CodeBuffer { class CodeBuffer {
public: public:
virtual void* getBuffer(U32 size) = 0; virtual void* getBuffer(U32 size) = 0;
virtual void resetLastBufferSize(U32 size){};
}; };
class CodeContainer { class CodeContainer {
...@@ -31,6 +32,8 @@ namespace SandHook { ...@@ -31,6 +32,8 @@ namespace SandHook {
void setCodeBuffer(CodeBuffer *codeBuffer); void setCodeBuffer(CodeBuffer *codeBuffer);
//allow code relocate to get new pc first
void allocBufferFirst(U32 size);
void append(Unit<Base>* unit); void append(Unit<Base>* unit);
void commit(); void commit();
......
...@@ -7,19 +7,25 @@ ...@@ -7,19 +7,25 @@
#include "exception.h" #include "exception.h"
#include "instruction.h" #include "instruction.h"
#include "assembler.h"
#include "decoder.h"
using namespace SandHook::Assembler;
using namespace SandHook::Decoder;
namespace SandHook { namespace SandHook {
namespace Asm { namespace Asm {
template <typename Raw> class CodeRelocate : public InstVisitor {
class CodeRelocateCallback {
public: public:
virtual bool result(Unit<Raw>* unit, bool end) throw(ErrorCodeException) = 0;
};
template <typename Raw> CodeRelocate(CodeContainer &codeContainer) : codeContainer(&codeContainer) {}
class CodeRelocate {
virtual bool relocate(Addr toPc, CodeRelocateCallback<Raw>& callback) throw(ErrorCodeException) = 0; virtual bool relocate(Instruction<Base> *instruction, void* toPc) throw(ErrorCodeException) = 0;
virtual bool relocate(void* startPc, void* toPc, Addr len) throw(ErrorCodeException) = 0;
private:
CodeContainer* codeContainer;
}; };
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment