什么是RASP

Gartner在2012年引入了RASP(Runtime Application Self-Protection,运行时应用程序自我保护),这是一种在应用程序运行时提供安全保护的技术,通过嵌入到应用程序中,实时监控和阻止针对应用程序的攻击,使应用程序具备自我防护能力。其核心思想是将安全防护代码集成到应用程序本身中,实时采集应用的高风险行为,结合特征规则、上下文语义分析及第三方安全产品数据关联分析,实现对应用程序的实时检测和防御,通过实时监控和防御来保护应用程序免受各种网络攻击。

具体来说,RASP通过以下几种方式实现自我保护:
1、动态代码注入:RASP通过动态代码注入技术,将自身防御逻辑注入到底层API中,从而实现无须人工干预、无感知的高精准检测和防御外部攻击。
2、API钩子:通过监控应用程序调用的API函数,实现对应用程序行为的监控。
3、上下文感知:RASP能够获取应用运行时的上下文信息,包括代码、框架配置、应用服务器配置、库和框架、运行时数据流、后端连接等,从而提供更精准的威胁检测。
4、安全策略配置:管理员可以通过配置安全策略来适应不同的应用程序需求和威胁模式,定义哪些行为是允许的,哪些是禁止的。
5、规则匹配与行为基线:RASP利用规则匹配、词法分析、行为及运行堆栈检测等方法,识别潜在的安全漏洞并防止攻击。这些功能有助于识别未知漏洞并给出详细的漏洞详情,极大降低误报率。
6、自定义逻辑检查:不依赖请求特征检测攻击,而是在应用执行关键操作时,执行一段自定义的逻辑检查是否存在异常,以应对未知漏洞。
7、实时监测和阻断:RASP在应用程序运行时检测到恶意行为,并立即进行阻止,有效防止了恶意代码的执行。
相较于传统的Web应用安全产品,RASP从海量的攻击中排除掉大量无效攻击,聚焦发现真实的已知和未知安全威胁。

实施RASP时,可以采取以下步骤:
1、明确应用的安全需求和目标:包括识别关键的安全风险点、确定需要防护的攻击类型以及定义安全策略。
2、根据应用的技术栈和具体需求,选择适合的RASP工具。例如,Java应用可以选择OpenRASP等开源框架,或者使用商业解决方案如AWS WAF等。
2、集成RASP探针:在应用中集成RASP探针,这些探针会在应用运行时插入到业务代码中,监控其行为并进行实时检测。探针可以部署在主机或容器环境中,无需修改原有代码。
3、配置RASP规则:定义一套安全规则来指导RASP如何工作。这些规则包括允许和禁止的行为模式,并根据不同的应用场景进行调整。管理员可以通过图形界面或API配置这些规则。
4、测试:在生产环境部署RASP之前,进行彻底的测试,以确保它不会对应用程序的性能产生负面影响,并且能够有效地检测和阻止攻击。
5、部署:将RASP部署到生产环境中,并确保其与应用程序一同启动。
6、培训和维护:对开发和运维团队进行RASP相关的培训,并定期更新RASP规则和签名,以应对新的安全威胁。
7、监控和调整:部署RASP后,需要监控其性能和产生的安全警报,并根据监控结果调整RASP规则,以减少误报和提升防护效果。
8、定期评估:评估RASP性能和效果,根据新的安全威胁和漏洞进行更新和优化。同时,结合IAST(交互式应用程序安全测试)和DAST(静态应用程序安全测试)等工具,进一步提高防护能力。
9、应急机制:建立有效的应急响应机制,以便在发生安全事件时迅速采取措施。同时,合理管理和记录日志信息,便于事后分析和审计。

安全架构实践公理

2020年7月,TOG(The Open Group)联合SABSA,正式发布中文版指南《安全架构实践的公理》(其英文版发布于2019年7月),其中20条安全架构实践公理如下:

公理1:业务风险驱动安全
安全架构应通过最大化收益和最小化损失来支持业务目标。
必须牢记的是,组织资产并不是为了被保护而存在,它们的存在是为了创造价值。而利用资产创造价值,通常意味着使该资产面临风险。这正是矛盾之处。
为了提供最优架构,安全架构师不仅要从防止负面结果的角度来看待它们对组织的贡献,还要从促成积极结果的角度来看待它们。
如果安全架构无法支撑组织利用其资产来完成业务工作,则该安全架构可能被边缘化和显得无用。
安全架构应基于业务风险驱动,并且应该是对这些风险进行适当响应。

