Skip to content

Commit

Permalink
Changes required by asmjit upstream
Browse files Browse the repository at this point in the history
  • Loading branch information
LePresidente committed Sep 10, 2017
1 parent 052872f commit 3005048
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 22 deletions.
2 changes: 1 addition & 1 deletion cmake_modules/FindAsmJit.cmake
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
SET(ASMJIT_FOUND 0)

FILE(GLOB_RECURSE ASMJIT_SOURCE_DIR_INNER ${DEPENDENCIES_DIR}/asmjit*/asmjit.h)
FILE(GLOB_RECURSE ASMJIT_SOURCE_DIR_INNER ${DEPENDENCIES_DIR}/asmjit/src*/asmjit.h)
GET_FILENAME_COMPONENT(ASMJIT_SOURCE_DIR_INNER ${ASMJIT_SOURCE_DIR_INNER} DIRECTORY)
GET_FILENAME_COMPONENT(ASMJIT_SOURCE_DIR ${ASMJIT_SOURCE_DIR_INNER} DIRECTORY CACHE)
GET_FILENAME_COMPONENT(ASMJIT_BINARY_DIR ${ASMJIT_SOURCE_DIR} DIRECTORY CACHE)
Expand Down
49 changes: 32 additions & 17 deletions thooklib/ttrampolinepool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,15 +224,17 @@ LPVOID TrampolinePool::storeStub(LPVOID reroute, LPVOID original, LPVOID returnA
bufferList.offset += sizeof(LPVOID);

JitRuntime runtime;
CodeHolder codehold;
codehold.init(runtime.getCodeInfo());
#if BOOST_ARCH_X86_64
X86Assembler assembler(&runtime);
X86Assembler assembler(&codehold);
#else
X86Assembler assembler(&runtime);
X86Assembler assembler(&codehold);
#endif
addCallToStub(assembler, original, reroute);
addAbsoluteJump(assembler, reinterpret_cast<uint64_t>(returnAddress));

size_t codeSize = assembler.getCodeSize();
size_t codeSize = codehold.getCodeSize();

m_MaxTrampolineSize = std::max(m_MaxTrampolineSize,
static_cast<int>(codeSize + sizeof(LPVOID)));
Expand All @@ -246,9 +248,13 @@ LPVOID TrampolinePool::storeStub(LPVOID reroute, LPVOID original, LPVOID returnA
}

// adjust relative jumps for move to buffer
codeSize = assembler.relocCode(spot);
codeSize = codehold.relocate(spot);

uint8_t *code = assembler.getBuffer();
codehold.sync();

// copy code to buffer
CodeBuffer& buf = codehold.getSectionEntry(0)->getBuffer();
uint8_t *code = buf.getData();
memcpy(spot, code, codeSize);

bufferList.offset += codeSize;
Expand All @@ -273,7 +279,9 @@ LPVOID TrampolinePool::storeTrampoline(LPVOID reroute, LPVOID original, LPVOID r
bufferList.offset += sizeof(LPVOID);

JitRuntime runtime;
X86Assembler assembler(&runtime);
CodeHolder codehold;
codehold.init(runtime.getCodeInfo());
X86Assembler assembler(&codehold);
addBarrier(reroute, original, assembler);
#if BOOST_ARCH_X86_64
assembler.mov(rax, imm((intptr_t)(void*)(returnAddress)));
Expand All @@ -282,7 +290,7 @@ LPVOID TrampolinePool::storeTrampoline(LPVOID reroute, LPVOID original, LPVOID r
assembler.mov(eax, imm((intptr_t)(void*)(returnAddress)));
assembler.jmp(eax);
#endif
size_t codeSize = assembler.getCodeSize();
size_t codeSize = codehold.getCodeSize();

m_MaxTrampolineSize = std::max(m_MaxTrampolineSize,
static_cast<int>(codeSize + sizeof(LPVOID)));
Expand All @@ -296,10 +304,13 @@ LPVOID TrampolinePool::storeTrampoline(LPVOID reroute, LPVOID original, LPVOID r
}

// adjust relative jumps for move to buffer
codeSize = assembler.relocCode(spot);
codeSize = codehold.relocate(spot);

codehold.sync();

// copy code to buffer
uint8_t *code = assembler.getBuffer();
CodeBuffer& buf = codehold.getSectionEntry(0)->getBuffer();
uint8_t *code = buf.getData();
memcpy(spot, code, codeSize);

bufferList.offset += codeSize;
Expand Down Expand Up @@ -385,19 +396,21 @@ LPVOID TrampolinePool::storeStub(LPVOID reroute, LPVOID original, size_t preambl
bufferList.offset += sizeof(LPVOID);

JitRuntime runtime;
X86Assembler assembler(&runtime);
CodeHolder codehold;
codehold.init(runtime.getCodeInfo());
X86Assembler assembler(&codehold);
addCallToStub(assembler, original, reroute);
#if BOOST_ARCH_X86_64
// insert backup code
*rerouteOffset = assembler.getCodeSize();
*rerouteOffset = codehold.getCodeSize();
copyCode(assembler, original, preambleSize);
#else // BOOST_ARCH_X86_64
assembler.embed(original, preambleSize);
#endif // BOOST_ARCH_X86_64
addAbsoluteJump(assembler, reinterpret_cast<uint64_t>(original) + preambleSize);

// adjust relative jumps for move to buffer
size_t codeSize = assembler.getCodeSize();
size_t codeSize = codehold.getCodeSize();

m_MaxTrampolineSize = std::max(m_MaxTrampolineSize,
static_cast<int>(codeSize + sizeof(LPVOID)));
Expand All @@ -411,7 +424,7 @@ LPVOID TrampolinePool::storeStub(LPVOID reroute, LPVOID original, size_t preambl
}

// copy code to buffer
codeSize = assembler.relocCode(spot);
codeSize = codehold.relocate(spot);

bufferList.offset += preambleSize + codeSize;
return spot;
Expand All @@ -434,15 +447,17 @@ LPVOID TrampolinePool::storeTrampoline(LPVOID reroute, LPVOID original, size_t p
bufferList.offset += sizeof(LPVOID);

JitRuntime runtime;
X86Assembler assembler(&runtime);
CodeHolder codehold;
codehold.init(runtime.getCodeInfo());
X86Assembler assembler(&codehold);
addBarrier(reroute, original, assembler);
// insert backup code
*rerouteOffset = assembler.getCodeSize();
*rerouteOffset = codehold.getCodeSize();
assembler.embed(original, static_cast<uint32_t>(preambleSize));
addAbsoluteJump(assembler, reinterpret_cast<uint64_t>(original) + preambleSize);

// adjust relative jumps for move to buffer
size_t codeSize = assembler.getCodeSize();
size_t codeSize = codehold.getCodeSize();

m_MaxTrampolineSize = std::max(m_MaxTrampolineSize,
static_cast<int>(codeSize + sizeof(LPVOID)));
Expand All @@ -460,7 +475,7 @@ LPVOID TrampolinePool::storeTrampoline(LPVOID reroute, LPVOID original, size_t p
}

// copy code to buffer
codeSize = static_cast<size_t>(assembler.relocCode(spot));
codeSize = static_cast<size_t>(codehold.relocate(spot));

bufferList.offset += preambleSize + codeSize;

Expand Down
12 changes: 8 additions & 4 deletions tinjectlib/injectlib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -296,16 +296,18 @@ REGWORD WriteInjectionStub(HANDLE processHandle
// now for the interesting part: write a stub into the target process that is run before any code of the original binary.

JitRuntime runtime;
CodeHolder codehold;
codehold.init(runtime.getCodeInfo());
#if BOOST_ARCH_X86_64
X86Assembler assembler(&runtime);
X86Assembler assembler(&codehold);
if (returnAddress != 0) {
// put return address on the stack
// (this damages rax which hopefully doesn't matter)
assembler.mov(rax, imm((intptr_t)(void*)data.returnAddress));
assembler.push(rax);
} // otherwise no return address was specified here. It better be on the stack already
#else
X86Assembler assembler(&runtime);
X86Assembler assembler(&codehold);
if (returnAddress != 0) {
assembler.push(imm((intptr_t)(void*)data.returnAddress));
}
Expand All @@ -314,7 +316,7 @@ REGWORD WriteInjectionStub(HANDLE processHandle
addStub(userDataSize, assembler, skipInit, &data, remoteData, initFunction);
assembler.ret(0);

size_t stubSize = assembler.getCodeSize();
size_t stubSize = codehold.getCodeSize();

// reserve memory for the stub
PBYTE stubRemote = reinterpret_cast<PBYTE>(VirtualAllocEx(processHandle, nullptr,
Expand All @@ -324,8 +326,10 @@ REGWORD WriteInjectionStub(HANDLE processHandle
throw windows_error("failed to allocate memory for stub");
}

codehold.sync();
asmjit::CodeBuffer& buf = codehold.getSectionEntry(0)->getBuffer();
// almost there. copy stub to target process
if (!WriteProcessMemory(processHandle, stubRemote, assembler.getBuffer(),
if (!WriteProcessMemory(processHandle, stubRemote, buf.getData(),
stubSize, &written) ||
(written != stubSize)) {
throw windows_error("failed to write stub to target process");
Expand Down

0 comments on commit 3005048

Please sign in to comment.