做为个一个c++的搬砖猿,我很早之前就有一个想法。企图在c++代码编译时能够部分干预C++的编译过程,比如类似宏一样的行为,或者模板类的行为。在编译时才存在的一些代码或信息。而c++14 则提供了这样的特性。
实际效果
代码如下:
int main() { printf("%srn", ET("1234567890")); printf("%srn", ("9876543210")); system("pause"); }
我们可以十分清除地看到,第一个字符串我使用了一个我自定义的宏ET()。而第二个printf我们像平常一样使用字符串常量。
但是最后编译的程序中可以直接查找到 "9876543210" 这样的常量,而却无法找到"1234567890" 这样的常量,使用该特性可以十分方便地加密一些常量,从而避免一些常见的字符串入手的逆向分析。
该办法也十分简单,利用类的构造和析构,以及编译时有效的一些变量(编译后以常量存在)即可实现。
后记该篇的重点不在于使用宏或模板实现常量加密,而在于使用c++的特性,以及了解编译和机器码生成过程的一些知识,这在开发中可以实现很多意想不到的功能。
但该特性也存在很大的局限,可能是由于编译时需要模拟代码执行计算出常量,该方法尽量不使用递归或循环,否则程序编译会极大概率失败,且计算次数过多,编译器会放弃生成编译时常量,而让其编译成为正常的目标代码。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)