C++ 源码常量加密,防逆向破解小技巧

本文介绍如何利用C++14的新特性在编译时对常量进行加密,通过自定义宏和类构造/析构实现,以增强代码安全性,避免逆向分析。注意递归和循环可能导致编译问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

        做为个一个c++的搬砖猿,我很早之前就有一个想法。企图在c++代码编译时能够部分干预C++的编译过程,比如类似宏一样的行为,或者模板类的行为。在编译时才存在的一些代码或信息。而c++14 则提供了这样的特性。

实际效果

        

 代码如下:

int main()
{

	printf("%s\r\n", ET("1234567890"));


	printf("%s\r\n", ("9876543210"));


	system("pause");
}

        我们可以十分清除地看到,第一个字符串我使用了一个我自定义的宏ET()。而第二个printf我们像平常一样使用字符串常量。

        但是最后编译的程序中可以直接查找到 "9876543210" 这样的常量,而却无法找到"1234567890" 这样的常量,使用该特性可以十分方便地加密一些常量,从而避免一些常见的字符串入手的逆向分析。

        该办法也十分简单,利用类的构造和析构,以及编译时有效的一些变量(编译后以常量存在)即可实现。

后记

        该篇的重点不在于使用宏或模板实现常量加密,而在于使用c++的特性,以及了解编译和机器码生成过程的一些知识,这在开发中可以实现很多意想不到的功能。

        但该特性也存在很大的局限,可能是由于编译时需要模拟代码执行计算出常量,该方法尽量不使用递归或循环,否则程序编译会极大概率失败,且计算次数过多,编译器会放弃生成编译时常量,而让其编译成为正常的目标代码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值