首页
社区
课程
招聘
[旧帖] [原创] 每日一破解(第4天) 江湖将会有我的传说 0.00雪花
发表于: 2012-8-6 16:29 1745

[旧帖] [原创] 每日一破解(第4天) 江湖将会有我的传说 0.00雪花

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

前言:
本来计划每天发表一个破解文章的,但是由于自身的懒惰,破解完以后就不想写文章,这个是程序员的惰性啊,以后一定要改正。请各位盆友监督监督。关于破解的软件名称是我本人重新命名的。好,现在进入正题

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



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


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


4.导航到Start 函数,也就是程序开始执行的地方,该程序第一步就创建了编号为100的 对话框,也就是本次要破解的对话框。


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按钮事件处理函数,这个函数名称是本人重新命名的,请注意。


6.导航进去 Btn_Test函数,该函数根据输入的Name 字段的内容生成Serial字符串,然后判断生成的Serial字符串是否和输入的Serial 字符串一致,一致则提示成功,不一致则提示失败。其中应用到的算法太简单了这里不做描述,直接给出C++ 实现代码



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.至此大功告成,庆祝一下。YETH!有什么问题可以交流交流,一起进步。

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 373
活跃值: (496)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
感谢commcomm 对前面帖子 的热情回复.
2012-8-6 16:52
0
雪    币: 141
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,我正愁IDA实战调试软件找不到呢,谢谢你的分享
2013-3-23 16:08
0
雪    币: 143
活跃值: (263)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
4
呵呵 得顶一个
2013-3-23 18:27
0
雪    币: 373
活跃值: (496)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
5
好久没有回来了
2013-3-29 17:34
0
雪    币: 93944
活跃值: (200219)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
6
2013-3-29 20:11
0
雪    币: 3343
活跃值: (1243)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
7
不错。。能学到东西,希望楼主继续!
2013-3-29 20:26
0
游客
登录 | 注册 方可回帖
返回
//