Bxm做的第一个CrackMe(已补上注册机)
系统 : Windows xp
程序 : Bxm_CrackMe1
程序下载地址 :http://pan.baidu.com/s/1pK0a0xt
要求 : 分析算法
使用工具 :OD
可在看雪论坛中查找关于此程序的讨论:传送门
OD载入程序,利用插件查看字串表,双击“破解成功”的字串进入关键算法:
|. push eax ; /src
|. 8D45 D0 lea eax, dword ptr [ebp-] ; |
0040240A |. push eax ; |dest
0040240B |. E8 24EDFFFF call <jmp.&MSVCRTD.strcpy> ; \strcpy
|. 83C4 add esp,
|. 8D4D D0 lea ecx, dword ptr [ebp-] ; 取出字串地址
|. push ecx ; /s
|. E8 1EEDFFFF call <jmp.&MSVCRTD.strlen> ; \strlen
0040241C |. 83C4 add esp,
0040241F |. E8 mov dword ptr [ebp-], eax ; 保存长度
|. C745 EC >mov dword ptr [ebp-], ; 取出一段内存置零
|. EB jmp short
0040242B |> 8B55 EC /mov edx, dword ptr [ebp-]
0040242E |. 83C2 |add edx,
|. EC |mov dword ptr [ebp-], edx ; 循环变量自增
|> 8B45 EC mov eax, dword ptr [ebp-]
|. 3B45 E8 |cmp eax, dword ptr [ebp-] ; 迭代字串完毕则跳转
0040243A |. 7D |jge short 0040244E
0040243C |. 8B4D EC |mov ecx, dword ptr [ebp-]
0040243F |. 0FBE540D D0 |movsx edx, byte ptr [ebp+ecx-] ; 取出字符
|. 8B45 F8 |mov eax, dword ptr [ebp-]
|. 03C2 |add eax, edx ; 累加
|. F8 |mov dword ptr [ebp-], eax ; 保存结果
0040244C |.^ EB DD \jmp short 0040242B
0040244E |> 8B4D F8 mov ecx, dword ptr [ebp-]
|. F7D9 neg ecx ; 对结果进行求补运算
|. 8B55 F8 mov edx, dword ptr [ebp-]
|. E8 add edx, dword ptr [ebp-] ; 结果加上用户名字串的长度
|. 0FAFCA imul ecx, edx ; 相乘
0040245C |. 894D F4 mov dword ptr [ebp-C], ecx ; 保存结果
0040245F |. 8B4D FC mov ecx, dword ptr [ebp-]
|. 83C1 add ecx,
|. E8 2AFBFFFF call <jmp.&MFC42D.#>
0040246A |. push eax ; /src
0040246B |. 8D45 B8 lea eax, dword ptr [ebp-] ; |
0040246E |. push eax ; |dest
0040246F |. E8 C0ECFFFF call <jmp.&MSVCRTD.strcpy> ; \strcpy
|. 83C4 add esp,
|. C745 B0 >mov dword ptr [ebp-],
0040247E |. 8D4D B8 lea ecx, dword ptr [ebp-]
|. push ecx ; /s
|. E8 B3ECFFFF call <jmp.&MSVCRTD.strlen> ; \strlen
|. 83C4 add esp,
0040248A |. 83E8 sub eax, ; 长度-1
0040248D |. B4 mov dword ptr [ebp-4C], eax ; 保存
|. EB jmp short 0040249B
|> 8B55 B4 /mov edx, dword ptr [ebp-4C]
|. 83EA |sub edx, ; 循环变量自减
|. B4 |mov dword ptr [ebp-4C], edx
0040249B |> 837D B4 cmp dword ptr [ebp-4C], ; 迭代完毕则跳转
0040249F |. 7C |jl short 004024C3
004024A1 |. 8B45 B4 |mov eax, dword ptr [ebp-4C]
004024A4 |. 0FBE4C05 B8 |movsx ecx, byte ptr [ebp+eax-] ; 倒序取字符
004024A9 |. 83E9 |sub ecx, ; 转化为十进制
004024AC |. 0FAF4D B0 |imul ecx, dword ptr [ebp-] ; 相乘
004024B0 |. 8B55 F0 |mov edx, dword ptr [ebp-]
004024B3 |. 03D1 |add edx, ecx
004024B5 |. F0 |mov dword ptr [ebp-], edx ; 保存累加结果
004024B8 |. 8B45 B0 |mov eax, dword ptr [ebp-]
004024BB |. 6BC0 0A |imul eax, eax, 0A ; eax * 0A
004024BE |. B0 |mov dword ptr [ebp-], eax ; 再存回去
004024C1 |.^ EB CF \jmp short
004024C3 |> 8B4D F0 mov ecx, dword ptr [ebp-] ; 取结果
004024C6 |. 6BC9 FF imul ecx, ecx, - ; 取相反数
004024C9 |. 894D F0 mov dword ptr [ebp-], ecx ; 再存回去
004024CC |. 837D E8 cmp dword ptr [ebp-], ; 用户名长度为0?
004024D0 |. 2F je short ; 为0则破解失败
004024D2 |. 8B55 F0 mov edx, dword ptr [ebp-]
004024D5 |. 0FAF55 F0 imul edx, dword ptr [ebp-] ; 相反数 * 相反数
004024D9 |. 8B45 F0 mov eax, dword ptr [ebp-] ; 取出结果
004024DC |. 0FAF45 E8 imul eax, dword ptr [ebp-] ; 结果乘以用户名长度
004024E0 |. 8B4D F4 mov ecx, dword ptr [ebp-C] ; 取F(用户名)
004024E3 |. 03CA add ecx, edx ; 累加之前的结果
004024E5 |. 03C1 add eax, ecx
004024E7 |. 85C0 test eax, eax ; eax为0?
004024E9 |. jnz short ; 不为0则破解失败
004024EB |. 6A push
004024ED |. push ; 恭喜你
004024F2 |. push ; 破解成功!
004024F7 |. 8B4D FC mov ecx, dword ptr [ebp-]
004024FA |. E8 71ECFFFF call <jmp.&MFC42D.#>
004024FF |. EB jmp short
|> 6A push
|. push ; 破解失败
|. push ; 重试?
0040250D |. 8B4D FC mov ecx, dword ptr [ebp-]
|. E8 5BECFFFF call <jmp.&MFC42D.#>
算法比较简单,就不一一说明了,直接修改4024E9处的跳转指令就可以完成爆破。
有兴趣的朋友可以尝试写出注册机。
-------------------------------------------------------------------------------------------------------------------
既然算法简单,那就尝试着把注册机写出来吧。该cm采用了二元函数加密,检测F(用户名,密钥)==0来判断是否是正确的注册码。
我们直接打开之前搭建的框架,并修改OnBtnDecrypt函数如下:
void CKengen_TemplateDlg::OnBtnDecrypt()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText( IDC_EDIT_NAME,str ); //获取用户名字串基本信息。
int len = str.GetLength(); if ( len != ){ //格式控制。
SetDlgItemText( IDC_EDIT_PASSWORD,str ); unsigned int sum = ;
int FUserName;
for ( int i = ; i != len ; i++ )
sum += str[i];
FUserName = (~sum + ) * (sum + );
/*
//模拟F(Serial)
CString Serial = "12345";
int product = 1;
int SerialLen = Serial.GetLength() - 1; sum = 0;
for ( ; SerialLen != -1 ; SerialLen-- ){
sum += (Serial[SerialLen] - 0x30 ) * product; //把字符串转化成对应的数值
product *= 10;
} //取相反数
sum *= -1;
//X^2+bx+c = 0
if ( sum * sum + sum * len + FUserName == 0 )
MessageBox( "注册成功!" );
*/
int delt = len*len-**FUserName;
if ( delt < ) //方程是否无根?
{
SetDlgItemText( IDC_EDIT_PASSWORD,"方程无解!无法找出注册码!" );
return ;
}
//解方程
int x = ((double)-len-sqrt(delt))/(double)(*);
x = -x; CString PassWord;
PassWord.Format( "%d",x );
SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
}
else
MessageBox( "用户名格式错误!" );
}
再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("bxm-firstcm_Keygen"));
运行效果:

