从菜鸟到高手的逆向之路 第1天

[软件名称]: CrackMeDay4 
[应用平台]:Win9X/NT/2000/XP
[软件大小]:8K
[破解声明]:为了检验自己的逆向破解能力,请求斑竹给个邀请码,鼓励我继续写下去。顺便感谢一下党,感谢国家,感谢我们家的曾曾。
[破解工具]:PEiD,IDA 5.5,PE Explore
[作者]:INightElf
[破解日期]:2012-08-06

前言:

(其实这篇文章是本人发表在看雪论坛的,顺便刊载在本人的博客园)
本来计划每天发表一个破解文章的,但是由于自身的懒惰,破解完以后就不想写文章,这个是程序员的惰性啊,以后一定要改正。请各位盆友监督监督。关于破解的软件名称是我本人重新命名的。好,现在进入正题

1.查壳,用PEid 检测,编译器为MASM32 / TASM32,无壳。

名称:  1.jpg
查看次数: 23
文件大小:  63.6 KB

2.用PE Explore 查看软件的资源,如图。可见该软件有两个对话框,其中编号为100的对话框为主要窗口, 验证输入的Name 和Serial是否正确。请记下Name控件的ID 为200,Serial 控件的ID 为201,Test按钮控件为300,Info 按钮ID 为301,Exit 按钮为302。这是为了后面的反汇编代码中处理按钮消息做准备,请注意这里的ID 号是10进制。
名称:  2.jpg
查看次数: 22
文件大小:  103.7 KB

3.用IDA 反汇编软件,用MASM32编译的软件比较简单,没有什么多余的函数,所以这种软件的整体框架比较简单。

点击图片以查看大图

名称:	3.jpg
查看次数:	0
文件大小:	184.2 KB
ID:	69444
4.导航到Start 函数,也就是程序开始执行的地方,该程序第一步就创建了编号为100的 对话框,也就是本次要破解的对话框。
名称:  4.jpg
查看次数: 22
文件大小:  83.8 KB

5. 函数 DialogFunc为对话框的消息处理函数,导航,并截取关键的代码部分。在本函数中,利用到前面步骤2控件的ID号,并根据相应的信息对代码进行注释。并查询关键的消息编号。;例如
#define WM_DESTROY                      0x0002  销毁窗口消息
#define WM_CLOSE                        0x0010  关闭窗口消息
#define WM_INITDIALOG                   0x0110  初始化窗口消息
#define WM_COMMAND                      0x0111  发送命令消息,一般控件按钮消息都是通过这个命令发送的。
由于Test控件的ID号为300,根据汇编代码可断定 Btn_Test为 Test按钮事件处理函数,这个函数名称是本人重新命名的,请注意。

点击图片以查看大图

名称:	5.jpg
查看次数:	0
文件大小:	177.7 KB
ID:	69446
6.导航进去 Btn_Test函数,该函数根据输入的Name 字段的内容生成Serial字符串,然后判断生成的Serial字符串是否和输入的Serial 字符串一致,一致则提示成功,不一致则提示失败。其中应用到的算法太简单了这里不做描述,直接给出C++ 实现代码
名称:  6.jpg
查看次数: 22
文件大小:  73.7 KB

名称:  7.jpg
查看次数: 22
文件大小:  131.8 KB
7.下面直接粘贴C++代码实现的注册机,并在把源码包含在附件上.
  // TODO: 在此添加控件通知处理程序代码
  UpdateData(true);  

  //生成的密码
  char szPassword[256];
  memset((void *)szPassword,0x00,sizeof(szPassword));  


  char  szName[256] ;  
  //获取输入Name 的长度
  int szNameLen =m_Name.GetLength();


  memset((void *)szName,0x00,sizeof(szName));  
  memcpy(szName,m_Name,szNameLen);

  BYTE SpaceKey = 0x20; //空格键
  int szNameSum = 0; //Name 字符ANSI值之和

  //计算Name 字符串的Ansi 码值和
  for(int i =0;i< szNameLen;i++)
  {

    if(szName[i] != SpaceKey )    
      szNameSum  = szNameSum  + (BYTE)szName[i] * 4;
  }


  //序列号的第二段字符串
  int RefSum = 0x654789;
  for(int i =0;i<szNameLen;i++)
  {
    --RefSum;   
    RefSum = RefSum*2 + RefSum; 
    --RefSum;
  }


  //生成Serial字符串
  char szSerial[128]={0}; 
    sprintf(szSerial,"BS-%lX-%lu",RefSum,szNameSum);

  m_Serial = szSerial;

    UpdateData(false);

注册图
名称:  8.jpg
查看次数: 22
文件大小:  52.3 KB

8.至此大功告成,庆祝一下。YETH!有什么问题可以交流交流,一起进步。

 

posted on 2012-08-07 15:28  PeterBin  阅读(405)  评论(2)    收藏  举报