逆向工程及软件破解

一、软件逆向工程原理

软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等[1]。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为软件逆向工程技术。

现实中,人们并不总是完全需要逆向出目标软件的所有功能,如果那样的话将会是一个艰苦而漫长的过程。大多数情况下是意图通过对软件进行逆向,从中获取软件的算法,或破解软件及进行功能扩展等。

逆向工程流程

在对软件进行逆向工程研究的时候,一般会依照以下几个大的步骤来完成:

1、研究保护方法,去除保护功能。大部分软件开发者为了维护自己的关键技术不被侵犯,采用了各式各样的软件保护技术,如序列号保护、加密锁、反调试技术、加壳等。要想对这类软件进行逆向,首先要判断出软件的保护方法,然后去详细分析其保护代码,在掌握其运行机制后去除软件的保护。

2、反汇编目标软件,跟踪、分析代码功能。在去除了目标软件的保护后,接下来就是运用反汇编工具对可执行程序进行反汇编,通过动态调试与静态分析相结合,跟踪、分析软件的核心代码,理解软件的设计思路等,获取关键信息。

3、生成目标软件的设计思想、架构、算法等相关文档,并在此基础上设计出对目标软件进行功能扩展等的文档。

4、向目标软件的可执行程序中注入代码,开发出更完善的应用软件

软件逆向工程可以让人们了解程序的结构以及程序的逻辑,深入洞察程序的运行过程,分析出软件使用的协议及通信方式,并能够更加清晰地揭露软件机密的商业算法等。因此逆向工程的优势是显而易见的。

软件逆向工程的意义

1、由于软件生产技术水平还没有达到人们所期望的程度,所以从头开发软件已经不适应社会对软件需求的不断增长,为了避免重复劳动,提高软件生产的效率和质量,缓解软件危机,必须充分利用和改造现有软件,对现有软件进行再设计、再工程,使软件功能得到大幅提高以满足用户的需要,而再设计(Redesign)

和再工程(Reengineering)都是软件逆向工程的形式之一。再工程是指在现有系统基础上,修改系统并组装成新的形式。

2、目前运行的许多系统由于某些原因,例如其运行环境已改变,或者是根据业务的需要对其功能要进行调整,导致它们必须进行演化才能继续使用。这些系统在经历多年运行之后,包含了众多的知识,包括系统需求、设计决策和业务规则等,通过软件逆向工程将这些软件系统转化为易演化系统,是充分有效地利用这些有用资产的良好途径。软件逆向工程可以从这些系统的程序源代码出发,导出切实可用的信息。

3、在已发布的软件中,许多优秀软件生产厂家出于技术保护等原因没有向用户开放源代码或者不提供源代码,需要用户自己去恢复,此时对软件进行逆向工程研究是最好的方法。

4、现今的商业社会把软件科学纳入一种相对封闭的范畴,为了追求利润,一些软件业的霸主试图进行知识的垄断,它的直接体现就是鼓励普通用户和大多数程序员把软件看成“黑箱”,使得它们不去关心软件的运行机制,把软件的生产变成类似车间加工的一道道流程,却隔断了人们深入研究软件科学的通路。而作为开放源代码的前期工程,软件逆向工程对整个开放源代码工程有着至关重要的作用。

由此我们看出,软件逆向工程为软件技术的发展和相互学习、借鉴提供了一种很有效的技术手段,然而,由于受软件知识产权保护及相关法律法规的限制,软件逆向工程并不能像其它软件技术那样分开、透明地为大家所熟知、了解和广泛交流与应用。另外,软件逆向工程所涉及到的技术很多,它不仅要求逆向工程人员必须熟悉如操作系统、汇编语言、加解密等相关知识,同时还要具有丰富的多种高级语言的编程经验,熟悉多种编译器的编译原理,较强的程序理解和逆向分析能力等,这些都限制了软件逆向工程的发展。

二、逆向工程示例

1.了解软件逆向工程概念

2.了解Ida的使用

3.熟悉动态调试工具x64dbg使用

4.实现Crackme的破解:”适合破解新手的160个crackme练手

破解练习1

对系列号 和 序列号+名称 进行破解,并应用补丁生成破解后的程序

破解练习33

破解序列号,并写出注册机

#include <stdio.h>
#include <windows.h>

DWORD GetKey(DWORD dwCount);

void main()
{
char szUser【0x20】 = {0};
char szKey【0x20】 = {0};
int nLength = 0;
BOOL bContinue = TRUE;
while(bContinue)
{
printf("输入账号,账号必须在A-Z之间\n");
scanf("%s",szUser);
nLength = strlen(szUser);
if(nLength != 0)
{
for(int j=0;j<nLength;j++)
{
if(szUser【j】>='A'&&szUser【j】<='Z')
{
bContinue = FALSE;
continue;
}
else
{
bContinue = TRUE;
break;
}
}
}
}
DWORD dwUser = 0;
for(int i=0;i<nLength;i++)
{
dwUser += szUser【i】;
}
dwUser = dwUser ^ 0x5678;
DWORD dwCount = 1;
while(TRUE)
{
if(dwUser == GetKey(dwCount))
break;
dwCount++;
}
printf("%d\n",dwCount);

getchar();
getchar();
}

DWORD GetKey(DWORD dwCount)
{
char szTemp【0x20】 = {0};
DWORD dwKey = 0;
sprintf(szTemp,"%d",dwCount);
for(int i=0;szTemp【i】;i++)
{
dwKey = (dwKey*0xa) + (szTemp【i】-0x30);
}
return dwKey^0x1234;
}

三、总结

1.软件逆向工程的概念

软件逆向工程(Software Reverse Engineering)又称软件反向工程,是指从可运行的程序系统出发,运用解密、反汇编、系统分析、程序理解等多种计算机技术,对软件的结构、流程、算法、代码等进行逆向拆解和分析,推导出软件产品的源代码、设计原理、结构、算法、处理过程、运行方法及相关文档等。通常,人们把对软件进行反向分析的整个过程统称为软件逆向工程,把在这个过程中所采用的技术都统称为软件逆向工程技术。

2.IDA软件的作用及简单介绍

IDA是一个用于静态分析程序的软件。

所谓静态和动态就是指是否执行调试运行来处理。OllyDBG是进行修改调试,而IDA用于观察程序。有一些程序不适合动态处理,比如病毒木马程序,一旦执行就会导致意外。所以就有了静态处理的重要性。

3.怎么样破解软件

 通过字符串搜索(用出错的信息,例如: try again找到,判断序列号正确与否的代码,然后下断点, F7/F8执行代码跟踪,判断关键的判断语句。把判断语句修改成 跳过错误部分,让语句运行到正确的地方。就可以得到破解后的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值