谈谈商用保护的破解------来源于softworm

发表于:2007-07-04来源:作者:点击数: 标签:
Think like a cracker 。。。。。。 Think like a cracker 谈谈商用 保护的破解 这里的商用保护,指直接使用第三方的工具,利用其编程接口实现软件的保护部分,而非原作者从头开始自行 开发 ,比如Flexlm,SoftLocx等。直接在可执行文件上加壳的情况不在讨论

Think like a cracker 。。。。。。

Think like a cracker

谈谈商用保护的破解

   这里的商用保护,指直接使用第三方的工具,利用其编程接口实现软件的保护部分,而非原作者从头开始自行开发,比如Flexlm,SoftLocx等。直接在可执行文件上加壳的情况不在讨论之列。商用保护往往是众矢之的,研究的人比较多,在互联网上可以找到类似案例,结果是一损俱损,搞定一个,倒下一片。Flexlm就是最好的例子。使用dongle进行保护的,也有类似之处(但不尽相同)。

  破解商用保护,最重要的是尽可能地获取其资料,如果有正规的使用手册、演示代码等是最好的。这在破解中起着决定性的作用。

  破解第一步,就是仔细阅读待破解软件的文档,不要漏过任何蛛丝马迹,切不可一头扎进SoftIce或IDA中瞎找。很多时候从SoftIce和IDA Pro中费心劳神得出的东西,文档中讲得明明白白。使用商用保护的软件,其文档常常会有说明。如果没有,在跟踪以及阅读反汇编代码的过程中也一定会暴露出来。这时候应当立即停下破解工作,到网上搜索一切相关信息,最好能下载到保护软件的试用版本,以及查找是否有相关的破解案例。尽可能地了解该保护软件的使用方法,各种编程接口,各错误码的含义,研究其弱点。从实战经验看,只要掌握了保护软件的使用方式,一般都能发现其弱点。比如Softlocx,其检查软件的返回结果是个字符串,为“LICENSED”,“EVALUATION”,“EXPIRED”等等,应用软件根据这样的字符串来决定执行路径。这样的保护会强吗?
  
  破解商用保护,比较简单省力的方法是找到保护软件与被保护软件的连接点,打断其连接,强迫被保护的软件正常运行。这种方式一般需要修改其二进制代码,打个补丁。这是下策,非不得以不为之。
  
  上策嘛,当然是完全保留原有的保护机制,或是写个注册机,或是截取一个序列号或license,或是凑个keyfile。总之,以尽量不打补丁为原则。当然,这样做意味着要与专业对手交锋,难度大得多。很多时候要把加密算法搞懂,写出个逆运算,几乎是不可能的。有些算法根本不可逆。

  不过,可以换一个方式。Think like a cracker!我的办法是,把保护软件的资料好好研究,通过softIce跟踪,获取足够的数据,直接写个程序,调用保护软件,让它为我们生成一个合法的结果。这一招屡试不爽。
 

  以下的例子是个软件工程类的国外商业软件,名字隐去。本文是根据以前的破解笔记整理的,软件可能早已升过级了:-)。安装完运行时,出现一个license配置对话框,提示超期日期。另外有以下数据:

   Computer ID: 496861184
   Session ID: 286021360

   下面要求输入 Product Unlock Code。如果不输,可以Evaluation方式运行。


1. 在对主执行文件稍加分析后,即可将疑点集中到一个叫ETLicens.dll的动态链接库上。这个文件的文件名及其中的资源(包括Dialog,String等)是如此的露骨,简直就是crack的不二人选。其输出的函数也是如此。我以为就要在此解决战斗了:-)。实际上,也确实可以在此patch,以暴破搞定。但给人的感觉不完美,需要patch的位置较多,没有一个合适的着力点。

  在分析过程中可得到以下一些有趣的东西:

  1)一个反复出现的字符串“ERStudioRulez!!”。这是什么?
 
  2)会多次访问一个注册表项:
     LOCALMACHINE\Software\Classes\sysdskdrvf42175d63bd284,?
     
   另有一个对应的字符串“:LM:Software\Classes\sysdskdrvf42175d63bd284”。

  
  在这个Dll中花了不少工夫,结果完全弄偏了方向。注意到此Dll还使用了另一个Dll:KeyLbE32.dll。反编译一下这个文件,再用ResHacker看看,其CompanyName为“Concept Software, Inc.”。是另一家的东西?