Bxm做的第一个CrackMe(已补上注册机)的更多相关文章
- 爆破unabexcm5fl(已补上注册机)
系统 : Windows xp 程序 : unabexcm5fl 程序下载地址 :http://pan.baidu.com/s/1pJYaNUV 要求 : 爆破 使用工具 :OD 可在“PEDIY C ...
- 爆破vcrkme01(已补上注册机)
系统 : Windows xp 程序 : vcrkme01 程序下载地址 :http://pan.baidu.com/s/1mh1n33y 要求 : 爆破 使用工具 :OD 可在“PEDIY Crac ...
- Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...
- UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。
最近电脑抽风,我在[应用程序和功能]中重置了以下我的App自然灾害,居然,搞出大新闻了. 它居然从列表中消失了... vs再次编译代码的时候,提示 严重性 代码 说明 项目 文件 行 禁止显示状态 错 ...
- 子查询 做where条件 做 from的临时表 ,做select的一个字段 等
子查询 做where条件 做 from的临时表 ,做select的一个字段 等
- VMware 打开虚拟机出现另一个程序已锁定文件的一部分,进程无法访问
打开虚拟机出现 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘"D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位.vmdk"或 ...
- dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.
http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...
- 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好
https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...
- DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.
DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库. 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制. 试试看! 将文件拖至此处或点击上传.(这仅仅是 dropzo ...
随机推荐
- Android selector选择器的使用
通常按钮在点击前和后有两种状态,比如点击前为蓝色,点击后为灰色,且不再响应点击事件. 如果不使用selector选择器,点击后,就需要在程序中进行以下的类似操作 button1.setBackgrou ...
- 数据库与SQL语言
数据库(DB) :长期储存在计算机中.有组织.可共享的数据的集合. 特点:(1)数据按一定的数据模型组织.描述和储存:(2)较小的冗余度:(3)数据独立性较高:(4)易扩展:(5)可共享(不同用户可按 ...
- ASP.NET-【状态管理】-Cookie小结
Cookie路径 谷歌浏览器 依次点击设置--高级选项--内容设置--cookies--选择“显示cookies和其他网站数据”按钮就可以看到了 C:\Users\Administrator\Loca ...
- 使用SMSManager短信管理器实现短信群发
import java.util.ArrayList; import android.os.Bundle;import android.provider.ContactsContract;import ...
- 如何在 Ubuntu 15.04 系统中安装 Logwatch
大家好,今天我们会讲述在 Ubuntu 15.04 操作系统上如何安装 Logwatch 软件,它也可以在各种 Linux 系统和类 Unix 系统上安装.Logwatch 是一款可定制的日志分析和日 ...
- [Js]Ajax
一.什么是Ajax 不刷新的情况下读取数据或提交数据 (最早出现ajax:谷歌地图,拖动一下出现一片新的视野) 应用:用户注册.在线聊天.微博 特性:只能从服务器上去读取数据(所以我们需要配置自己的服 ...
- mysql 远程连接
4.现在如果用你电脑上的终端进行MySQL连接时,有可能出现如下错误: MySQL远程连接ERROR 2003 (HY000):Can't connect to MySQL server on'XXX ...
- JS编码,解码. asp.net(C#)对应解码,编码
escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z encodeURI不编码字符有82个:!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@ ...
- printf的格式输出
格式字符 意义 d 以十进制形式输出带符号整数(正数不输出符号) o 以八进制形式输出无符号整数(不输出前缀0) x,X 以十六进制形式输出无符号整数(不输出前缀Ox) u 以十进制形式输出无符号整数 ...
- 指针属性直接赋值 最好先retain 否则内存释放导致crash
//先释放之前的 YK_RELEASE_SAFELY(_selectedDate); //retain新的 _selectedDate = [aDate retain]; NSString 属性的好像 ...