这可能听起来很奇怪,但出于混淆的目的,我想知道是否有一种方法可以在我的应用程序中创建一个类的多个实例,但不是重复使用相同的底层代码,编译器将为该类创建完全独立的代码块。对类的内联排序。
这需要在Xcode和Visual Studio中使用。
这样做的原因,并且公平地说,这是一个我只是在玩的想法...我正在寻找另一个级别来减缓黑客攻击我的许可证代码。通常情况下,无论您如何努力防止代码破解,最终都会出现一个代码返回真假的地方....此许可是否有效?如果黑客发现这一点,那么它就是一个简单的补丁。我的想法是尝试在我的应用程序中放置许可证代码,特别是相同的许可证类别...其中许多...并随时检查其中任何一个。如果它做得好,黑客可能必须找到其中的10个......不知道在我的应用程序中有20个真正的东西。所有这些都取决于编写一个类,但它不能是同一个重用的类代码......它们需要全部分开。
有什么想法吗?
答案 0 :(得分:2)
这是一个尝试/概念证明。我已经起草了一个课程:
应该意识到这一切都很棘手,因为允许编译器对保留可观察行为的代码进行任何转换。因此,仅使用带有param的模板,将产生两种不同的类型语言,但生成的代码可以重用于两者。
我不确定有经验的黑客是否会对代码得出任何结论,甚至是否会复制许可证检查代码本身。这是可能的。下面的代码显示method
有两个出现,其中一个是循环,另一个是展开,请参见godbolt装配线108-113和134-142。
话虽如此,通常优化是一个很好的混淆器。也许有时甚至比手工操作更好。
这是一种开始的方式。通常constexpr
和模板在这种情况下是我们的朋友,因为它们是在编译时处理的,我们需要确保生成唯一的东西。人们可能会尝试一些constexpr
哈希等等。
代码:
#include <string>
#include <iostream>
using std::string;
using std::cout;
template<int N>
struct B {
constexpr B() : arr() {
for (auto i = 0; i != N; ++i)
arr[i] = i;
}
int arr[N];
};
template<int Randomizer = 42>
struct A{
string a{"data_a"}; // probably all member should be templated by Randomizer
B<Randomizer> padding;
string b{"data_b"};
void method() {
cout << a << "\n";
for(int i = 0; i<Randomizer; i++) {
cout << padding.arr[i]; // harmless side effect
}
cout << "\n" << b << "\n";
}
};
int main () {
A<> i1;
A<3> i2;
i1.method();
i2.method();
return 0;
}