2.到Google上查一下,可在http://www.softwarekey.com上下到此保护软件:Protection Plus V4.109,与KeyLbE32.dll中的版本信息完全一致。研究一下此软件的使用方式。
  Protection Plus只是SoftwareKey产品系列中的一个,暂且不管别的东西,先只看这一个。产品基本介绍如下:

  Control Applications:

  . Create demos, rentals, pay-per-use applications.
   . Immediate software activation via phone, fax, e-mail, or the Internet.
   . Extend a demo, rental, or lease for an additional period of time.
   . Turn on one or more menu options or applications in a suite.
   . Convert application from single-user mode to multi-user mode.
   . Protect using either fixed or floating network licensing.
   . Modify the number of allowed network workstations.
   . Convert from "lite" version to professional version.
   . Increase or decrease a counter.
   . Trigger any user-defined action.

   Enforce License Compliance:

   . Lock the application to run on the current computer or network server
   only.
   . Limit the number of allowed network users or computers.
   . Terminate rental or lease applications that are not paid.
   . Turn an illegal copy into a demo or disable it.
   . Force returned software or fraudulent purchases to stop working.

   Other Features:

   . Detects click backdating or demo reinstallation to gain additional usage.
   . Encrypt/decrypt user data.
   . Personalize and/or serialize without recompiling.
   . Extremely flexible programming interface means applications limited only
     by your imagination!

  看起来很强大,可供调用的函数很多:-)。这里就不一一列举。只提一下与crack直接相关的几个概念。

   . License Files

   License Files contain many data fields that allow you to store information to control the flow of execution in your application.  The fields can be initialized before sending your application using our Windows-based License File Editor application and/or can be manipulated by the application remotely using Trigger Codes. License Files may be stored in a regular file in any directory, the Windows registry, a Marx Software Security Crypto-Box Hardware Key, or on an Internet Web Server.  There are many character,string,numeric/bit, and date fields in the License File. Data ranges from pre-defined fields such as serial number, expiration date, and number of allowed network users, to user-defined fields.
  
  注意license的保存形式:可以是常规的文件,注册表项(回想一下1中的那个:-),在硬件狗中,或在Web服务器上。

  . Trigger Codes - Adds Remote Licensing Control

   The PLUS system has a mechanism to send one-time secure remote signals to your application while running on the Client's computer. The user contacts you and gives you 2 six to eight-digit numbers that are displayed on a dialog box on their computer. These numbers can be sent by phone, FAX, e-mail, etc.  In our Windows-based License File Editor application,these two numbers are entered; and, depending on what function you want to perform on their application, you return them one of 50 six to eight-digit numbers.  In addition to the remote signal sent, you can also send an encrypted number.  The encrypted number can contain data such as the number of allowed workstations, number of pay-per-use events, etc.

  想想那个Unlock Code。

  主要涉及的概念就这两个。函数很多,只要动手写个小程序,尝试几次,即可找到破解之道(破绽百出:-)。license配置对话框中的Computer ID是机器标识。Session ID没有直接的对应物,象是Trigger Event ID与Trigger Event Data加密组合的结果。在第一步中提到的两个数据含义如下:

 1)字符串“ERStudioRulez!!”为保护license文件的password:-)
 2)LOCALMACHINE\Software\Classes\sysdskdrvf42175d63bd284下就是保存在注册表中
   的license

 破解时的有些细节记不清了,笔记随手乱写不完整:-(,试了试生成自己的Unlock Code,当时没成功,好象是创建license时有的field没填对。干脆调用pp_copyadd直接设为合法的机器。至于为什么用了内嵌汇编语言的方式来调用函数,大概是有些参数拿不稳,要对照IDA中的使用方式吧(也记不清了:-)。这份代码是随手写的,能工作就没管了(未检测各函数的返回值),有点虎头蛇尾呵呵。

 以下为设置合法license的代码:

 ///////////////////////////////////////

 #include "stdafx.h"
 #include "ETLicense.h"

 CWinApp theApp;

 using namespace std;

 int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
 {
     int nRetCode = 0;

     HINSTANCE hCommProt=::LoadLibrary("KeyLbE32.dll");

     FARPROC pp_lfopen,pp_lfclose,pp_copyadd;

     pp_lfopen=::GetProcAddress(hCommProt,MAKEINTRESOURCE(0x31));
   pp_lfclose=::GetProcAddress(hCommProt,MAKEINTRESOURCE(0x2C));
     pp_copyadd=::GetProcAddress(hCommProt,MAKEINTRESOURCE(0xC));

   
   CString strSysDiskInfo(":LM:Software\Classes\sysdskdrvf42175d63bd284");
   char * lpszKeyName=strSysDiskInfo.GetBuffer(128);

     long hLicFile=0;
     char szPassword[]="ERStudioRulez!!";
     char *lpszPass=szPassword;
     
     _asm
     {
          lea eax,hLicFile
          push eax//存放句柄

          push lpszPass//license文件密码
          push 2//类型LF_REGISTRY
          push 0//license文件属性LF_CREATE_NORMAL
          push lpszKeyName //license文件名(注册表项)

          call pp_lfopen
     
      push 0x1D9D8000 //Computer ID,也可调pp_compno()获取
          push 2   //COPYADD_ERASEALL,删除现有值
          push hLicFile
          call pp_copyadd  //把我这台机器加为合法用户吧:-)

          push hLicFile
          call pp_lfclose  //关闭license文件
     }
     
     ::FreeLibrary(hCommProt);
     return nRetCode;
 }

 ////////////////////////////////////////////////

3.总结一下破解用Protection Plus保护的软件。

  先下载开发包,可以用IDA Pro的Flair做出Sig文件(我破解成功后就没干这个了,手懒:-)。拦截pp_lfopen函数,要访问license数据,必调此函数。在此可获取最重要的数据:

  . license文件名(与license位置相关)

  . license位置(可能是真正的文件名、注册表项、dongle或是一个网址,
    如果是个网址可能会麻烦些:-)
 
  . 用于保护license文件的password

  有了这些数据,能干什么?借用一下SoftwareKey的广告语:Limited only by your imagination!好好研究联机帮助吧:-)。

  以前在E文的破文中,经常可以见到一句话:“Think like a cracker”。随着破解的东西多了,慢慢积累一些经验,觉得这话大有深意。

  以我的理解,大概是指要善于揣摩保护者的想法。我也没法描述清楚,只是有点感觉,在破解的时候,要多从具体的代码中跳出来想想,把握大局,判断形势,决定正确的方向。能把这方面的东西表现在破文里,我想会更有意思。

  以下是以前破解的一个软件,比较旧了(整理以前的笔记得来的,做不到总用刚破解的东西来写文章)。

  是个股票分析类的软件,叫StockNT吧。背景如下:
  
  用户可从Internet下载,功能有限制(好象是数据不能更新)。用户向作者付款后,可从其网站下载一个叫formal.ini的文件,拷入安装目录,然后再联机注册,成功后即为正版用户。不能从别的机器拷贝,只能用以上方式成为正式用户。只能在一台机器上注册,若要把软件安装到别的机器上,必须先“联机注销”,安装后重新注册。


