邪恶八进制信息安全团队技术讨论组's Archiver

风泽 2006-9-28 20:19

[原创]鸟儿学破解系列文章之三 软件分析看透你的心

文章作者:风泽 [E.S.T]
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])

[b]注意:本文章已经于去年发于《黑客手册》,如有转载请尊重版权,勿漏转文章作者,商业引用请与作者联系。[/b]

   在上一期我们学习了软件的暴破和动态跟踪两种方法来破解软件,这两种方法也是我们常用的,今天我们要学习的就是将程序融合到破解当中,这样既破解了软件限制,也练习了编程技术。

[b][color=red]练习目标:[/color][/b]
[color=blue]1. 天新网页批量修改器
2.受保护的WORD文档[/color]

[b][color=red]练习目的:[/color][/b]
[color=blue]破解限制[/color]

[b][color=red]实现方法:[/color][/b]
[color=blue]C语言编程[/color]

好了,知道我们要做什么了后我们就开始向目的地前进吧。

[b][color=red][天新网页批量修改器]:[/color][/b]
   这个软件是Sunlion给我的,说软件有使用次数限制。对于这样的软件我们一般考虑的就是监视注册表,因为很多软件的使用次数都是记录在注册表中的。开工!

[b][align=center]一般流程[/align][/b]

[quote]Regshot[注册表快照1]---->运行需要破解软件---->Regshot[注册表快照1] ---->比较快照[/quote]

   按照流程做了N次都没发现任何有价值的东西,于是使用W32ASM反汇编软件,由于软件是VB写的,没发现什么特别有价值的跳转,但在串式数据参考中发现软件对注册表是进行了操作,发现了几个键值。于是运行了N次软件(N>30),也没提示什么限制嘛~~,为什么人家有提示?难道软件认识人?是不是我没有使用的缘故呢?继续根据流程,但运行软件的时候使用了他的功能,哈哈~~这个时候效果出来了。比较注册表后发现:

[color=blue]添加键值:1
----------------------------------
HKEY_USERS\S-1-5-21-2025429265-1326574676-725345543-500\Control Panel\Desktop\ResourceRemote\XT1: ".18"[/color]

再看看我们参考内容:
[attach]4903[/attach]

很简单,比较出来了吧,根据最后测试这个就是对软件使用记数的键值,二话不说删除!哈哈~软件没提示了。找到了方法,可是实施起来比较麻烦,不可能我们每到用完了后再去删除那个键值吧。现在有2个简便的方法:

[color=blue]1.   REG文件,内容如下(程序使用20次后就导入一次,比较麻烦):[/color]
[quote]Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Control Panel\Desktop\ResourceRemote]
"XT1"=".19"[/quote]

[color=blue]2.   程序代码(直接使用此程序,无任何负担)[/color]

[quote]
#include <stdio.h>
#include <windows.h>
int regdel()
    {
      HKEY hkresult;
      LPCTSTR data="Control Panel\\Desktop\\ResourceRemote";

      RegOpenKeyEx( HKEY_CURRENT_USER,      //打开注册表进行操作  
                        data, 0,KEY_ALL_ACCESS,
                        &hkresult );
      RegDeleteValue( hkresult,"XT1"); //删除XT1键值
      RegCloseKey(hkresult);
    }

void main(void)
     {
       regdel();
       if(WinExec("天新网页批量修改器.exe",SW_SHOW)==ERROR_FILE_NOT_FOUND)
           {  
             printf("错误! 找不到天新网页批量修改器!\n");
           }   
       exit(1);
      }
[/quote]

基本代码就是这样,我们以后可以直接执行这个程序,程序就删除指定键值后启动天新网页批量修改器,就不必在顾虑次数限制了。

[b][color=red][受保护的WORD文档][/color][/b]
    微软的WORD为我们工作提供了很多方便,我这篇文章也是在Word下写的,为了不让Word文档随意编辑和修改,微软为我们提供了文档保护功能,可惜这个功能并不是那么完美。网络上已经出现了相关破解方法,可是当我按照他的方法寻找密码的时候却没有找到,也许是OFFICE的版本不同吧(我的是Microsoft OFFICE 2000 Premium),不管他了,我们自己动手来寻找密码吧。