公理2:场景
不要虚构场景,否则后果自负。专为一种场景而设计的安全系统或解决方案,并不总是可以有效地在另一种场景中工作。
这并不是反对重用,可重用的基于组件的架构有很多好处。但是,如果为了节省时间和精力,将安全系统重用于不同的用例,则需要针对这两个用例之间的差异,进行新的风险分析。
该指南还专门针对系统设计中的一个常见错误——访问控制过程的身份识别、身份验证、授权过程的混淆,进行了澄清。

公理3:范围
明确定义安全架构的范围很重要。在这方面,系统收益(SOI)的概念很有用(如ISO/IEC/IEEE 42010:2011中所定义)。

公理4:情报
安全系统应利用情报来主导响应活动。通过威胁情报,既可以了解对手的意图、能力、攻击方式,也可以了解自身的漏洞情况。
建议对潜在威胁场景进行建模分析,来实现最佳效果。

公理5:信任
安全架构应该保障系统可以准确建模业务实体关系中存在的信任的性质、类型、级别、复杂性。
信任是人际关系的特征。但我们可能要给非人员对象以信任。当这样做时,其实是在说,我们可以信任操作这类对象的人员,或可被操作这类对象的人员所信任。因此,一个可信的系统是指我们信任参与系统生命周期过程的人员。
信任从来都不是二进制,而是一个很长的灰度连续体,很少有黑色或白色。
“信任”和“被信任”不是镜像关系。
即使是最复杂的信任关系,也可以自顶向下分析成一系列简单的单向信任关系。通过严格执行此项分析,可以将任何业务关系分解为简单且独立的单向信任组件。

公理6:整体分析
安全需求应与其它的功能性需求和非功能性需求集成在一起。安全需求通常被描述为非功能需求(NFR),并且不应将其与其他功能需求或非功能需求分离。只有将所有需求都视为SOI(系统收益)整体风险的一部分时,安全架构才能有效工作。
架构通常被视为不同视角的一系列观点。这些观点通常被称为架构域。例如:业务架构域、应用架构域、信息架构域、数据架构域、服务管理架构域、技术架构域。就像看一座被群峰环绕的山谷,远近高低的观点各不同。
而安全架构域是从另一个视角来看的另一种观点,但与其它视角有很大不同,因为它是一个跨领域的域,必须以整体的方式解决所有其它域的安全和风险管理问题。因为风险无法分为孤立的架构域,所以安全架构师必须同时从所有视角看到山谷,即拥有可以随意旋转的全息视图。

公理7:简洁性
系统和服务应在保证功能性的前提下尽可能简洁。
复杂是安全的敌人,必须在保持整体性的同时,将其简化为子结构进行管理。安全架构将会受益于面向服务的架构(SOA)方法,在这种方法中,我们看到了“一切即服务”(EaaS)。服务的性能对于实现顶级业务绩效目标至关重要。
任何架构类型的主要目标之一就是管理复杂性。必须通过自上而下的分解来分解高度复杂的SOI(系统收益),从最高级别的业务目标开始,并创建逐渐简化的SOI层次,并对其逐层解决。
高度复杂的系统,倾向于表现出涌现性。涌现性的示例包括:两个或多个进程争用同一系统资源时发生死锁;网络在超出容量后的流量拥塞。
系统安全漏洞主要来自两个来源:设计错误和涌现性。两者不相同,不应混淆。涌现性是系统工程的一种现象,并非一开始就被设计出来。复杂性本身就是导致出现这一现象的原因。

公理8:重用
在可行的情况下,尽可能重用受信任的系统开发实践和系统组件。
安全架构师不应从零开始,不要重新发明轮子。从通用框架和参考架构开始,并针对特定的场景进行定制,始终是效率更高的方法。
框架示例包括:
NIST网络安全框架(CSF):是150多个RFI响应和许多利益相关方会议的产物。
ISO 27000系列:是用于组织和监控企业安全机制的一组控件和过程。
ISO 31000-2018:定义了一个周期性的风险管理流程。
SABSA平衡风险模型:提供了定义风险相关组件的组织结构。

公理9:弹性
安全系统应在受到胁迫时依然正常运行。
架构的弹性不仅仅是设备,还必须包括人员和流程。
弹性的关键特征是计划内的系统降级——通过控制将系统降级,而非由于无法控制导致故障。
良好的弹性设计的一个例子,是在大容量云服务数据中心中使用混沌工程。混沌工程通过在时间敏感的在线服务中,不断进行故障自动转移测试,来验证系统弹性。

