Sry für den doppelpost, aber ich denke jetzt darf ich es, sonst lösch ich den obrigen post :)
Mein kumpel und ich haben uns hingesetzt um jetzt den x64 jump zu machen, jedoch ist es broken irgendwie.. (Typ von hooken: mid function hook)
Ich hoffe jemand kann hier weiter aushelfen :)
(irgendwie schafft es der VirtualAlloc nicht immer)
Code:
const short MOV_R11_BYTES = 0xBB49;
const short PUSH_R11_BYTE = 0x5341;
const char RET_BYTE = 0xC3;
const int JMP_SMALL_LENGTH = 5;
const int JMP_BIG_LENGTH = 13;
smallJump
Code:
bool writeSmallJump(BYTE* src, BYTE* dst, const unsigned int length){
if(length < JMP_SMALL_LENGTH)
return false;
DWORD dwOldProtect;
VirtualProtect(src, length, PAGE_READWRITE, &dwOldProtect);
src[0] = 0xE9;
*(DWORD*)(src+1) = ((DWORD)dst - (DWORD)src - 5);
VirtualProtect(src, length, PAGE_READWRITE, &dwOldProtect);
return true;
}
bigJump
Code:
bool writeBigJump(BYTE* src, BYTE* dst, const unsigned int length){
if(length < JMP_BIG_LENGTH)
return false;
DWORD oldProtect;
VirtualProtect(src, length, PAGE_READWRITE, &oldProtect);
int offset = 0;
*(short*)(src + offset) = MOV_R11_BYTES;
offset += 2;
*(DWORD64*)(src + offset) = (DWORD64)dst;
offset += sizeof(DWORD64);
*(short*)(src + offset) = PUSH_R11_BYTE;
offset += 2;
*(char*)(src + offset) = RET_BYTE;
offset += 1;
VirtualProtect(src, length, oldProtect, &oldProtect);
return true;
}
not working x64 jump lol
Code:
void writeNoWorkingX64Jump(BYTE* src, BYTE* dst, void** ret, const unsigned int length)
{
if(length < JMP_SMALL_LENGTH){
*ret = NULL;
return;
}
const int totalLength = 13 + length + 13;
//
BYTE* trampoline = (BYTE*)malloc(totalLength);
DWORD dwOldProt;
BYTE* smallTrampoline = (BYTE*)VirtualAlloc((void*)src, JMP_BIG_LENGTH, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
DWORD difference = (DWORD)((DWORD64)smallTrampoline - (DWORD64)src);
if(difference > (DWORD)0xFFFFFFFF)
MessageBox(0, "memory to far: DETOUR", 0,0);
if(((DWORD64)trampoline & (DWORD64)smallTrampoline) == NULL){
*ret = NULL;
return;
}
//JMP to Hook
//////////////////////////////////////////////////////////////
writeBigJump(smallTrampoline, trampoline, JMP_BIG_LENGTH);
writeBigJump(trampoline, dst, JMP_BIG_LENGTH);
//////////////////////////////////////////////////////////////
trampoline+=JMP_BIG_LENGTH;
*ret = trampoline;
//Save code
memcpy(trampoline, (void*)src, length);
trampoline += length;
/////////////////////////////////
writeBigJump(trampoline, src+length, JMP_BIG_LENGTH);
writeSmallJump(src, smallTrampoline, length);
for(int i = 12; i < length; i++)
src[i] = 0x90;
}
All-in-one:
Code:
const short MOV_R11_BYTES = 0xBB49;
const short PUSH_R11_BYTE = 0x5341;
const char RET_BYTE = 0xC3;
const int JMP_SMALL_LENGTH = 5;
const int JMP_BIG_LENGTH = 13;
bool writeSmallJump(BYTE* src, BYTE* dst, const unsigned int length){
if(length < JMP_SMALL_LENGTH)
return false;
DWORD dwOldProtect;
VirtualProtect(src, length, PAGE_READWRITE, &dwOldProtect);
src[0] = 0xE9;
*(DWORD*)(src+1) = ((DWORD)dst - (DWORD)src - 5);
VirtualProtect(src, length, PAGE_READWRITE, &dwOldProtect);
return true;
}
bool writeBigJump(BYTE* src, BYTE* dst, const unsigned int length){
if(length < JMP_BIG_LENGTH)
return false;
DWORD oldProtect;
VirtualProtect(src, length, PAGE_READWRITE, &oldProtect);
int offset = 0;
*(short*)(src + offset) = MOV_R11_BYTES;
offset += 2;
*(DWORD64*)(src + offset) = (DWORD64)dst;
offset += sizeof(DWORD64);
*(short*)(src + offset) = PUSH_R11_BYTE;
offset += 2;
*(char*)(src + offset) = RET_BYTE;
offset += 1;
VirtualProtect(src, length, oldProtect, &oldProtect);
return true;
}
void writeNoWorkingX64Jump(BYTE* src, BYTE* dst, void** ret, const unsigned int length)
{
if(length < JMP_SMALL_LENGTH){
*ret = NULL;
return;
}
const int totalLength = 13 + length + 13;
//
BYTE* trampoline = (BYTE*)malloc(totalLength);
DWORD dwOldProt;
BYTE* smallTrampoline = (BYTE*)VirtualAlloc((void*)src, JMP_BIG_LENGTH, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
DWORD difference = (DWORD)((DWORD64)smallTrampoline - (DWORD64)src);
if(difference > (DWORD)0xFFFFFFFF)
MessageBox(0, "memory to far: DETOUR", 0,0);
if(((DWORD64)trampoline & (DWORD64)smallTrampoline) == NULL){
*ret = NULL;
return;
}
//JMP to Hook
//////////////////////////////////////////////////////////////
writeBigJump(smallTrampoline, trampoline, JMP_BIG_LENGTH);
writeBigJump(trampoline, dst, JMP_BIG_LENGTH);
//////////////////////////////////////////////////////////////
trampoline+=JMP_BIG_LENGTH;
*ret = trampoline;
//Save code
memcpy(trampoline, (void*)src, length);
trampoline += length;
/////////////////////////////////
writeBigJump(trampoline, src+length, JMP_BIG_LENGTH);
writeSmallJump(src, smallTrampoline, length);
for(int i = 12; i < length; i++)
src[i] = 0x90;
}