首先我们建立一个WORD文档,复制成3份,并进行改名(名字最好是比较简单的)
  [attach]4904[/attach]
现在我们分别对这3个Word文档保护:
  [attach]4905[/attach]
我们将1.doc和2.doc设置保护密码为111后保存,将3.doc的保护密码设置为112保存,设置这样的密码主要是为了比较的时候方便,两个密码差别很大的话会很麻烦的。
现在我们基本工作已经完成了,接下来就是比较这些东西了,微软为我们提供了一个很好的程序FC.exe,我们就拿它来为我们服务吧。OK!我们讲3个Word文档改后缀名为EXE的文件来比较(不改会出现乱码)。
  [attach]4906[/attach]
这个时候C盘下面就出现了3个TXT文件,打开比较一下。
  [attach]4907[/attach]
很明显上图兰色部分是1.doc和2.doc没有的,这样说明这个地方很有可能就是密码的存贮地,赶快拿出UltraEdit打开3.doc,找到相关地址:
  [attach]4908[/attach]
将7ECFBC1E修改成00000000保存文件,打开保存的文件,找到解除保护,想要的结果出来了,工具栏上禁止已久的按扭亮了起来,OK!成功了。

  我们最后还是要提到程序,和上面的程序相比要用程序实现这个修改功能是比较麻烦的,但也是一劳永逸的啊。OK~~为了这个一劳永逸咱就努力一把。

程序需要实现的主要功能有2个:
[color=blue]1.   定位密码的偏移地址
2.   修改密码为00000000[/color]

[quote]
void CWORDDlg::ScanPassword(const char *file,FILE *fp,long offset,int length,long offsetend) //读取指定地址代码,判断是否符合要求
{
   char *rvir;
   CString temp;

   if(fp!=NULL)
   {
      if(offset - length<=offsetend) //判断偏移地址是否比结束地址小
      {
        fseek(fp,offset,SEEK_SET);  //
        rvir=new char[length];     
        fread(rvir,length,1,fp);  //读区相关地址的代码  
        temp.Format("%x%x%x%x%x%x%x%x",rvir[0],rvir[1],rvir[2],rvir[3],rvir[4],rvir[5],rvir[6],rvir[7]);

        if(memcmp("30000003",temp,length)==0) //判断代码是否为"30000003"
        {
          //偏移地址向前移动5位
           offset=offset-5;
          //调用ClsPassword来清除密码
           if(ClsPassword(file,offset,4)) MessageBox("密码清除成功,请打开Word文挡直接清除保护!","注意",MB_OK|MB_ICONINFORMATION);
        }

       delete[] rvir;               
      }
   }
}

////清除密码函数
bool CWORDDlg::ClsPassword(const char *file,long offset, int length)
  {
    char rvir[]={0x00,0x00,0x00,0x00};
    FILE *fp = NULL;
    bool result=false;

    if((fp=fopen(file,"rb+"))!=NULL) //打开WORD文件
    {
      fseek(fp,offset,1);    //指针指向指定地址
      fwrite(rvir,length,1,fp); //替换代码
      fclose(fp);   
      result=true;
    }
    return(result);
  }

int CWORDDlg::Crackword(const char *file)
  {
   FILE *fp;
   long offset;

   fp=fopen(file,"rb"); //打开WORD文件
   fseek(fp,0,SEEK_END); //指向文件最后
   long offsetend=ftell(fp); //获取最后的偏移地址
   for(offset=0;offset<offsetend;offset++) //开始偏移地址一直循环到最后
   {
      ScanPassword(file,fp,offset,9,offsetend);
   }

   fclose(fp);
   return 0;
  }[/quote]

    虽然程序比较麻烦了点,但看做了解释后就很简单了,这个程序稍微做一下修改可以用在很多地方,比如爆破的时候自己写个爆破机或读取相关地址的代码等等,就看你个人的发挥了。

[b]总结:今天我们介绍了监视注册表和文件比较这两种破解方法,虽然简单,但在破解中却很实用,顺便我们也写出了个性极强的“注册机”。[/b]

页: [1]
© 1999-2008 EvilOctal Security Team