公理10:过程驱动
安全开发过程应使用清晰的生命周期,来解决要求的时间跨度,并引入利益相关方。
战略:安全架构的目标是支持组织的长期的业务战略。安全架构本身是一项战略活动,需要长期的投资和管理层的支持。
战术:安全架构是通过一系列步骤开发和实施的:利用变更项目从而使长期愿景变为现实。
运营:安全架构提供技术、工具、流程来确保日常的安全,并对业务运营提供风险管理。

公理11:优化冲突解决
安全应通过平衡业务风险,来优化解决利益相关方的冲突。
利益相关方的关注通常会发生冲突。安全架构的作用之一是以最佳方式解决这些冲突,在功能需求和其他非功能需求与安全需求之间取得平衡。这些利益冲突可能非常复杂,源于安全架构的跨复杂领域的性质。

公理12:清晰的沟通
安全应使用有利于业务和技术利益相关方之间进行有效沟通的通用术语。
安全架构师必须至少会两种“语言”,能熟练使用业务涉众的语言(“业务术语”)和技术人员的知识(“技术术语”)。

公理13:易用性
安全系统应该尽可能对用户透明且易于使用。
不易使用或导致生产受到影响/破坏的安全控制措施,通常会被忽略、禁用、废除,导致资源容易受到攻击,从而失去了控制措施的价值。而被绕过或未被使用的安全系统将毫无价值。
可用性差的经典示例,是密码的使用。另一个示例是Web浏览器使用PKI证书对网站进行验证。

公理14:安全设计
安全性应依赖于经过验证的特定控制措施,而非隐藏。
每本安全书籍都强烈建议不要使用“通过隐藏构建安全性”。其实通常被否定的,是希望安全漏洞不被发现的侥幸心理。
安全不应依赖于暗箱操作或其它晦涩的形式,而应依赖于经过验证的特定控制。就像密码学的安全性,应取决于对加密密钥的保护,而非加密算法。

公理15:优先级
使用较强的保护机制来保护较弱的机制,而非相反。
最重要的事物不应依赖于不重要的事物。

公理16:设备主权
所有设备均应能够在不受信任的网络上保持其安全策略。
保护机制通常位于本地或靠近被保护的资源更有效。这使得防护机制更容易随受保护资源一起迁移。
物联网设备的市场壁垒,使得设备主权原则难以适用。安全架构师必须面对这一挑战。不可能强迫市场将高级安全性集成到IoT设备中,因为这是一种市场驱动的现象,受成本和收益的感知驱动,但是设计整体集成的分层方式将改善一定程度的安全性。

公理17:纵深防御
通过分层防御可以获得更高的安全性。
纵深防御是一种传统方法,它通过在攻击路径上应用多层或多级安全性,来最大程度地保护每个资源。
为了使纵深防御有效,各层之间必须彼此独立,各层应该由不同类型的控制措施组成,而非多层使用同一类型的控制。
当控制措施失效时,选择失效而开放,还是失效而关闭,取决于资源的敏感性和它所支持的服务的需求。在此领域,有限状态机(FSM)建模可用于探索系统可能进入的所有可能状态。

公理18:最小特权
主体(人员、事物、流程等)应仅被授予执行其授权任务所需的权限。
部署最小特权系统和服务的能力,在一定程度上取决于可以执行细粒度访问控制的技术和流程。细粒度的访问控制,要求以一种方式捕获或存储有关资源或资产以及最终用户的元数据,以便访问控制系统可以通过它来做出有关资源的访问决策。
职责分离也是从纵深防御中衍生出来的一种特殊形式的最小特权。

公理19:访问管理
访问控制包括三种不同的操作过程:
识别:识别并区分主体;
认证:验证主体的身份;
授权:授予主体适当的访问权限。

公理20:通信安全
设备和应用程序应使用开放、安全的协议进行通信。
在当今过度连接的世界中,无法假设未加密的传输具有任何级别的安全性。
最重要的一点是,无论加密服务是否已打开并处于最佳运行状态,网络服务都无法向应用服务发出信号。因为网络无法理解应用程序的数据结构。
规则很简单:网络需要网络安全服务来保护。应用程序需要应用安全服务来保护。
通信安全架构是一门复杂的学科。它必须在通信设备之间采用敌对环境,并且必须同时满足应用程序层安全性和网络层安全性。

