写入跳转到内存

时间:2016-11-26 03:30:07

标签: c++ detours

我试图写一个跳转到记忆中,我似乎无法找到可以解释它是如何工作的任何地方。

        Session session = instances.getCqlSession();
        PreparedStatement statement = session.prepare("DELETE FROM ks_mobApp.messages WHERE pair_id = ? AND belong_to = ? AND message_id = ?;");
        Iterator<String> iterator = msgId.iterator();
        while(iterator.hasNext()) {
            try {
                session.executeAsync(statement.bind(pairId, currentUser.value("userId"), UUID.fromString(iterator.next())));
            } catch(Exception ex) {

            }
        }

我的主要问题是我不明白:如何将asm JMP 0x7FE12345678转换为E9 XX XX XX XX,以便我可以在hookAddr中编写。

进程是64位。

2 个答案:

答案 0 :(得分:2)

这是它在32位程序上常用的方式(不确定64位有多少不同),但这应该可以让你知道去哪里。这是因为VirtualProtect而特定于Windows,但如果您使用的是Linux,则可以使用mprotect

#include <stdio.h>
#include <windows.h>

void foo() {
    printf("Foo!");
}

void my_foo() {
    printf("My foo!");
}

int setJMP(void *from, void *to) {
    DWORD protection;
    if (!VirtualProtect(from, 5, PAGE_EXECUTE_READWRITE, &protection)) { // We must be able to write to it (don't necessarily need execute and read)
        return 0;
    }

    *(char *)from = 0xE9; // jmp opcode
    *(int *)(from + 1) = (int)(to - from - 5); // relative addr

    return VirtualProtect(from, 5, protection, &protection); // Restore original protection
}

int main() {
    setJMP(foo, my_foo);
    foo(); // outputs "My foo!"

    return 0;
}

答案 1 :(得分:0)

我建议使用汇编程序生成正确的字节。只需创建以下文件并通过NASM运行:

BITS 64
JUMP 0x7fe1234

结果是:

2f e9 fe 12 00 07(由于LE字节顺序)。这是一个相对跳跃,因此很难从高级代码生成。您可能希望使用操作码EA来执行绝对跳转。然后,您只需使用要跳转的位置的绝对地址。