1

我正在尝试制作一个自我修改的代码库,但我已经满脑子都是,我有以下代码:

typedef int (*FUNC) (void);
int test();

JNIEXPORT int Java_com_example_untitled_MyActivity_decrypt( JNIEnv* env, jobject thiz)
{
    void *code = mmap(NULL, 4, PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

    if (code != MAP_FAILED) {
        memcpy(code, test, 4);

        return ( (FUNC)code)();
    }

    return 0;
}

int test()
{
    return 100;
}

请帮助...我在Android上使用本机自修改代码作为我的起点,他们说了一些关于使用“-marm”和拇指位编译的内容...

我遇到的问题是,它只是崩溃了。我试过使用 cacheflush 功能,似乎没有帮助。我很茫然。

4

1 回答 1

0

在 ARM 上,您需要刷新 CPU 缓存,以确保您刚刚复制的指令在执行之前对 CPU 是可见的。一个简单的方法是:

#include <unistd.h>  // for cacheflush()

...

// Copy the instructions to the destination address.
memcpy(dest, original_intructions, size_of_instructions);

// Clear the CPU cache
cacheflush((uintptr_t)dest, (uintptr_t)dest + size_of_instructions, 0);

// Run them.
return ((FUNC)dest)();
于 2014-01-17T16:12:14.117 回答