参考:
《网络安全架构:安全架构实践的公理》
安全内参是个很好的安全类技术网站,大家可以关注一下:安全内参官网

什么是DevSecOps

DevSecOps是一种将安全实践集成到开发和运维(DevOps)过程中的方法论:安全不仅仅是安全团队的责任,而是整个IT部门(包含开发、测试、安全和运维等团队)所有成员的责任,需要贯穿业务生命周期的每个环节。
其核心理念是“安全内建”,即在软件开发的每个阶段都考虑安全性,而不是将其作为事后处理。DevSecOps 旨在通过自动化和协作来提高软件的质量和安全性,同时加快交付速度。

DevSecOps 的关键组成部分:
1、 安全左移(Shift Left Security):将安全活动前移到软件开发生命周期的早期阶段,以便在设计和编码阶段就识别和修复安全漏洞。
2、 自动化:通过自动化工具和流程来执行安全测试、代码审查和合规性检查,以提高效率和一致性。
3、 持续集成/持续部署(CI/CD):在软件开发过程中实现自动化的构建、测试和部署,确保安全措施能够快速响应开发变更。
4、 文化和团队协作:建立一种文化,其中开发、运维和安全团队共同协作,共同对软件的安全性负责。

如何实施 DevSecOps:

1、 建立跨功能团队:
组建包含开发、运维和安全专家的跨功能团队,确保从项目开始就考虑安全性。

2、 安全培训:
对团队成员进行安全意识和最佳实践的培训,确保他们了解安全的重要性和实施方法。

3、 定义安全策略和标准:
制定清晰的安全策略和标准,确保团队成员理解并遵循。

4、 集成安全工具:
选择并集成自动化的安全工具,如静态代码分析器、动态应用安全测试(DAST)工具、容器安全扫描工具等。

5、 实施安全编码实践:
在编码阶段实施安全编码标准和实践,减少安全漏洞。

6、 自动化安全测试:
在CI/CD流程中自动化安全测试,包括代码审查、自动化扫描和渗透测试。

7、 持续监控和响应:
实施实时监控和日志分析,以便快速检测和响应安全事件。

8、 合规性和审计:
确保遵守相关的法律法规和行业标准,定期进行安全审计。

9、 反馈和改进:
建立反馈机制,根据安全测试和监控结果不断改进安全措施。

10、 文档和透明度:
记录安全流程和事件响应计划,确保团队成员和利益相关者之间的透明度。

11、 灾难恢复和业务连续性:
制定和测试灾难恢复计划,确保在安全事件发生后能够快速恢复正常运营。

12、 文化建设:
培养一种安全文化,鼓励团队成员积极报告潜在的安全问题,并参与安全改进。

实施 DevSecOps 需要组织层面的支持和承诺,以及跨部门的协作。通过将安全集成到 DevOps 的每个环节,组织可以更有效地管理风险,同时加快软件交付的速度。

安全开发是如何执行的

谈到安全开发,咱们就要先明确一个问题,安全开发的目的是什么呢?

所有做过开发的小伙伴,一定会有一个概念,一个程序的逻辑Bug,一定越早发现,损失越小。
如果能在需求阶段,发现并解决这个Bug,损失可以是最小的。

安全开发也是这样,希望达到的目的就是:
安全风险左移,早发现,早管理,持续改进

在安全开发上面,其实有一些现成的框架可以遵循,比如SSDLC(适合迭代式开发)、DevSecOps(适合DevOps式开发)等。

本文就说一下,我们的SSDLC是如何执行的。

当前,在能执行之前,需要进行相关的建设,包括:
明确安全风险,明确安全基线,指定安全策略,进行安全教育,部署安全工具,进行相关培训等等。
这个每个公司差异比较大,选择的组件和厂商也大不相同,就不详细描述了。
我们重点说一下,一个安全相关的需求,是如何落地的。

1、安全需求
1.1安全需求识别
组织应该达成一个共识,哪些需求比如过安全评审,比如:
a、任何账号、密码相关的
注册、登录、密码验证、验证码、密码修改、账号注销等等
b、任何用户可以发布信息的
留言、灌水、内容发布、即时通讯、提交信息并展示
c、任何上传和下载的
d、任何交易相关的
大促、活动、秒杀、刷单、刷票、业务风险响应
e、任何钱相关的
积分、交易、资金往来、营销、相关接口
f、涉及SQL编写的
g、任何敏感信息存储或展示的
购买、支付、个人信息查询、添加删除信息、充值密码
移动端图片保存、人脸识别、手势密码
h、任何证书相关的
i、任何访问控制相关的
前后端访问控制、系统对接、日志、短信、邮件
j、任何批量操作相关的
查询、导入、导出
k、合规安全相关
隐私政策、个人信息采集、敏感信息传输、生物特征识别、账号注销
等等。
1.2安全需求强制纳入安全评审,安全管理人员可以指定其他需求进入安全评审、
1.3安全小组对需求进行评审,判定是否可以继续推进

