首页 文章

保护可执行文件免受逆向工程?

提问于
浏览
198

我一直在考虑如何保护我的C / C代码免于反汇编和逆向工程 . 通常我永远不会在我的代码中宽恕这种行为;但是,为了各种人的安全,我一直在努力的现行协议绝不能被检查或理解 .

现在这对我来说是一个新的主题,互联网并不是真正有效防范逆向工程,而是描绘了大量有关如何逆向工程的信息

到目前为止我想到的一些事情是:

  • 代码注入(在实际函数调用之前和之后调用虚函数)

  • 代码obfustication(破坏二进制文件的反汇编)

  • 编写我自己的启动例程(调试器更难绑定)

void startup();  
int _start()   
{  
    startup( );  
    exit   (0)   
}  
void startup()  
{  
    /* code here */  
}
  • 运行时检查调试器(如果检测到则强制退出)

  • 功能蹦床

void trampoline(void (*fnptr)(), bool ping = false)  
 {  
   if(ping)  
     fnptr();  
   else  
     trampoline(fnptr, true);  
 }
  • 无意义的分配和解除分配(堆栈变化很多)

  • 无意义的虚拟调用和蹦床(在反汇编输出中跳转吨数)

  • 大量铸造(用于混淆反汇编)

我的意思是这些是我想到过的一些事情,但是在适当的时间范围内,它们都可以被代码分析师解决或者解决 . 我还有别的选择吗?

