【www.shanpow.com--热门范文】
篇一:[程序加密]最实用的加密程序集合
最实用的加密程序集合时间:2010-02-25 10:30来源:未知 作者:编辑A 点击: 299次TruCrypt、PGP、FreeOTFE、BitLocker、DriveCrypt和7-Zip等等加密程序提供了异常可靠的实时加密功能,可以为你确保数据安全,避免数据丢失、被偷以及被窥视。 很少有IT专业人士还需要数据安全方面的培训,但是我们常常听说这样的事件:电脑或者硬盘被偷或丢 TruCrypt、PGP、FreeOTFE、BitLocker、DriveCrypt和7-Zip等等加密程序提供了异常可靠的实时加密功能,可以为你确保数据安全,避免数据丢失、被偷以及被窥视。 很少有IT专业人士还需要数据安全方面的培训,但是我们常常听说这样的事件:电脑或者硬盘被偷或丢失,里面存储了明文格式的数据,没有经过加密。幸好,实时数据加密如今不再是某种奇异、成本高昂的技术。有些加密程序不是仅仅对单个文件进行加密,还能在文件里面、甚至直接在分区上创建虚拟磁盘,写入到虚拟磁盘上的任何数据都自动进行加密。在现代的硬件上,加密所需的开销极小;再也不需要使用专用硬件来进行加密。本文介绍了用于创建及管理加密卷的应用程序,从Windows Vista自带的BitLocker加密程序,到用于加密电子邮件和即时消息的性能成熟的PGP桌面套件。你甚至不用花钱,就能获得异常可靠、良好实现的整个磁盘加密功能——不过在企业环境下,像可管理性或者支持服务这些特性完全值得花钱购买。工具一、TrueCrypt 5.1a费用:免费/开源TrueCrypt有足够充足的理由成为你最先试用的整个磁盘或者虚拟卷加密解决方案。除了免费和开源这两大优点外,该程序编写巧妙,非常易用,还有丰富的数据保护功能,是对整个系统(包括操作系统分区)进行加密的一种有效方法。TrueCrypt让你可以选择先进加密标准(AES)、Serpent和Twofish等算法,这些算法可以单独使用,也可以采用不同组合(名为“级联”);还可选择Whirlpool、SHA-512和RIPEMD-160等散列算法。实际的加密有三种基本方法:可以把文件作为虚拟加密卷安装上去;可以把整个磁盘分区或者物理驱动器变成加密卷;还可以加密工作中的Windows操作系统卷,不过存在一些局限性。加密卷可以用密码来保护;作为一个选项,也可以用密钥文件来保护,从而加强安全——比如可移动USB驱动器上的文件,这样你就可以建立一种双因子验证。如果创建了一个独立的虚拟卷,可以使用任何大小或者命名惯例的文件。该文件由TrueCrypt本身创建而成,然后经格式化,确保它看上去与随机数据毫无区别。TrueCrypt的目的在于,任何经过加密的卷或者硬盘不会一眼就能看出来。没有明显的卷头、所需文件扩展名或者其他识别标记。唯一的例外就是加密的引导卷,引导卷里面有TrueCrypt引导装入程序——但这个产品将来的版本不可能隐藏整个卷、使用USB拇指驱动器或者光盘上的外部引导装入程序。说到那里,你也有可能创建在“旅行者模式”下使用的自我加密的USB驱动器——里面有TrueCrypt可执行文件的拷贝,可在任何机器上安装上去及运行,只要用户拥有管理员权限。TrueCrypt还包括了所谓的“似是而非的否认”(plausible deniability)特性,最重要的就是能够把一个卷隐藏在另一个卷里面。隐藏卷有自己的密码,你没有办法确定某个TrueCrypt卷里面是不是隐藏了另一个卷。不过,如果你把太多的数据写入到外面那个卷,可能会破坏那个隐藏卷——但是作为一项保护措施,TrueCrypt提供了一个选项:你在安装外面那个卷时,可以把隐藏卷作为只读卷安装上去。如果你在使用系统磁盘加密,实际的加密过程需要一段时间,不过这个过程可以暂停,需要时恢复加密(你可能在晚上需要对上锁房间里面的PC进行这种操作)。这个程序会坚持要求创建急救光盘,那样万一遇到灾难,可以用来引导电脑(一个缺点是:你无法对从非Windows引导装入程序来实现双引导的Windows系统进行加密。) 工具二、Windows Vista BitLocker 费用:包含在Vista终极版和Vista企业版内网址:technet.microsoft.com/en-us/windowsvista/aa905065.aspx只有Vista的企业版和终极版才有Vista自带的BitLocker,它是专门为了执行系统卷加密而设计的。它的初衷不是主要用于加密可移动卷,也无法像本文介绍的其他产品那样让你可以创建虚拟加密卷。它在开发当初就考虑到了集中管理,通过活动目录和组策略来实现管理。不像TrueCrypt的系统磁盘加密,设置BitLocker需要目标系统中至少有两个卷:一个卷用来存放引导装入程序,另一个卷用来存放加密的系统文件。现有系统可使用BitLocker驱动器准备工具(如今微软为支持BitLocker的系统提供了这个额外工具)重新进行分区;但如果你在处理没有准备好的系统,也可以手动设置分区。用BitLocker对卷进行加密时,会出现三个基本选择,涉及如何授权用户来访问加密卷。如果电脑有可信计算模块(TPM),那么它可以结合个人身份识别号(PIN)代码一起使用。第二个选择是创建一个可移动USB驱动器,里面含有授权数据,然后该数据与PIN结合使用,但使用这种方法的前提是相应电脑可以从USB连接的设备引导。如果你决定用这种方法,BitLocker会在磁盘加密前进行引导测试,确保系统可从USB设备引导。第三个选择就是用户只要输入PIN,不过这个PIN会相当长(25个字符以上),而且只能由操作系统来分配。与其他任何整个磁盘加密系统一样,最慢的部分实际上是对驱动器进行加密;我那75GB硬盘容量的笔记本电脑大约用了三个半小时才加密完毕。幸好,BitLocker可以在其他工作处理的同时,在后台执行这项任务;甚至可以关闭系统,然后以后需要时恢复加密过程(我的建议是:晚上就让电脑留在上锁的房间,进行加密)。如果管理员需要访问或者解密某个卷,该卷的加密密钥也可保存到活动目录存储库中。如果你不在活动目录域中,也可以手动把密钥备份到文件中——当然,该文件应严加保护。 最后,尽管BitLocker最初的保护对象仅仅是操作系统卷,但也可以通过Vista的命令行界面,手动用它对非系统卷进行加密。 工具三、Dekart Private Disk 1.2 费用:每个用户45美元虽然Dekart Private Disk功能上类似其他加密程序,但坦率地说,至少有一项特性使得它不值得推荐。首先,Dekart Private Disk的功能组合只比本文介绍的两款免费/开源产品实用了一点。用户可以创建虚拟加密卷、备份加密磁盘的卷头、根据用户活动来控制磁盘的安装及卸载,等等。惟一真正重要、而其他产品没有的特性就是“磁盘防火墙”(Disk Firewall),你可以用来授予或拒绝某些程序访问加密卷。最能表明Private Disk在开发当初没有真正考虑安全的地方在于“恢复选项”(recovery option),它试图通过对密码实施蛮力(brute-force attack)攻击来确定私密磁盘的密码。任何专业的加密产品根本不会有这样的功能。这好比你为前门买了把锁定插销,发现它还带了一套撬锁工具——“生怕你丢了钥匙”。既然在其他地方免费就能获得Private Disk的绝大部分特性,说不定其他地方得到了更好的实现,就很难对这种收费程序表示认可。工具四、DriveCrypt 费用:每个用户59.95欧元(88.73美元)SecureStar公司的DriveCrypt其主要功能类似TrueCrypt和下面介绍的FreeOTFE——你可以从文件或者整个磁盘来创建加密容器、把一个加密驱动器隐藏在另一个里面,等等。至于比较先进的功能,比如整个磁盘加密,需要添加DriveCrypt PlusPack(185美元)。至于DriveCrypt提供的额外功能值不值得购买,那是仁者见仁的问题,因为许多人觉得免费产品具有的功能组合同样够用了。如果你之前用过类似产品,那么标准版DriveCrypt的大部分加密功能表现会如你所料。可以在文件或者分区中创建虚拟加密磁盘、一段时间没有使用后自动锁住磁盘,还能在磁盘里面创建隐藏磁盘。DriveCrypt还让你可以把该产品的之前版本(ScramDisk和E4M)创建的磁盘安装上去,所以如果你从这两个版本程序中的某一个迁移到新版本,不会觉得备受冷落。它具有免费产品没有的一些功能,包括能够对现有加密磁盘随意调整容量大小以及管理员密钥代管服务(不过后者在TrueCrypt和FreeOTFE中也能实现,只需手动备份卷头)。DriveCrypt特有的另一项特性就是:你可以创建“DKF访问文件”,该文件允许第三方不需要卷密码,就可以访问加密卷。DKF密钥可以附加各种限制——它可以使用自己的密码(与你自有磁盘上的密码无关)、X天后到期失效,或者只能在某个时间段有效。这样,就有可能为访问加密驱动器提供一定的控制权。要注意的是:默认状态下,该程序使用分区号0x74来标记已经过加密的整个分区——这样,该程序就比较容易识别及安装加密分区,但也意味着可能敌意的第三方极容易知道某个卷由DriveCrypt经过了加密。幸好,你可以通过设置程序选项来挫败这种行为……你可能应该这样,因为只有你才应当知道什么是加密容器、什么不是。DriveCrypt最吸引人的地方就是能够把.WAV文件转变成用隐匿技术来加密的容器,无论文件是从光盘上抓过来的,还是重新创建的。每个样本的4位或者8位用于存储数据,所以一个700MB大的.WAV文件(长度相当于一张音乐光盘)可用来存储350MB或者175MB。因而生成的文件仍可以播放,但音频质量会受到一定程度的影响。(注意事项:使用普通光盘音乐文件恐怕不是个好主意,因为攻击者即便不能解密,也可以拿来光盘上抓过来的内容与你的文件进行比对,确定里面有没有隐藏数据。自己录音也许更好。)工具五、FreeOTFE 3.00 费用:免费/开源FreeOTFE(OTFE的意思是“实时加密”)在许多方面与TureCrypt很相似——它提供了许多同样的特性,只是实施时有些地方略有不同;它还有一个版本使用条件非常宽松的软件许可证。创建新卷的过程再次与TrueCrypt相似:有向导程序指导你完成整个过程,并且在每个步骤提供了相关选项。FreeOTFE有着一系列更丰富的选项,这些选项涉及卷的随机数据串(salt)与散列的长度、密码、密钥和磁盘扇区系统,不过对大多数用户而言,使用默认选择就可以了。有些选项主要是为了向后兼容而提供的,比如现已过时的MD2和MD4散列函数——新创建的硬盘使用SHA512或者更好的函数。TrueCrypt似乎所没有的另一个出色特性是,卷安装上去后以及卷卸载前后,可以运行任意脚本——比如清除临时文件或者取证时用到的文件(以免被人抓住把柄)。对Linux用户而言另一项方便的特性就是,能够使用自带的Linux文件系统加密驱动器,比如Crypttoloop、dm-crypt和LUKS。与TrueCrypt一样,你也可以选择创建独立的密钥文件,但这种机制有点不同。TrueCrypt用于卷的密钥文件可以是任何文件,因为它使用了只读方式。FreeOTFE是从头开始创建密钥文件,用于存储卷的元数据块,密钥文件可能放在USB闪存盘上,以进一步增强物理安全。用户为新卷生成随机数据时,可以选择使用微软的CryptoAPI函数、通过鼠标移动生成的数据以增强随机性,或者是两者都用。 另外与TrueCrypt一样,FreeOTFE可以用来在一个加密卷中隐藏另一个加密卷,但是这个过程稍稍复杂一些。用户需要手动指定“字节偏移”值,该值描述了隐藏卷将位于何处。如果你不知道偏移值(以及隐藏卷的密码),就根本无法把隐藏卷安装上去。这还有可能把加密卷隐藏到未加密卷中,不过有点难度。FreeOTFE特别注重移植性。该程序的用户设置可以保存到用户自己的配置文件,也可以用全局方式来保存(即保存到该程序目录)。另外与TrueCrypt一样,FreeOTFE也有“移植模式”——因而可以把FreeOTFE可执行文件和加密卷放到可移动磁盘上,那样可以在另一台电脑上使用,即使这台电脑上面没有安装FreeOTFE。最后,FreeOTFE可供基于Windows Mobile 6的个人数字助理(PDA)使用;台式电脑上创建或者使用的卷可以在PDA上使用,反之亦然。工具六、PGP Desktop专业版 费用:每个用户199美元PGP Desktop提供了一整套加密工具,而开发这些工具的初衷是为了尽可能完美地与Windows系统集成,不管使用怎样的程序组合(不过这条规则也有几个例外)。它最适合这种用户:寻找广泛 的加密范围,并且愿意花些钱来购买功能完备的产品。该程序的主界面有五个基本部分:密钥管理、邮件、压缩、磁盘管理和网络共享(NetShare)。密钥管理部分是可能开始入手的地方——你可以在此创建新的加密密钥、从外部的密钥环(keyring)导入现有密钥、发布密钥到PGP的全局密钥存储库(还可以搜索存储库里面的其他密钥),等等。邮件部分控制着PGP Desktop如何处理电子邮件。在默认状态下,PGP Desktop能够对标准的SMTP/POP电子邮件、Exchange/MAPI邮件以及Lotus Notes邮件进行加密。PGP Desktop可代理及监控双向传送的电子邮件,并且在需要时采取行动,而不是改动电子邮件客户端。如果发送给你的邮件使用你密钥环中的密钥进行了加密,邮件会自动解密。还可以创建策略,规定拦截及加密多少邮件——比方说,发送到除某个域外其他所有域的邮件可用明文格式发送。即时消息(IM)加密系统(也通过本地代理系统来工作)仅支持美国在线的Instant Messenger(AIM)和Trillian;使用AIM协议的其他程序可以使用,但PGP不能为它们作出保证。IM加密对每次登录都使用1024位的一次性RSA密钥;邮件采用AES 256位对称密钥来加密。PGP Zip选项卡让你可以创建加密存档,这些存档可以在另一头用PGP来解压,或者封装成自解压存档。因而生成的存档还可以用口令短语或者接收方的密钥(如果接收方有密钥)进行签名及加密。如果只是用来创建密码保护、经过加密的文档,那不需要整个PGP套件——你可以使用许多独立的压缩程序来完成这项工作,但签名和密钥使用等特性通常是其他程序所没有的。PGP Disk是套件中的整个磁盘或者虚拟卷加密解决方案。虚拟卷用起来很像TrueCrypt或者FreeOTFE:卷可以在任何文件中;但如果使用PGP,相应的某个卷(或多个卷)既可以用口令短语来保护,还可以用用户密钥来加密(使用AES、CAST5或者Twofish等算法)。如果你使用了整个磁盘加密,可以在加密过程中选择几个选项:最大CPU占用率,目的是节省时间;电源故障安全选项,以便加密过程中万一出现断电,防止系统受到破坏。加密磁盘可以使用TPM硬件(如果你有这种硬件)或者USB闪存盘来存储密钥文件,也可以两者结合使用。PGP Disk另外有一个出色的特性:数据粉碎工具,类似自由软件Eraser产品。它可以清除文件,也可以只清除现有磁盘上的空余空间。网络共享特性(PGP Desktop Storage和PGP Desktop Corporate这两个版本有该特性)让你可以共享便携式驱动器或者网络连接驱动器上的加密文件。所有解密在用户端进行,所以任何敏感信息绝对不会以明文格式传送,也用不着在文件服务器上安装特殊软件。网络共享还能与活动目录集成,以便对谁可以访问哪些信息实行细粒度管理。还可以对指定受保护文件夹外面的单个文件进行加密,不过这项特性需要单独启用(默认状态下该功能是禁用的)。PGP Desktop并非只作为独立程序来使用——它还可以由企业环境下的PGP中央服务器程序(PGP Universal)来管理。如果你打算先在单个系统上使用,然后迁移到更集中管理的环境,那么PGP Desktop专业版是个很好的选择。工具七、7-Zip 费用:免费/开源你可能认为开源归档程序7-Zip与本文介绍的其他程序不在同一档次,但如果你只是寻找临时应急的方法来创建经过加密、密码保护的存档,它其实是个不错的选择。7-Zip也能创建自解压存档,所以接收方不需要有7-Zip——只要你们事先约定好,任何密码都可以。不过,它本身并不支持任何一种双因子验证。另外为了提高安全性,创建存档时,一定要选择“加密文件名”选项。 结论大多数想要保护磁盘的基本解决方案的人可能会试一试TrueCrypt(或者最接近它的FreeOTFE),尤其是鉴于前者提供了整个磁盘、引导卷的加密。PGP Desktop也添加了其他许多工具,对不仅需要加密磁盘上的内容、还希望加密电子邮件和即时消息的用户来说,这是个不错的选择。BitLocker的一大优点是,它是Vista自带的一项特性,可通过活动目录来进行集中管理。而DriveCrypt也有一些可能有用的隐匿和访问管理功能。7-Zip是创建经过加密、密码保护的存档的一种简单方法。遗憾的是,Dekart Private Disk很难称得上是专业的加密解决方案,因为它包括了一项荒谬的特性:可以对你交给该程序来保护的卷进行蛮力攻击。
篇二:[程序加密]手把手教你找回加密程序的密码
前不久一朋友说忘了加密程序的密码,里面有很多重要信息,希望我能帮TA找回密码。心想不就是点一下“忘记密码”么,所以爽快答应了,然后就发生了接下来故事。
0×01 前言
当拿到加密文件后,瞬间傻眼。不是联网程序,就是一个孤零零的exe,压根没有“忘记密码”这个选项,双击运行后,弹出那冷冰冰的对话框“please enter password”,于是习惯性地进行了“人工智能弱密码破解”(手动穷举输入密码),一番折腾后,果断放弃了尝试。后背一阵冷汗后,还是硬着头皮上了,谁让咱爽快的答应别人了哩。同时为了挑战一下自己,于是决定将这个程序进行逆向解析,彻底 ”爆”出里面的秘密,谁让咱是屌丝学僧哩,还要指望着修炼技术找工作呢。。。
0×02 猜想
程序在用户输入密码后,会立刻判断出密码的对错,所以文件中存在”对比密钥”用于判断密码的正确性。
对比密钥的几种形式:
1.密码的明文;
2.密码的散列值;
3.使用密码和某一特征值生成对比密钥;
4.使用密码和用户待加密的原数据生成对比密钥;
5.………………
0×03 信息收集
第一步:样本设置
第二步:文件静态分析
选取样本1使用UE的检索功能搜索密码“123456”,未找到结果,可证明密码不是以明文形式存储。
选取样本1为标准样本,使用UE的二进制对比功能,对比样本2、3、4与样本1的差异。
将内容为空的加密程序用UE打开,最后一行行号为c9f0h。对比上述样本,可判断加密程序采用文件末尾追加数据的方式存储密文数据,进一步分析后得到数据存储格式。
第三步:IDA静态分析
使用IDA加载样本1,弹出提示框。
点击Ok,程序成功载入,但是函数窗口中只有一个函数,可见程序加了某种壳对IDA逆向分析产生了干扰。
第四步:脱壳
为减少调试中的干扰,进一步理清程序流程,需要进行脱壳处理。使用壳检测神器PEiD判断壳类型,结果如下:
PEiD成功检测出壳名称为PECompact 2.x -> Jeremy Collake ,如果是未知壳, 则需要进行手动脱壳。这里根据壳信息下载对应的脱壳程序对之前设置的四个样本程序进行脱壳处理。
将脱壳后程序再进行IDA静态分析,函数窗口可获取到所有的函数信息,主程序流程图如下所示
这密密麻麻的分支,让我再次一身冷汗
第五步:动态调试
使用OD进行动态调试分析,主要分析程序的密码比对流程。
1、将样本1载入OD中,F9直接运行。此时,奇怪的事发生了,程序在弹出密码输入框的同时,OD左下角提示进程已经结束,这意味着程序已经运行结束,怎么密码框还在呢?!!!
由此判断程序在运行时,创建了其他工作进程后结束了自身进程。打开任务管理器,可以看到如下疑似进程在运行。Kill掉这个进程后,密码框消失,可证明该线程为密码框工作线程。
2、使用文件夹的搜索功能,对全盘进行了搜索,寻找该进程对应的程序存放目录。
打开其对应的文件夹,可以看到有很多类似程序,这些都是测试时记事本生成的中间程序。
3、运行这些程序,均为空白记事本,没有任何内容。经过UE比对确认,这些程序均为笔记本的原始程序,不包含任何数据。
推测:记事本在运行时,先将原始程序释放在temp目录下,然后创建新进程加参数运行释放的程序。
证明:使用OD查看程序调用的函数列表,找到创建进程的相关函数。
这里确定kernel32库函数CreateProcessA,右键选择“查看引用”。
407BAE处调用了该函数创建新进程,在407BAE下断点,运行程序
程序确实是通过加参数的形式运行的,打开cmd,输入程序路径并且加参数运行
程序弹出错误窗口,并不能正常运行弹出密码输入框。
0×04深度分析
获取上述基本信息后,确定了加密程序的数据存储格式和运行加载方式。下面采用OD附加进程的方式直接对运行后新创建的进程进行调试,来梳理密码判断流程。
1、附加程序
双击运行程序,打开OD->文件->附加,双击新进程名称,将OD附加上去,对其进行调试。
由于此时新进程处于密码框输入状态,所以OD会停留在系统函数领空,此时密码框为不可用状态。为了跟踪密码输入后的流程,需从密码输入后跟踪调试,使用Alt+F9程序会自动运行并停留在用户代码段。此时密码输入框处于激活状态,输入正确的密码,点击确定,程序停留在用户代码段。
2、IDA辅助查看程序流程
在获取到密码输入后的关键地址后,使用IDA加载程序,使用F5反编译功能,查看程序的伪代码。
可以看到While循环中第33行为密码输入框,37行调用函数404648进行了密码正确性判断,39行为“Invalid passphrase”密码错误信息。将OD定位到404648函数的调用处,可以看到函数的返回值eax决定了后续分支走向,这个值便是密码正确性判断后产生的结果。
找到密码判断的关键后,进入404648函数,查看返回值的生成过程,确定关键代码。
repe cmps byte ptr [esi],byte ptr [edi]
ESI为12FE78,EDI为3E3D99
程序对两处0×20字节的数据进行比对,而这两个数据正是样本1中key中的前0×20字节的数据。可确定程序在获得输入密码后,经过一系列加密变换后生成0×20字节的key与文件中的密钥进行对比,来判断输入的密码是否正确。
3、加密流程
确定密钥判断关键位置后,继续向上追溯,寻找对比密钥生成过程。经过一番跟踪后,确定函数407481为对比密钥生成函数。
size_t __usercall sub_407481@(int a1@, void *a2, size_t a3){ int v3; // edi@1 size_t result; // eax@1 int v5; // ebx@1 size_t v6; // ebx@7 v3 = *(_DWORD *)a1 & 0x3F; result = a3 + *(_DWORD *)a1; v5 = 64 - v3; *(_DWORD *)a1 = result; if ( result < a3="" ) ="" ++*(_dword="" *)(a1="" +="">4); if ( v3 && a3 >= v5 ) { memcpy_0((void *)(v3 + a1 + 40), a2, 64 - v3); result = sub_404B4C(a1 + 40, a1); a3 -= v5; a2 = (char *)a2 + v5; v3 = 0; } if ( a3 >= 0x40 ) { v6 = a3 >> 6; do { result = sub_404B4C((int)a2, a1); a3 -= 64; a2 = (char *)a2 + 64; --v6; } while ( v6 ); } if ( a3 ) result = (size_t)memcpy_0((void *)(v3 + a1 + 40), a2, a3); return result;}
用OD在407481函数处下断点
什么!!!!函数在执行时,参数1是明文内容,参数2是明文长度。可见在此之前,程序利用输入的密码对密文进行了解密,然后又将解密出的明文送入函数407481生成比对密钥。
明文是如何解出来的,稍后再分析。先继续分析407481函数如何利用明文生成对比密钥。经调试后,确定函数404B4C为关键的加密函数。
由于该函数非常复杂,所以并不打算对该加密算法进行深入分析,直接将该函数的汇编代码抠出来作为c程序的内嵌代码使用。
404B4C函数的输入分别为eax(待加密的内容,长度为0×40字节),ecx(生成的密钥存放位置),ecx所指向的密钥存放位置为0×28字节,前8个字节存放着原始明文的总长度,后面0×20字节存储着生成密钥,且这0×20字节密钥设有初始值。
407481函数
输入:参数Arg1:原始明文地址
参数Arg2:原始明文长度
输出: 蓝色框中为原始明文长度
红色框中为密钥变换后的结果
绿色框为明文长度除以0×40后剩余的明文内容
407481过程表示
蓝色框中写入参数Arg2的值
count = Arg2 / 0x40; //明文长度除以0x40
data=Arg1;
While(count--)
{
Call 404B4C(data); //每次讲明文的0x40字节进行加密计算
data=data+0x40;
}
Call 40B240(Arg2 %0x40 ,data); //将明文的剩余部分写入绿色框中
上述过程结束后,程序再次调用了407481函数,参数为原始加密文件中key2密钥,长度为0×10字节。
407481函数运行后将0×10字节的密钥追加在了剩余明文尾部。
随后的call 00407508函数会计算出0×20字节的对比密钥。
经过分析,程序主要利用如下区域的数据进行对比密钥的生成。
蓝色框:原始明文长度+末尾附加的数据长度
红色框:密钥
绿色框:剩余数据
总结对比密钥生成过程:
1.将红色区域初始化,将初始密钥写入
2.每次读取0×40字节的原始数据,使用红色区域的密钥进行加密变换,生成的密钥输出到红色区域;
3.将剩余的原始数据进行填充处理,使其达到0×40长度,然后再进行一次密钥变换,此时生成的密钥便是比对密钥,用于和正确的密钥进行比对。
分析到这里我们发现,对比密钥的生成条件都是可以从文件数据中获取,但是有一个条件现在还不知道,那就是明文数据!!!我们似乎陷入了一个死循环中。。
0×05密文解密
1、猜想:程序在获取到输入密码后,利用输入密码对密文进行解密,用解密后的密文生成对比密钥。
证明:继续回溯跟踪,确定404A6F地址处调用的call 0040854C函数是解密函数,参数1为密文内容,参数2为密文长度,参数3为文件中的key2密钥。
40854C函数在解密过程中还调用了一些未知区域的数据进行解密变换
2、猜想:程序在初始化运行时,生成了这些未知区域的数据。
证明:重新运行程序,断在程序入口点处,查看数据区域41E340处,可见该区域均为0×00。
在此数据区域设置内存写入断点,F9运行。
确定位置后用IDA反编译,可以清晰观察到程序通过调用408FFB函数向41B300,41BB00,41E340,41EB40,41C700,41CB00六个区域写入数据,每个区域长度为0×100。
int sub_408FFB(){ int v0; // eax@1 int v1; // ecx@1 ………………………… v0 = 1; v1 = 0; do { v2 = 283 * (((unsigned int)v0 >> 7) & 1); *(int *)((char *)&dword_41CF00 + v1) = v0; v1 += 4; v0 = v2 ^ 2 * v0; }while ( (unsigned int)v1 <>0x28 ); v28 = 0; do { v3 = v28; LOBYTE(v2) = v28; v4 = sub_408F52(v1, v2); v5 = 2 * (v4 ^ 2 * (v4 ^ 2 * (v4 ^ 2 * v4))) ^ v4; v6 = (unsigned __int8)(v5 ^ BYTE1(v5) ^ 0x63); v7 = 2 * v6 ^ 283 * (v6 >> 7) | ((v6 | (v6 <>8)) <>8) | 452984832 * (v6 >> 7) ^ ((v6 ^ 2 * v6) <>24); …………………… v20 = 72448 * v17 ^ 72448 * v18 ^ 72448 * v19 ^ ((v14 ^ 8 * v14) <>8) | 18546688 * v17 ^ 18546688 * v15 ^ 18546688 * (((unsigned int)v14 >> 6) & 1) ^ 18546688 * v18 ^ 18546688 * v19 ^ ((v14 ^ 4 * v16) <>16) | 452984832 * ((unsigned int)v14 >> 7) ^ 452984832 * v17 ^ 452984832 * v18 ^ 452984832 * v19 ^ ((v14 ^ 2 * (v14 ^ 4 * v14)) <>24) | 283 * ((unsigned int)v14 >> 7) ^ 283 * v17 ^ 283 * v15 ^ 283 * (((unsigned int)v14 >> 6) & 1) ^ 283 * v18 ^ 283 * v19 ^ 2 * (v14 ^ 2 * v16); …………………… dword_41E340[v8] = v21; dword_41EB40[v8] = v24; dword_41C700[v8] = v1; dword_41CB00[v8] = v26; } while ( v28 <>0x100 ); dword_41FF58 = 1; return 0;}
0×06.解密流程
0×07.后记
根据上述分析后,可确定加密程序并非将密码存储在文件中,所以不能根据加密数据逆向推导出原密码,而只能根据上述分析的密码验证流程采用字典攻击进行暴力破解。而这也正是很多加密程序需要使用字典进行暴力破解的原因。程序分析到这里,就该写程序结合字典来“爆”出里面的秘密了。。。。。。
篇三:[程序加密]用户程序加密功能
在SINUMERIK新的4.7软件上,包含了循环保护(Lock MyCycles)功能,可对用户的循环程序进行加密,加密之后的循环程序在NC中的执行不受限制,但不允许查看、修改和反编译,从而实现对机床制造商知识产权的保护。该功能为选项功能(Lock MyCycles): 具体实现步骤如下: 1.首先借助加密软件SinuCom Protector,在外部计算机中对程序进行加密。 说明:SinuCom Protector软件,目前最新版本为V01.02.01.00,可通过840Dsl或828DToolbox DVD 光盘中的Tools/Protector目录下的压缩文件 SINUCOM_Protector_V1_2_1.zip解压后得到,文件名称为protector.exe。 1) 将未加密的循环程序,例如EXAMPLE1.SPF,拷贝到循环加密软件protector.exe所在的同一目录下。 2) 点击鼠标左键,选中未加密循环程序EXAMPLE1.SPF,按住鼠标左键,将其拖拽到循环加密软件protector.exe图标上。 3) 松开鼠标左键,计算机将自动生成加密循环程序EXAMPLE1.CPF。 说明:加密循环文件扩展名为_CPF。 加密循环,只能装载在系统中的/_N_CST_DIR(标准循环)、/_N_CMA_DIR(制造商循环)或/_N_CUS_DIR(用户循环)目录下;每次装载完成之后,系统必须断电重启,否则在执行加密循环_CPF文件时,会触发报警:15176 “上电后才可执行程序 %3”。 2. 加密循环预处理 同 _SPF 文件一样,可对加密循环_CPF文件进行预处理。为了激活预处理,必须设置机床数据MD10700$MN_PREPROCESSING_ LEVEL。 3. 加密循环执行 加密循环无法直接选中执行,只能从一个程序或直接在 MDA 中调用。加密循环无法通过“外部执行”功能执行。 4. 加密循环备份复制注意事项 加密的程序可以通过备份数据保存,也可进行复制,用于其他机床,有以下两种情况需要注意: 要求仅在一台机床上使用加密循环 若需将加密循环仅与一台机床绑定,可在循环程序的调用指令开头查询CF 卡的具体序列号(MD18030 $MN_HW_SERIAL_NUMBER)。若循环识别出了不匹配的序列号,则会在循环中输出报警并阻止后续处理,因此形成了循环与指定硬件的绑定。 要求在多台机床上使用加密循环 若需将加密循环绑定至指定的多台机床,必须在加密循环中输入每个硬件序列号进行匹配,从而形成了循环与指定的多个硬件的绑定。(SIEMENS数控技术应用)