@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 の場合は失敗