Android自修改代码 - NDK

时间:2014-01-17 01:04:21

标签: android android-ndk self-modifying

我正在尝试创建一个自我修改的代码库,并且我已经全部了解并且我有以下代码:

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;
}

请帮忙......我用Native self-modifying code on Android作为我的起点,他们说了一些关于用“-marm”和拇指位进行编译的事情......

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

1 个答案:

答案 0 :(得分: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)();