dinst.patch

@system bool writeAbsJump(void* where, void* target);
64bit絶対ジャンプの書き込み
where の機械語先頭5バイトを書き換えて target へジャンプする。
     mov rax, imm64  (0x48 0xB8 imm64) ;
     jmp rax         (0xFF 0xE0) ;
Parameters:
void* where 書き換える関数の先頭アドレス
void* target 書き換えた関数からジャンプさせる関数の先頭アドレス
Returns: 成功したらtrue, 失敗でfalse
bool writeRelJump(void* where, void* target);
32bit相対ジャンプの書き込み
where の機械語先頭5バイトを書き換えて target へジャンプする
     jmp rel32  (0xE9 rel32) ;
Parameters:
void* where 書き換える関数の先頭アドレス
void* target 書き換えた関数からジャンプさせる関数の先頭アドレス
Returns: 成功したら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のトランポリン作成
struct Stolen;
size_t size;
bool isJmp;
bool isRet;
void* addr;
Stolen determineStolenBytes(void* funcAddr, size_t maxRequiredLen = 12);
Capstone で命令長を解析し、上書きすべきバイト数を決定する
Parameters:
void* funcAddr address of original code
size_t maxRequiredLen minimum bytes to cover
Returns: ret.size == 0 の場合は失敗