24 回答

  • 4

    要了解情况,请阅读 code obfuscation 上的学术文献 . 亚利桑那大学的Christian Collberg是该领域着名的学者;哈佛大学的Salil Vadhan也做了一些很好的工作 .

    我知道你不能阻止攻击者看到你将要执行的代码,但你可以使用未执行的代码包围它,并且它需要花费一个攻击者指数时间(使用最熟知的技术)来发现您的代码的哪些片段被执行,哪些不是 .

  • 2

    FIRST THING TO REMEMBER ABOUT HIDING YOUR CODE :并非所有代码都需要隐藏 .

    THE END GOAL :我对大多数软件程序的最终目标是能够销售不同的许可证,这些许可证可以打开和关闭程序中的特定功能 .

    BEST TECHNIQUE :我发现在像WordPress提供的钩子和过滤器系统中构建,是试图混淆对手时绝对最好的方法 . 这允许您加密某些触发器关联,而无需实际加密代码 .

    这样做的原因是因为您需要加密尽可能少的代码 .

    KNOW YOUR CRACKERS :知道这一点:破解代码的主要原因不是因为恶意分发许可,它真的需要分发免费副本 .

    GETTING STARTED :抛开你要加密的少量代码,其余的代码应该尝试并塞进一个文件中以增加复杂性和理解力 .

    PREPARING TO ENCRYPT :您_1114360_也将是一个非常复杂的过程,因此构建另一个负责加密过程的程序 .

    STEP ONE :使用base64名称对所有内容进行模糊处理 . 完成后,将64位混淆代码保存到临时文件中,该文件稍后将用于解密和运行此代码 . 合理?

    我会重复,因为你会一次又一次地这样做 . 您将创建一个base64字符串并将其另存为另一个文件作为将被解密和呈现的变量 .

    STEP TWO :您将在此临时文件中读取并对其进行模糊处理,然后对其进行base64并将其保存到第二个临时文件中,该文件将用于解密并为最终用户呈现 .

    STEP THREE :根据需要重复第二步 . 一旦你在没有解密错误的情况下正常工作,那么你将要开始为你的对手开辟地雷 .

    LAND MINE ONE :你被告知绝对的秘密 . 因此,为第2层构建一个破解者尝试安全警告邮件系统 . 如果出现任何问题,这将被解雇,让您了解有关对手的具体信息 .

    LAND MINE TWO :依赖关系 . 你不是在场,或是其他层 .

    我相信你可以拿出自己的地雷,玩得开心 .

    THING TO REMEMBER :您实际上可以加密代码而不是base64 . 这样一个简单的base64就不会解密程序 .

    REWARD :请记住,这实际上可能是你和你的对手之间的共生关系 . 我总是在第一层发表评论,评论祝贺破解者并给他们一个促销代码,以便从中获得现金奖励 .

    使现金奖励显着,不涉及任何偏见 . 我通常会说500美元 . 如果你的家伙是第一个破解密码的人,那就给他钱,然后成为他的朋友 . 如果他是你的朋友,他不会分发你的软件 . 问他是怎么做到的,以及你如何改进!

    祝好运!

  • 3

    为了能够选择正确的选项,您应该考虑以下几个方面:

    • "new users"可能不想付款而是使用你的软件吗?

    • 是否可能存在客户需要的许可证比他们多吗?

    • 潜在用户愿意支付多少钱?

    • 您是否想为每个用户/并发用户/工作站/公司提供许可证?

    • 您的软件是否需要培训/定制才有用?

    如果问题5的答案是“是”,那么不要担心非法复制 . 无论如何它们都没用 .

    如果问题1的答案是“是”,那么首先考虑定价(见问题3) .

    如果您回答问题2“是”,那么“按使用付费”模式可能适合您 .

    根据我的经验,按使用付费的定制和培训是对您的软件的最佳保护,因为:

    • 新用户被定价模式所吸引(少量使用 - >小工资)

    • 几乎没有"anonymous users",因为他们需要培训和定制 .

    • 没有软件限制可以吓跑潜在客户 .

    • 现有客户持续不断的资金流 .

    • 由于长期的业务关系,您可以从客户那里获得有 Value 的开发反馈 .

    在您考虑引入DRM或混淆之前,您可能会想到这些要点以及它们是否适用于您的软件 .

  • 3

    Amber所说的是完全正确的 . 您可以更加努力地进行逆向工程,但是您永远无法阻止它 . 你永远不应该相信"security" that relies on the prevention of reverse engineering .

    也就是说,我所见过的最好的反逆向工程技术不是专注于混淆代码,而是打破了人们通常用来理解代码如何工作的工具 . 寻找创造性的方法来打破反汇编程序,调试程序等,可能比仅仅产生大量可怕的意大利面条代码更有效,也更具智力上的满足感 . 这对阻止一个坚定的攻击者没有任何作用,但它确实增加了J Random Cracker徘徊并更轻松地开展工作的可能性 .

  • 21

    最好的反反汇编技巧,特别是在可变字长指令集上是汇编程序/机器代码,而不是C.例如

    CLC
    BCC over
    .byte 0x09
    over:
    

    反汇编程序必须解决分支目标是多字节指令中的第二个字节的问题 . 但是,指令集模拟器没有问题 . 分支到计算地址(可以从C引起)也使得反汇编变得困难 . 指令集模拟器没有任何问题 . 使用模拟器为您分拣分支目的地可以帮助您进行反汇编过程 . 对于反汇编程序,编译代码相对干净且容易 . 所以我认为需要一些装配 .

    我认为它接近迈克尔·阿布拉什的汇编语言禅的开头,他展示了一个简单的反反汇编和反调试器技巧 . 8088/6有一个预取队列,你所做的是有一条指令修改了下一条指令或前面几条指令 . 如果单步执行则执行修改后的指令,如果指令集模拟器未完全模拟硬件,则执行修改后的指令 . 在正常运行的硬件上,实际指令已经在队列中,只要你没有再次执行该指令串,修改后的内存位置就不会造成任何损坏 . 今天你可能仍然会使用这样的技巧,因为流水线处理器会获取下一条指令 . 或者,如果你知道硬件有一个单独的指令和数据缓存,你可以修改前面的字节数,如果你正确地在缓存行中对齐这个代码,修改后的字节将不会通过指令缓存而是数据缓存写入,没有适当缓存模拟器的指令集模拟器将无法正常执行 . 我认为只有软件解决方案不会让你走得太远 .

    以上是古老的,众所周知的,我不知道当前的工具,知道他们是否已经解决了这些问题 . 自修改代码可以/将使调试器绊倒,但人类可以/将缩小问题,然后查看自修改代码并解决它 .

    过去,黑客需要大约18个月才能完成某些工作,例如dvds . 现在他们平均大约2天到2周(如果有动力)(蓝光,iphone等) . 这对我来说,如果我在安全上花费超过几天,我可能会浪费我的时间 . 您将获得的唯一真正的安全性是通过硬件(例如,您的指令是加密的,只有芯片内部的处理器核心在执行之前解密,其方式是它不能暴露解密的指令) . 这可能会花费你几个月而不是几天 .

    另外,阅读凯文米特尼克的书“欺骗的艺术” . 像这样的人可以拿起电话让你或同事向系统分发秘密,认为它是公司另一部分的经理或其他同事或硬件工程师 . 而且你的安全受到了打击 . 安全不仅仅是管理技术,还要管理技术人类也是 .

  • 170

    没有骰子,你无法保护你的代码免于反汇编 . 您可以做的是为业务逻辑设置服务器,并使用webservice为您的应用程序提供服务 . 当然,这种情况并非总是可行 .

  • 21

    通过默默无闻的安全措施不起作用,因为人们比我们两个人更聪明 . 如果您必须保护客户的通信协议,那么您在道德上有义务使用公开的最佳代码并由专家进行全面审查 .

    这适用于人们可以检查代码的情况 . 如果您的应用程序要在嵌入式微处理器上运行,您可以选择具有密封功能的应用程序,这使得无法检查代码或观察运行时的当前使用情况等多个简单参数 . (除了通过硬件入侵技术,您可以小心地拆除芯片并使用先进的设备来检查各个晶体管上的电流 . )

    我是x86的逆向工程汇编程序的作者 . 如果你准备好冷惊,请告诉我你最好的努力结果 . (通过我的网站与我联系 . )我在答案中看到的很少,这对我来说是一个很大的障碍 . 如果您想了解复杂的逆向工程代码的工作原理,您应该真正研究具有逆向工程挑战的网站 .

    您的问题可以使用一些澄清 . 如果计算机代码适合逆向工程,您如何期望保密协议?如果我的协议是发送RSA加密消息(甚至是公钥),你通过保密协议获得了什么?出于所有实际目的,检查员将面临一系列随机比特 .

    Groetjes Albert

  • 11

    如果有人想花时间扭转你的二进制文件,那么你绝对没有办法阻止它们 . 如果中等程度更难,你就可以做到,但这就是它 . 如果您真的想了解这一点,那么请获取http://www.hex-rays.com/idapro/的副本并反汇编一些二进制文件 .

    CPU需要执行代码的事实是你的撤销 . CPU只执行机器代码......程序员可以读取机器代码 .

    话虽如此......你可能有另一个问题可以用另一种方式解决 . 你想保护什么?根据您的问题,您可以使用加密来保护您的产品 .

  • 3

    正如许多人已经说过的那样:在常规CPU上你无法阻止他们这样做,你可以耽误它们 . 正如我的老加密老师告诉我的那样:你不需要完美的加密,打破代码必须比收益更贵 . 同样适用于你的混淆 .

    但另外3个笔记:

    • 有可能使逆向工程无法实现(这是一个非常大的但是),你不能在传统的cpu上做到这一点 . 我也做了很多硬件开发,经常使用FPGA . 例如 . Virtex 5 FX上有一个PowerPC CPU,您可以使用APU在硬件中实现自己的CPU操作码 . 您可以使用此工具真正解密PowerPC的incstuctions,外部或其他软件无法访问,甚至可以在硬件中执行命令 . 由于FPGA已为其配置比特流内置AES加密,因此您无法对其进行逆向工程(除非有人设法破坏AES,但我猜我们还有其他问题......) . 这种硬件IP供应商也可以保护他们的工作 .

    • 你说的是协议 . 你不会说它是什么类型的协议,但是当它是一个网络协议时,你至少应该保护它免受网络嗅探 . 这确实可以通过加密来实现 . 但是,如果您想要保护软件所有者的加密/解密,您就会回到混淆状态 .

    • 确保你的程序不可判坏/不可用 . 尝试使用某种类型的调试检测并应用它,例如在某些公式中或者将调试寄存器内容添加到魔术常量 . 如果你的程序在调试模式下运行它是否运行正常,但是完全错误的计算,操作或其他一些更难 . 例如 . 我知道一些生态游戏,有一个非常讨厌的复制保护(我知道你不想要copyprotection,但它是相似的):被盗版本在30分钟的游戏后改变了开采的资源,突然你只得到一个资源 . 海盗刚刚破解它(即逆向工程) - 检查它是否运行,并且volia释放它 . 这种轻微的行为变化很难被发现,尤其是 . 如果他们没有立即出现检测,但只是延迟 .

    最后我建议:估计人们对软件进行逆向工程的收益,将其翻译成一段时间(例如使用最便宜的印度薪水)并进行逆向工程,以便花费更大的时间 .

  • 7

    有人试过CodeMorth:http://www.sourceformat.com/code-obfuscator.htm?还是Themida:http://www.oreans.com/themida_features.php

    后来看起来更有希望了 .

  • 5

    很多时候,对产品进行逆向工程的担心是错误的 . 是的,它可以进行逆向工程;但是 will it become so famous over a short period of time, that hackers will find it worth to reverse engg. it ? (对于大量的代码行,这项工作不是一个小时间活动) .

    如果它真的成为赚钱者,那么你应该已经收集了足够的资金来保护它,使用合法的方式,如 patent and/or copyrights .

    恕我直言,采取你将要采取的基本预防措施并释放它 . 如果它成为逆向工程的一个点意味着你已经做得很好,你自己会找到更好的方法来克服它 . 祝好运 .

  • 4

    但是在适当的时间范围内,它们都可以由代码分析师解决或解决 .

    如果你给人们一个他们能够运行的程序,那么他们也可以在给定足够时间的情况下对其进行逆向工程 . 这是计划的性质 . 只要二进制文件可供想要解密的人使用,就无法阻止最终的逆向工程 . 毕竟,计算机必须能够解密它才能运行它,而人类只是一台速度较慢的计算机 .

  • 12

    举个例如AES algorithm . 很多聪明人都对它进行了评估,并且"secret"部分不是算法本身 - 秘密部分是作为算法输入之一的密钥 . 使用生成的代码之外的"secret"来设计协议是一种更好的方法,而不是让代码本身保密 . 无论你做什么,代码都可以被解释,并且(理想情况下)生成的秘密只能通过大规模的蛮力方法或盗窃来危害 .

    我认为一个有趣的问题是“为什么要混淆代码?”您想让攻击者难以破解您的算法吗?为了让他们更难在代码中找到可利用的错误?你不会混淆它 .

    此外,您编写代码越混乱,您就越难找到安全漏洞 . 是的,这对黑客来说很难,但你也需要找到bug . 从现在开始,代码应该很容易维护,甚至编写清晰的代码也很难维护 . 不要让它变得更糟 .

  • 5

    我不认为任何代码是不可攻击的,但是对于想要尝试它的人来说,奖励需要很大 .

    说过你应该做的事情如下:

    • 尽可能使用最高优化级别(逆向工程不仅仅是关于获取汇编序列,还涉及理解代码并将其移植到更高级别的语言,如C) . 高度优化的代码可以是b --- h .

    • 由于没有比必要的更大的数据类型,使结构变得密集 . 在官方代码版本之间重新排列结构成员 . 结构中重新排列的位字段也是您可以使用的 .

    • 您可以检查是否存在不应更改的某些值(版权信息就是示例) . 如果字节向量包含"vwxyz",则可以使用另一个包含"abcde"的字节向量并比较差异 . 执行此操作的函数不应传递给向量的指针,而是使用在其他模块中定义的外部指针(伪C代码)"char *p1=&string1[539];"和“char p2 =&string2 [-11731]; ". That way there won't be any pointers pointing exactly at the two strings. In the comparison code you then compare for "(p1-539 i) - *(p2 11731 i)==有些 Value “ . 破解者会认为更改string1是安全的,因为似乎没有人参考它 . 将测试埋在一些意想不到的地方 .

    尝试自己破解汇编代码,看看哪些是容易的,哪些是难以做到的 . 应该提出一些想法,您可以尝试使代码更难以进行逆向工程并使调试变得更加困难 .

  • 4

    为避免逆向工程,您不得将代码提供给用户 . 也就是说,我建议使用在线应用程序...但是(因为你没有给出任何背景信息),这对您来说可能毫无意义 .

  • 19

    最近有一篇名为“Program obfuscation and one-time programs”的论文 . 如果您真的认真保护您的应用程序 . 本文总体上通过使用简单和通用的硬件来解决理论上的不可能性结果 .

    如果你不能要求额外的硬件,那么还有另一篇论文在理论上给出了最好的混淆“On best-possible obfuscation”,在所有具有相同功能和相同大小的程序中 . 然而,本文表明信息理论最佳可能意味着多项式层次结构的崩溃 .

    如果这些结果不能满足您的需求,那些论文至少应该为您提供足够的参考书目,以便参与相关文献 .

    更新:一种新的混淆概念,称为无法区分的混淆,可以减轻不可能的结果(paper)

  • 6

    Safe Net Sentinel(原阿拉丁)虽然注意事项 - 他们的API很糟糕,文档很糟糕,而且与SDK工具相比,这两者都很棒 .

    我已经使用了他们的硬件保护方法(Sentinel HASP HL)多年 . 它需要专有的USB密钥卡,作为软件的'license' . 他们的SDK会对您的可执行文件和库进行加密和混淆,并允许您将应用程序中的不同功能与刻录到密钥中的功能联系起来 . 如果许可方未提供和激活USB密钥,则软件无法解密,因此无法运行 . Key甚至使用定制的USB通信协议(在我的知识领域之外,我不是设备驱动程序),使得构建虚拟密钥变得困难,或者篡改运行时包装器和密钥之间的通信 . 他们的SDK不是非常开发人员友好,并且将添加保护与自动构建过程集成(但可能)非常痛苦 .

    在我们实施HASP HL保护之前,有7名已知的盗版者剥夺了该产品的dotfuscator'保护' . 我们在对软件进行重大更新的同时添加了HASP保护,该软件实时对视频进行了大量计算 . 从分析和基准测试中我可以看出,HASP HL保护只能将密集计算减慢约3% . 由于该软件大约在5年前发布,因此没有发现该产品的新版盗版 . 该它保护的软件在其细分市场中有很高的需求,客户知道有几个竞争对手积极尝试逆向工程(到目前为止没有成功) . 我们知道他们已经尝试向俄罗斯的一些团体寻求帮助,这些团体宣传一项服务以打破软件保护,因为各种新闻组和论坛上的许多帖子都包含了受保护产品的新版本 .

    最近我们在一个较小的项目上尝试了他们的软件许可证解决方案(HASP SL),如果您已经熟悉HL产品,那么这个项目很简单 . 它似乎工作;没有报告盗版事件,但这个产品的需求量要低得多 .

    当然,没有任何保护是完美的 . 如果某人有足够的动力并且有足够的现金来燃烧,我相信HASP提供的保护可以被规避 .

  • 6

    自2013年7月以来,人们对密码强大的混淆(以不可区分混淆的形式)重新产生了兴趣,这似乎是来自Amit Sahai的原始研究 .

    您可以在Quanta Magazine articleIEEE Spectrum article中找到一些提取的信息 .

    目前,使用这种技术所需的资源量使其不切实际,但AFAICT的共识对未来相当乐观 .

    I say this very casually, but to everyone who's used to instinctively dismiss obfuscation technology -- this is different. 如果它被证明是真正有效并且变得实用,那么这确实很重要,而且不仅仅是为了混淆 .

  • 4

    与大多数人所说的相反,基于他们的直觉和个人经验,我不认为加密安全的程序混淆被证明是不可能的 .

    这是一个完美混淆的程序语句的一个例子来证明我的观点:

    printf("1677741794\n");
    

    人们永远无法猜到它真正做的是什么

    printf("%d\n", 0xBAADF00D ^ 0xDEADBEEF);
    

    有一篇关于这个主题的有趣论文,证明了一些不可能的结果 . 它被称为"On the (Im)possibility of Obfuscating Programs" .

    尽管本文确实证明了使程序与其实现的功能无法区分的混淆是不可能的,但是以某种较弱的方式定义的混淆仍然是可能的!

  • 7

    使代码难以进行逆向工程称为代码混淆 .

    你提到的大多数技术都很容易解决 . 他们的中心是添加一些无用的代码 . 但无用的代码很容易检测和删除,为您留下一个干净的程序 .

    为了进行有效的混淆,您需要使程序的行为依赖于正在执行的无用位 . 例如,而不是这样做:

    a = useless_computation();
    a = 42;
    

    做这个:

    a = complicated_computation_that_uses_many_inputs_but_always_returns_42();
    

    或者不是这样做:

    if (running_under_a_debugger()) abort();
    a = 42;
    

    这样做(其中 running_under_a_debugger 不应该很容易识别为测试代码是否在调试器下运行的函数 - 它应该将有用的计算与调试器检测混合):

    a = 42 - running_under_a_debugger();
    

    有效的混淆不是纯粹在编译阶段可以做的事情 . 无论编译器能做什么,反编译器都可以做到 . 当然,你可以增加反编译器的负担,但它不会走得太远 . 有效的混淆技术,因为它们存在,涉及从第1天开始编写混淆源 . 使代码自我修改 . 使用从大量输入派生的计算跳转来丢弃代码 . 例如,而不是简单的调用

    some_function();
    

    这样做,你碰巧知道 some_data_structure 中位的确切预期布局:

    goto (md5sum(&some_data_structure, 42) & 0xffffffff) + MAGIC_CONSTANT;
    

    如果您认真对待混淆,请在计划中添加几个月;混淆不便宜 . 并且考虑到目前为止避免人们对代码进行逆向工程的最佳方法是使其无用,以免他们烦恼 . 这是一个简单的经济考虑因素:如果它们的 Value 高于成本,它们将进行逆向工程;但是提高成本也会增加你的成本,所以试着降低它们的 Value .

    既然我已经告诉过你 obfuscation is hard 并且价格昂贵,我会告诉你 it's not for you anyway . 你写

    为了各种人的安全,我一直在努力的现行协议绝不能被检查或理解

    这引起了一面红旗 . 这是security by obscurity,记录很差 . 如果协议的安全性取决于不知道协议的人,you've lost already .

    推荐阅读:

  • 4

    传统的逆向工程技术取决于智能代理使用反汇编程序来回答有关代码的问题的能力 . 如果您想要强大的安全性,那么您可以做一些可以阻止代理获得此类答案的事情 .

    您可以依靠停止程序(“程序X暂停吗?”)来实现这一点,这通常无法解决 . 添加难以推理的程序,使你的程序难以推理 . 构建这样的程序比拆除它们更容易 . 您还可以将代码添加到具有不同推理难度的程序中;一个很好的候选者是关于别名(“指针”)的推理程序 .

    Collberg等人有一篇论文(“制造廉价,弹性和隐身不透明构造”),讨论了这些主题,并定义了各种“不透明”谓词,这些谓词很难推理代码:

    http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.1946&rep=rep1&type=pdf

    我没有看到Collberg的特定方法应用于 生产环境 代码,特别是C或C源代码 .

    DashO Java混淆器似乎使用了类似的想法 . http://www.cs.arizona.edu/~collberg/Teaching/620/2008/Assignments/tools/DashO/

  • 2

    一开始,虚拟机中的受保护代码似乎无法进行逆向工程 . Themida Packer

    但它不再那么安全..无论你如何打包你的代码,你总是可以对任何加载的可执行文件进行内存转储,并用任何反汇编程序如IDA Pro进行反汇编 .

    IDA Pro还为C源代码转换器提供了一个漂亮的汇编代码,尽管生成的代码看起来更像是指针/地址数学混乱......如果你将它与原始数据进行比较,你可以修复所有错误并撕掉任何东西 .

  • 144

    可能你最好的选择仍然是使用虚拟化,这引入了旁路所需的另一层间接/混淆,但正如SSpoke在他的_514338中所说,这种技术也不是100%安全的 .


    关键是你不会得到最终的保护,因为没有这样的东西,如果有的话,它将不会持续很长时间,这意味着它首先不是最终的保护 .

    无论人们组装什么,都可以拆卸 .

    通常情况下(正确的)拆卸通常是(一点或多点)更难的任务,所以你的对手必须更加熟练,但你可以假设总是有这样的质量的人,这是一个安全的赌注 .

    如果你想保护REs的东西,你必须至少知道RE使用的常用技术 .

    因此,话语

    互联网并不是真正有效防范逆向工程,而是描绘了大量有关逆向工程的信息

    显示你的态度不好 . 我不是说要使用或嵌入保护你必须知道如何打破它,但明智地使用它你应该知道它的弱点和陷阱 . 你应该明白这一点 .

    (有一些软件以错误的方式使用保护的例子,实际上不存在这种保护 . 为了避免模糊地说话,我将给你一个在互联网上简要描述的例子:牛津英语词典第二版CD-ROM v4 . 你可以阅读它在以下页面中未能使用SecuROM:Oxford English Dictionary (OED) on CD-ROM in a 16-, 32-, or 64-bit Windows environment: Hard-disk installation, bugs, word processing macros, networking, fonts, and so forth

    一切都需要时间 .

    如果您是这个主题的新手并且没有几个月或几年时间来适当地使用RE的东西,那么请使用其他人提供的可用解决方案 . 这里的问题显而易见,它们已经存在,所以你已经知道它们不是100%安全,但是制作你自己的新保护只会给你一种虚假的保护感,除非你真正了解最先进的技术 . 逆向工程和保护(但至少在此刻你没有) .

    软件保护的目的是吓唬新手,阻止常见的RE,并在她/他(希望有趣的)旅程到你的应用程序中心之后,在经验丰富的RE面前微笑 .

    在商业谈话中,你可能会说尽可能延迟竞争 .

    (看看Philippe Biondi和Fabrice Desclaux在Black Hat 2006上展示的精彩演示文稿Silver Needle in the Skype) .


    你知道那里有很多关于RE的东西,所以开始阅读它 . :)

    我说过虚拟化,所以我会给你一个来自EXETOOLS FORUMBest software protector: Themida or Enigma Protector?的示例线程的链接 . 它可能会帮助您进一步搜索 .

  • 39

    读一下http://en.wikipedia.org/wiki/Security_by_obscurity#Arguments_against . 我相信其他人也可能会提供更好的消息来源为什么安全隐患是一件坏事 .

    使用现代加密技术完全可以让你的系统开放(我不是说它应该是开放的,只是它可能是),并且仍然具有完全的安全性,只要加密算法不是't have a hole in it (not likely if you choose a good one), your private keys/passwords remain private, and you don' t你的代码中有安全漏洞(这是你应该担心的) .

相关问题