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.
src/main/cpp/archs/arm64/register/register_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/relocate/code_relocate_a64.cpp
src/main/cpp/archs/arm32/inst/inst_arm32.cpp
src/main/cpp/archs/arm32/register/register_a32.cpp
src/main/cpp/relocate/code_relocate.cpp
......
......@@ -57,3 +57,11 @@ void SandHook::Assembler::AssemblerA64::Movn(RegisterA64 &rd, U64 imme,
void SandHook::Assembler::AssemblerA64::Emit(Unit<Base> &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 {
public:
AssemblerA64(CodeBuffer* codeBuffer);
void* getStartPC();
void* getPC();
void* finish();
......@@ -33,8 +35,7 @@ namespace SandHook {
void Mov(XRegister& rd, U64 imme);
private:
public:
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) {
void CodeContainer::append(Unit<Base> *unit) {
units.push_back(unit);
unit->setVPC(curPc);
switch (unit->unitType()) {
case UnitLabel:
labels.push_back((Label*)unit);
......@@ -23,12 +24,17 @@ void CodeContainer::append(Unit<Base> *unit) {
default:
curPc += unit->size();
}
unit->setVPC(curPc);
}
void CodeContainer::commit() {
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);
//commit to code buffer & assembler inst
......@@ -59,3 +65,8 @@ void CodeContainer::commit() {
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) {
memUnprotect(pc, bufferSize);
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 {
public:
void *getBuffer(U32 bufferSize) override;
private:
protected:
std::list<void*> executeSpaceList = std::list<void*>();
std::mutex allocSpaceLock;
Addr executePageOffset = 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 {
public:
......
......@@ -22,6 +22,7 @@ namespace SandHook {
class CodeBuffer {
public:
virtual void* getBuffer(U32 size) = 0;
virtual void resetLastBufferSize(U32 size){};
};
class CodeContainer {
......@@ -31,6 +32,8 @@ namespace SandHook {
void setCodeBuffer(CodeBuffer *codeBuffer);
//allow code relocate to get new pc first
void allocBufferFirst(U32 size);
void append(Unit<Base>* unit);
void commit();
......
......@@ -7,19 +7,25 @@
#include "exception.h"
#include "instruction.h"
#include "assembler.h"
#include "decoder.h"
using namespace SandHook::Assembler;
using namespace SandHook::Decoder;
namespace SandHook {
namespace Asm {
template <typename Raw>
class CodeRelocateCallback {
class CodeRelocate : public InstVisitor {
public:
virtual bool result(Unit<Raw>* unit, bool end) throw(ErrorCodeException) = 0;
};
template <typename Raw>
class CodeRelocate {
virtual bool relocate(Addr toPc, CodeRelocateCallback<Raw>& callback) throw(ErrorCodeException) = 0;
CodeRelocate(CodeContainer &codeContainer) : codeContainer(&codeContainer) {}
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