@system bool
writeAbsJump(void*
where, void*
target);
64bit絶対ジャンプの書き込み
where の機械語先頭5バイトを書き換えて
target へジャンプする。
mov rax, imm64 (0x48 0xB8 imm64) ;
jmp rax (0xFF 0xE0) ;
| void* where |
書き換える関数の先頭アドレス |
| void* target |
書き換えた関数からジャンプさせる関数の先頭アドレス |
成功したらtrue, 失敗でfalse
bool
writeRelJump(void*
where, void*
target);
32bit相対ジャンプの書き込み
where の機械語先頭5バイトを書き換えて
target へジャンプする
jmp rel32 (0xE9 rel32) ;
| void* where |
書き換える関数の先頭アドレス |
| void* target |
書き換えた関数からジャンプさせる関数の先頭アドレス |
成功したらtrue, 失敗でfalse
bool
writeAbsJmp32(void*
where, void*
target);
単純ジャンプ版トランポリン作成
bool
createTrampoline64(void*
original, size_t
stolen, ubyte[]
tramp);
トランポリン作成
original の先頭 stolen をコピーし、コピー末尾に戻りジャンプ (original + stolen) を付加する
bool
createTrampoline32(void*
original, size_t
stolen, ubyte[]
tramp);
トランポリン作成32bit版
original の先頭 stolen をコピーし、コピー末尾に戻りジャンプ (original + stolen) を付加する
bool
createTrampoline32Jmp(void*
jmpTo, ubyte[]
tramp);
bool
createTrampoline64Jmp(void*
jmpTo, ubyte[]
tramp);
単純ジャンプ版トランポリン作成
original の先頭 stolen をコピーし、コピー末尾に戻りジャンプ (original + stolen) を付加する
bool
createTrampoline64Ret(void*
original, size_t
stolen, ubyte[]
tramp);
最終値がRETのトランポリン作成
Stolen
determineStolenBytes(void*
funcAddr, size_t
maxRequiredLen = 12);
Capstone で命令長を解析し、上書きすべきバイト数を決定する
| void* funcAddr |
address of original code |
| size_t maxRequiredLen |
minimum bytes to cover |
ret.size == 0 の場合は失敗