我正在尝试创建一个自我修改的代码库,并且我已经全部了解并且我有以下代码:
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功能,似乎没有帮助。我很茫然。
答案 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)();