15 const size_t instr_size = 2;
19 BYTE *lval =
reinterpret_cast<BYTE*
>((ULONG_PTR)patch_ptr + 1);
28 const size_t instr_size = 5;
32 DWORD *lval =
reinterpret_cast<DWORD*
>((ULONG_PTR) patch_ptr + 1);
56 size_t mov_instr_len = is_long ? 9 : 5;
57 if (!peconv::validate_ptr(this->
patchedCode, this->
codeSize, patch_ptr, mov_instr_len + 2)) {
61 BYTE* jmp_ptr = patch_ptr + mov_instr_len;
68 DWORD reg_id0 = patch_ptr[0] - 0xB8;
79 if (jmp_ptr[0] == 0xFF && jmp_ptr[1] >= 0xE0 && jmp_ptr[1] <= 0xEF ) {
81 reg_id1 = jmp_ptr[1] - 0xE0;
82 }
else if (jmp_ptr[0] == 0xFF && jmp_ptr[1] >= 0xD0 && jmp_ptr[1] <= 0xDF ) {
84 reg_id1 = jmp_ptr[1] - 0xD0;
87 std::cerr <<
"It is not MOV->JMP" << std::hex << (DWORD)jmp_ptr[0] << std::endl;
92 if (reg_id1 != reg_id0) {
94 std::cerr <<
"MOV->JMP : reg mismatch" << std::endl;
98 size_t patch_size = mov_instr_len;
101 DWORD *lval =
reinterpret_cast<DWORD*
>((ULONG_PTR) patch_ptr + 1);
104 ULONGLONG *lval =
reinterpret_cast<ULONGLONG*
>((ULONG_PTR) patch_ptr + 1);
110 std::cout <<
"----> Target: " << std::hex << addr << std::endl;
151 BYTE op = patch_ptr[0];
153 return parseJmp(patch, patch_ptr, patch_va);
165 bool is_long =
false;
173 if (op >= 0xB8 && op <= 0xBF) {
225 BYTE* patch_ptr = this->
patchedCode + patch_offset;
231 const size_t kMinSize = 3;
236 if (size == 0 && patch_offset > 0) {