[软件名称]: 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 探索篇!