1.先来研究一下formal.ini。断在CreateFileA,很快就可以找到访问该文件的代码。简单的分析之后,可得到以下结论:

  文件长度仅18个字符,只使用了前16个,为16进制数字。可以用UltraEdit自己做一个,便于分析。假设文件内容为0123456789abcdef01,将前16字符转换为数字,结果为:
  
  76543210,fedcba98两个dword。

  其使用方式为:

  42A939  push 2
           push eax           //指向包含上述2个dword的buffer
           call f_Compute     //我取的名字:-)
           mov eax,[ebp-28h]  //还是放在那个buffer中的第一个值(计算结果)
           pop ecx
           cmp eax,[ebp-24h]//与第2个值比较
           pop ecx
           jnz l_TrialVersion

   即经过call的处理后得到的2个dword必须相等。

  现在来推测一下:虽然这个文件是付款之后才可获得,但还未“联机注册”,不会含有与用户相关的真正信息。也许,只是一个简单的计数,表示“第XXX个用户”。做的保护,只为避免谁都可以做一个formal.ini去注册。这个函数内的计算比较复杂,难以迅速弄清其算法。
   如何做出一个这样的文件?很容易想到暴力穷举。根据以上的推测,可以相信:我们只需给出一个dword的值,计算另一个dword即可。

   在上述地址设断点,断下后在SoftIce中手工输入代码:初始化一个dword为0x76543210,另一个为1。在循环中递增第2个值,找到符合条件的值或到达0xFFFFFFFF后,调用int 3。按F5开始计算,等待一段时间后,SoftIce弹出,得到的结果为0xEA0D4CAD。所以,可做出一个正确的formal.ini文件,内容为:

   01234567DAC4D0AE01//最后的"01"未用

