我想写一个 C 函数,这样hex-rays
反编译器就会失败。我想这样做是为了学习目的,而不是为了实际的反逆转方法。你有什么建议/方法我怎么能写这样一个函数,它将用gcc
或类似的编译器编译,但不会被反编译hex-rays
?
编辑: 我的目标是使代码可反汇编,但不可反编译。我不是在寻找可以完全隐藏代码的混淆器,而是一种使 IDA 无法反编译的方法。例如,通过某种方式弄乱堆栈指针。
我想写一个 C 函数,这样hex-rays
反编译器就会失败。我想这样做是为了学习目的,而不是为了实际的反逆转方法。你有什么建议/方法我怎么能写这样一个函数,它将用gcc
或类似的编译器编译,但不会被反编译hex-rays
?
编辑: 我的目标是使代码可反汇编,但不可反编译。我不是在寻找可以完全隐藏代码的混淆器,而是一种使 IDA 无法反编译的方法。例如,通过某种方式弄乱堆栈指针。
您可以检查“优雅失败”以查找一些可以阻止反编译的常见问题,并尝试故意诱导它们。然而,他们中的大多数都可以通过一些努力来解决,所以不要指望他们阻止一个有上进心的人。
@igor 的回答说的是 IDA 的算法失败。此外,我认为您可以使用在 IDA 的反编译目标语言的类型系统中无法输入的函数(我相信它是 C 的子集),例如
int foo(void *f, int i) {
return ((int (*)(void*, int))(f))(foo, i);
}
clang -c test.c
然后 IDA 反编译器给出了类似的东西
__int64 __fastcall foo(__int64 (__fastcall *a1)(__int64 (__fastcall *)(), _QWORD), unsigned int a2)
{
return a1(foo, a2);
}
这显然是不正确的:foo
同时被识别为两个参数和一个参数的函数。