linux c++源代码,如何隐藏源代码中的常量字符串?使得通过反汇编难以获取到此字符串。 不使用加壳。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux c++源代码,如何隐藏源代码中的常量字符串?使得通过反汇编难以获取到此字符串。 不使用加壳。相关的知识,希望对你有一定的参考价值。
首先,要对这个常量字符串进行加密。然后,加密用的密码(密钥)需要进行特殊处理。
比如:要保护字符串123456,用密钥13579进行加密。
密钥13579的16进制数组形式为:0x31, 0x33, 0x35, 0x37, 0x39, 0x00
你可以对这个数组进行数据干扰。比如:高位乱填数据(因为你知道是3),低位都加/减某数值:
变为了: 0xA3, 0xF5, 0x67, 0xD9, 0x3A, 0x00
你在代码中对每一位进行恢复:
*p &= 0x0F, *p |= 0x30, *p -= 0x02,如此得到你的原始密码:13579;
反汇编看到的你的密钥串为:0xA3, 0xF5, 0x67, 0xD9, 0x3A, 0x00。
不知道你思路的话,只能碰运气猜啦。
在上面两种干扰方法基础上,你甚至还可以把高低位调换,这样就又加了一层干扰信息。
别人想破解也得好好猜一会了。 参考技术A 其实也可以
常量字符串
分成好几个小字符
代码混乱后拼起来
再 添加几个 干扰的 无意义 的字符 也在代码中跑 但不去干扰正常数据就可以 参考技术B 将字符串转成Byte数组,然后对这个二进制数据进行加密。然后在程序里使用的时候再解密,这样反汇编的时候就不会直接看到内容了。追问
加密使用的密码不还是存在同样的难题?
追答不可能做到完全安全。只需要在一定程序上安全就可以了。往往是破解者觉得破解太过麻烦而不去破解。
追问我的意思是:加密使用的密码也是常量字符串;也需要隐藏;
不同平台上比较方法中的 C++ 常量引用
【中文标题】不同平台上比较方法中的 C++ 常量引用【英文标题】:C++ constant reference in compare method on different platforms 【发布时间】:2015-12-15 19:46:20 【问题描述】:我有这段用于对结构进行排序的 c++ 代码,
const bool operator<(P& p) const
//...
它在带有“gcc 4.9.2”的 linux 设备上编译没有任何问题。 但是,如果在带有“gcc 4.7.1”(Code::Blocks 13.12 附带的那个)的 Windows 机器上尝试它,它会产生令人讨厌的错误,您可以在此处看到 http://pastebin.com/S28tD9kc
在这两种情况下我都使用了编译:“g++ -std=c++11”
如果我将“operator
一个example。
【问题讨论】:
应该是const bool operator<(P const & p) const
顺便说一句,您可以并且应该将更高版本的 gcc 与 C::B 一起使用。
@M.M 不需要const bool
,你走得太远了。
@MarkRansom 没有实际意义,它损害了可读性,但仅此而已
我不知道为什么这会吸引反对票,这似乎是一个合理的问题。
【参考方案1】:
这可能是因为在那些 gcc 版本中,排序的实现方式不同。我在 VS2005 下检查过,它也产生了这样的错误,但是从我的 stl 实现来看 - 我看到排序时使用了很多 const T&
参数。如果在没有 const& 参数的情况下使用 operator
struct my_comp
bool operator() (const P& a, const P& b) const
return const_cast<P&>(a).operator<(const_cast<P&>(b));
;
std::vector<P> pp(10);
std::sort(pp.begin(), pp.end(), my_comp());
我不确定这是否是正确的代码,只是为了编译实验而写的。
另一方面,在 Visual Studio 2015 下,使用 operator
【讨论】:
以上是关于linux c++源代码,如何隐藏源代码中的常量字符串?使得通过反汇编难以获取到此字符串。 不使用加壳。的主要内容,如果未能解决你的问题,请参考以下文章