2、安全设计
2.1设计人员给出方案
2.2安全小组评审设计方案,判定是否可以继续推进
2.3测试同学,同步书安全测试用例
2.4安全小组评审设测试用例,判定是否可以继续推进

3、安全开发
3.1、开发同学IDE安装好安全组件,组件可规范编码,并进行静态扫描,及时发现代码问题
3.2、开发同学自测后,提交代码库
3.3、开发同学在测试环境,运行流水线
3.4、流水线自动混淆、编译、加固、打包、部署,同步进行各类扫描,包括:黑盒、白盒、组件、镜像、隐私检测等
3.5、流水线给出相关漏洞
3.6、开发同学修复漏洞

4、安全测试
4.1、测试同学进行功能验证
4.2、测试同学进行安全验证:渗透、越权等
4.3、测试同学进行性能验证
4.4、验证通过后,提交相关报告

5、安全验证
5.1、此时可以进行UAT验证
5.2、在版本库相同的情况下,开发同学将代码发布到UAT环境
5.3、流水线门禁根据规则判定,是否可以发布
5.4、测试同学初步验证
5.5、用户验证

6、安全部署
6.1、此时可以把代码部署到生产环境

当然,上面的开发流程,只是整个安全开发体系中的一环。
实施安全开发流程,需要庞大的前期资源投入,以及渡过一个较长的不断改进的过程。

什么是SSDLC

SSDLC(Secure Software Development Life Cycle,安全软件开发生命周期)是一个软件开发框架,它将安全考虑和实践集成到传统的软件开发生命周期(SDLC)的每个阶段。SSDLC的目标是减少软件中的安全漏洞,提高软件产品的安全性,确保从设计到部署的每个步骤都考虑到安全因素。

SSDLC 的主要阶段通常包括:
1、 初始化:确定安全策略和目标,定义项目范围和安全要求。
2、 架构设计:设计软件的安全性,包括威胁建模和风险评估。
3、 详细设计:开发软件的详细设计,包括安全控制和机制。
4、 实现/编码:编写安全的代码,并遵循安全编码标准和最佳实践。
5、 测试:进行安全测试,包括静态代码分析、动态代码分析和渗透测试。
6、 部署:安全地部署软件到生产环境,并确保部署过程本身的安全性。
7、 维护:在软件的整个生命周期内进行持续的安全监控、漏洞管理和补丁应用。

如何实施 SSDLC:

1、 建立安全策略:
定义组织的安全政策和程序,确保它们与SSDLC流程一致。

2、 安全培训:
对开发团队进行安全意识和安全技能的培训。

3、 威胁建模:
在设计阶段使用威胁建模来识别潜在的安全威胁和漏洞。

4、 安全需求分析:
确定软件的安全需求,并将其纳入项目的需求规格中。

5、 安全架构和设计:
设计软件架构以包含安全控制,如身份验证、授权、数据加密等。

6、 安全编码:
遵循安全编码标准和最佳实践,减少安全漏洞。

7、 代码审查和静态分析:
通过代码审查和自动化工具检测代码中的安全问题。

8、 动态分析和测试:
进行动态安全测试,如渗透测试,以发现运行时的安全问题。

9、 安全部署:
确保部署过程安全,包括使用安全的配置和补丁管理。

10、 监控和响应:
实施监控机制来检测和响应安全事件。

11、 持续改进:
根据反馈和安全测试结果,不断改进SSDLC流程。

12、 合规性检查:
确保软件的开发和部署符合相关的法律法规和行业标准。

13、 文档和审计:
记录安全活动和决策,以便于审计和未来的回顾。

实施SSDLC需要组织层面的承诺和支持,以及跨部门的协作。通过在软件开发的每个阶段都集成安全措施,可以有效地减少软件中的安全漏洞,提高整体的安全性。

Java程序如何加密

今天在想Java程序加密的事情,现在市面上的方法,无非是混淆代码,jar包签名等,瞬间就能被破解掉。