2.首先,我不打算真的去“联机注册”(破解时,是在不能上网的机器上做的)。很快可以发现,有了formal.ini之后,运行时程序会访问安装目录下的Reg\Register.ini文件,这才是真正的keyfile。同样,从访问文件的代码可以看到,这个文件长度为36字符,格式与formal.ini相似,有2行。将文件内容读出后经过变换,与正确值对比。正确值是由用户机器的一些特征数据计算而来的,包括硬盘信息(与分区相关的数据),一些系统文件的时间戳,系统时间等等)。这就是所谓的只能安装在一台机器上的由来。

  结合静态分析,对代码稍加跟踪,可得到全部用于比较的正确值。问题是,这里做的是密文比较。Register.ini的数据经过与formal.ini一样的处理(每次取一行的16字符转换为数字),经上述的f_Compute的计算后才用于对比。拿到正确的结果,如何得到被f_Compute处理以前的数据?此函数计算太复杂,层层调用子函数,难以看清其计算方式,更不要说写出个反函数。

   利用前面formal.ini的数据做个测试,把结果作为参数放入buffer,f_Compute得到的结果并非是原来的参数,即此函数不是既可加密又可解密的双向函数,没有捷径可走。

   现在该怎么办?再来猜一猜,Think like a cracker呵呵。既然用户在获取formal.ini后,可以通过联机注册成为正式用户,那么,注册成功后,程序自己必定会有创建Reg目录,生成Register.ini的动作,也就是说,f_Compute的反函数必定已存在于代码之中。我们只要找到这个函数,把用于比较的正确值作为参数输入,经该函数处理的结果就是Register.ini的正确内容。

   如何找到该函数?有很多线索:与WinSock相关的函数调用,对CreateDirectoryA的调用,对"Register.ini"字符串的使用等等。总之,找到了,在这个过程中随时可用formal.ini的数据来测试。要注意的是,要手动修改WinSock相关函数调用的返回值,否则我们的目标函数执行不到(实际上,只要执行了该函数,破解也就成功了:-)。

  最后得到Register,ini的正确数据为:

  37BC43727C4B3BA801
  E10226146C01741601//每行最后2个字符未用

  多说两句,我不太喜欢列出大段的代码,我觉得对阅读者没什么用。尽量说明破解过程中的一些思路想法可能更有意思。各位大虾以为如何?

原文转自:http://www.ltesting.net