C:混淆整数

C:混淆整数,c,integer,obfuscation,C,Integer,Obfuscation,如果我在代码中的几个地方有一个这样的整数 int my_secret = 42; 。。。是否有可能使在编译程序中查找该整数变得更加困难?我见过用字符串来实现这一点,例如,将每个字母移动x个字符,然后在运行时取消移动,但我怀疑这种技术是否适用于数字。这永远不起作用。秘钥永远不应该,永远不应该在代码中。在运行时创建它们是可行的。模糊处理确实很吸引人。您可以通过在两个变量之间拆分该值来实现这一点。例如: volatile int my_secret_1 = 20; volatile int my_s

如果我在代码中的几个地方有一个这样的整数

int my_secret = 42;

。。。是否有可能使在编译程序中查找该整数变得更加困难?我见过用字符串来实现这一点,例如,将每个字母移动x个字符,然后在运行时取消移动,但我怀疑这种技术是否适用于数字。

这永远不起作用。秘钥永远不应该,永远不应该在代码中。在运行时创建它们是可行的。模糊处理确实很吸引人。

您可以通过在两个变量之间拆分该值来实现这一点。例如:

volatile int my_secret_1 = 20;
volatile int my_secret_2 = 22;
然后用我的秘密1+我的秘密2代替我的秘密


之所以需要volatile关键字,是因为大多数(如果不是全部的话)c编译器都会对其进行优化。无论如何,最好看看编译器生成了什么汇编代码。

您可以在运行时通过一些编译器无法优化的函数进行计算,例如使用数字的平方,然后通过数学库函数取平方根

当然,问题是,这些东西都不能阻止一个有决心的人

也可以说你真的不需要麻烦。混淆字符串很有意义,因为有很多易于使用的工具可以从exe中转储字符串。但是,您的42将被编码为二进制数。整个exe只是一个长序列的二进制数,没有一个简单的工具来搜索42。您必须反汇编exe并理解程序集。无论你做什么,任何一个将要经历那么多麻烦的人都可能算出这个数字


因此,简短的回答是,不要费心了,它已经足够模糊,可以随意使用。

哈桑评论中的第一个问题是关键问题。这取决于你保守的秘密是什么,为什么,以及有多少工作是值得的。一般来说,对正在使用(在某一点上)将这些值组合在一起的程序的人隐藏某些内容是不可能永远做到的。然而,你可以让攻击者更难对付

接下来的问题是,为了让攻击者更难,您需要做多少工作。然后,您可以执行任何操作,从代码混淆(不太安全,但可能会阻止非常随意的攻击者,而且操作相对容易,特别是因为可以对原始源代码进行注释)到完全加密和一些用于复制保护的“黑盒”类型方法(尽管这些最终都是可以破解的)如果这足够关键,那么将其作为web服务的一部分提供,代码不会传递给最终用户。即使这样,也不总是故障安全的


那么,您希望自己的秘密保密到什么程度?您愿意投入多少精力来保持它?

在程序中确实没有办法只隐藏一个整数,因为有人可以通过调试程序来确定它的最终值


您最好使用一些自动模糊器来模糊整个例程/程序。

如何使用这些程序

int secret = ~42;
printf("%0X %0x" , secret , ~secret );
印刷品

FFFFFFD5 42
编辑:或使用宏

#define OBFUSCATE(X) (~(X)^0xdeadbeef)

int secret = OBFUSCATE( 42 );
printf("%0X %d" , secret ,OBFUSCATE( secret ));

2152413A 42

没有办法对坚定的攻击者完全隐藏这些秘密,但有办法提高门槛(有时这可能既是一种威慑,也是一种临时措施)

实现这一点的最简单方法是应用像XOR这样的一次性焊盘

int pad = 322;
int secret = 360;
int value = pad ^ secret; // This is 42
您可以添加此类一次性焊盘的组合,以及模糊加密函数,以使攻击者更难找到值

请注意,尽管这使得攻击者更难通过查看编译后的代码来派生密钥,但他们仍然可以将调试器附加到正在运行的进程,并将计算出的密钥直接从内存中取出。事实上,有些调试器(如IDA pro)使类似的内容变得微不足道

您还必须担心操作系统在计算完密钥后将其分页到磁盘,这可以非常简单地提取出来(使用类似mlock()的方法将页面锁定到内存可以帮助您完成这项工作)


无论如何,这是一个非常棘手的问题,许多软件作者都在努力实现非侵入性(例如,没有通过网络验证密钥)许可证方案。

隐藏在另一个数字基中表示其价值。参见和的示例。我听说有人使用自修改代码进行混淆。正如其他人所说,有足够的决心仍然可以破解它,但如果他们甚至看不到最终的代码被反汇编或修改,那么潜在攻击者的日子会更难过在其中设置断点。(设置断点相当于用
INT 3
指令替换一个字节的内存;如果该内存作为自修改代码操作的一部分被修改,断点将消失,可能会损坏那里的指令并带来更多乐趣。)


仍然可以在调试器中单步执行代码。为了部分抵消这一点,您可以偶尔进行测试,并引导攻击者进行白费力气的追逐(如果是这样)。当然,这也可以抵消,例如,通过DLL填充,甚至在必要时创建低级设备驱动程序。

您可以尝试它们提供一种隐藏的方法编译期间的值类型。

您对这个整数的保护程度如何?您保护它的对象是谁?通常我会建议使用42进行XORing,但我认为这可能是多余的,在这种情况下,我不需要它非常安全,只需足以阻止一个偶然的盗版。相关:xor eax,eax…是的,我见过很多次使用它:p+1。我同意。另外,一个坚定的逆向工程师无论如何都会解决这个问题。“在运行时创建它们是可行的。”你能澄清一下吗?我意识到模糊处理是一个糟糕的长期解决方案,但我只需要这一点来减缓破解过程。虽然我同意模糊处理几乎从定义上讲并不意味着不可能发现abo