我想到了一个很挫的方法,和PE文件加壳脱壳一样,class文件/jar文件为什么不可以呢?

但这样做的话,是有限制的,就是客户必须使用你自己定制的JVM及容器,否则是无法运行的。

具体方法如下:
1、生成class文件后,按一定规则进行加密处理。偷懒的话,直接对称加密好了。
2、生成jar包的时候,同样按一定规则进行加密处理。偷懒的话,zip的时候,增加一个强壮的密码就好了。
3、下载并编译OpenJDK,在读取jar包内容,和class文件的地方,要进行脱壳处理。按上面的思路,就是解压缩和解密处理。
4、当然,定制部分的dll和exe,需要进行PE加壳处理

当然,上面这种方式的话,和加壳脱壳还是有很大的区别的,就是不能自行解压,并要依赖于JVM甚至容器的定制。

如果要真正实现自解压处理的话,就要多做几步:

具体方法如下:
1、编译生成class文件,按一定规则进行加密处理。偷懒的话,直接对称加密好了。
2、生成jar包的时候,同样按一定规则进行加密处理。偷懒的话,zip的时候,增加一个强壮的密码就好了。
3、将需要的所有jar包,按你喜欢的方法,生成一个jar包列表,并打成一个巨大的资源文件。
4、写一个java引导文件,用于处理运行参数,比如入口程序等。
5、写一个自定义classloader+jni+dll,用于读取巨大的资源文件中的jar包及class文件
6、用普通的jvm启动程序,初始化时用引导文件+自定义classloader
7、引导文件+自定义classloader将需要的文件直接解压到内存中,提供给jvm使用
8、dll部分要进行PE加壳处理

汉化.net程序

1.首先是反编译

ildasm11.exe /ALL /VISIBILITY=PUB+PRI+FAM+ASM+FAA+FOA+PSC /UNICODE Target.dll /OUT=Target.il

2.打开Target.il
搜索ldstr,后面就是你所需要汉化的字符串

同时会遇到bytearray类型的字符串,这些字符串是以UNICODE的HEX方式存储的,将汉化后内容,同样转成UNICODE的HEX字符串存回去,同时记住要修改字体

3.去掉StrongName
将Target.il中publickkey字段删除

4.生成snk

sn.exe -k Target.snk

5.重新编译并增加StrongName

ILASM11.exe Target.il /dll /key:Target.snk /resource:Target.res /out:Target_cn.dll

6.验证

sn -v Target_cn.dll

第一次汉化游戏

上大学时,有款游戏叫“是男人就下100层”
无聊的时候玩玩还不错

但是看到上面的日文,我就不爽,干脆,汉化掉算了
查看后,没加壳,哈哈哈哈哈哈哈哈
掏出eXeScope,找出资源,我改。。。
很快菜单等资源都改好了

运行试试,感觉不错,但旁边怎么还有这么大的日文?
继续找,发现,居然是图片
算你狠,掏出PS,改了几张,换上去
啊~~~
好难看,字体好难看啊
我这个没审美观的人都觉得好难看啊

算了,这个汉化版就算了吧,还是不拿出去丢人了。

过了几个月,
一哥们跟我说,来,我有中文版,
我很想看看PS高人怎么换掉图片的,
结果,
结果,他只换了菜单,
还没我汉化的多。。。
心情大好,原来我不是最差的那个啦

其实,换掉菜单后,的确就容易入手一些了,
后来看到过比较好的版本,但加壳了,
也没空细细研究,高手还是普遍存在的

修改程序时间验证

上大学的时候,用过一款仿真软件,但授权已经过期了,
使用的时候必须将时间调回到两年前,
可是杀毒软件就不开心啦,彻底罢工,
唉,谁让当时USB病毒横行呢,

为了不用再调试间,加上当时对反向工程十分的痴迷,于是开始尝试破解该软件
当时什么都不太懂,想法也很单纯,把时间锁定到两年前
用传说中的神器OllyDBG,找到所有调用时间API的地方,
比想像的乐观的多,只有两个地方调用了时间API,
而且,API调用的后面有足够的空间让我用汇编将年份改掉
很快就搞定了
当时很没追求,还足足开心了半个月
过了半年后,发现,不用修改他的程序就能改掉
又过了半年后,发现,专门有软件修改程序时间,哈哈,坐井观天啦

现在想起来,当时软件保护做的真差,连壳都没加,唉~~