【发布时间】:2014-02-06 04:49:57
【问题描述】:
我正在尝试制作一个自我修改的代码库,我已经满脑子都是,我有以下代码:
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 功能,似乎没有帮助。我很茫然。
【问题讨论】:
-
你有什么问题?您的代码的预期行为和观察到的行为是什么? (例如,为什么你认为 test 正好是 4 个字节长?)
-
因为我对 ARM 进行了逆向工程,并且知道 mov r0,100 是 2 个字节,而 BX LR 是 2 个字节...:) 还验证了它没有使用 4 字节 mov 指令。
-
ARM 指令长度为 4 个字节...
-
不,并非总是如此。我用 IDA 检查过,它们每条指令只有 2 个字节。我对 Android 游戏进行了逆向工程,并使用 2 字节和 4 字节指令在 ARM 中修改了其中的 100 多个。
-
对我来说听起来像 Thumb,而不是 ARM。要从 Thumb 调用到 ARM,或从 ARM 到 Thumb,需要进行指令集交换(BLX 而不是 BL)。一个两字节的 BX LR 指令是从 thumb code 到 ARM 的返回;但是调用者需要知道通过模式更改来调用(或者只是坚持使用 ARM 并使其变得简单)。
标签: android android-ndk self-modifying