系统 : 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(已补上注册机)的更多相关文章

  1. 爆破unabexcm5fl(已补上注册机)

    系统 : Windows xp 程序 : unabexcm5fl 程序下载地址 :http://pan.baidu.com/s/1pJYaNUV 要求 : 爆破 使用工具 :OD 可在“PEDIY C ...

  2. 爆破vcrkme01(已补上注册机)

    系统 : Windows xp 程序 : vcrkme01 程序下载地址 :http://pan.baidu.com/s/1mh1n33y 要求 : 爆破 使用工具 :OD 可在“PEDIY Crac ...

  3. Android Studio精彩案例(六)《使用一个Demo涵盖补间动画所有知识》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 元旦假期里,闲的无事,看到美团加载数据的动画,就突想写个Demo把动画知识集成一下.后来想了想,还是直接用一个Demo来把所有动画知识 ...

  4. UWP DEP0700: 应用程序注册失败。[0x80073CF9] 另一个用户已安装此应用的未打包版本。当前用户无法将该版本替换为打包版本。

    最近电脑抽风,我在[应用程序和功能]中重置了以下我的App自然灾害,居然,搞出大新闻了. 它居然从列表中消失了... vs再次编译代码的时候,提示 严重性 代码 说明 项目 文件 行 禁止显示状态 错 ...

  5. 子查询 做where条件 做 from的临时表 ,做select的一个字段 等

    子查询 做where条件 做 from的临时表 ,做select的一个字段 等

  6. VMware 打开虚拟机出现另一个程序已锁定文件的一部分,进程无法访问

    打开虚拟机出现 另一个程序已锁定文件的一部分,进程无法访问 打不开磁盘"D:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位.vmdk"或 ...

  7. dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术 ...

  8. 一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库 RxJava,相当好

    https://github.com/ReactiveX/RxJava https://github.com/ReactiveX/RxAndroid RX (Reactive Extensions,响 ...

  9. DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

    DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库. 它是轻量级的,不依赖任何其他类库(如JQuery)并且高度可定制. 试试看! 将文件拖至此处或点击上传.(这仅仅是 dropzo ...

随机推荐

  1. 128. Longest Consecutive Sequence *HARD* -- 寻找无序数组中最长连续序列的长度

    Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...

  2. PHP生成word的三种方式

    摘要: 最近工作遇到关于生成word的问题 现在总结一下生成word的三种方法. btw:好像在博客园发表博客只要是标题带PHP的貌似点击量都不是很高(哥哥我标题还是带上PHP了),不知道为什么,估计 ...

  3. MVC中使用HTML Helper类扩展HTML控件

    文章摘自:http://www.cnblogs.com/zhangziqiu/archive/2009/03/18/1415005.html MVC在view页面,经常需要用到很多封装好的HTML控件 ...

  4. python登陆,注册小程序

    def login(username,password): ''' 用于用户登录 :param username: 用户输入用户名 :param password: 用户输入密码 :return: T ...

  5. Ibatis.Net 各种配置说明(二)

    一.各个配置文件的作用说明 providers.config:指定数据库提供者,.Net版本等信息. xxxxx.xml:映射规则. SqlMap.config:大部分配置一般都在这里,如数据库连接等 ...

  6. C-crash的方法

    #include <iostream> using namespace std; int main() { #if 0 //devide by 0 ; ; double d = i/j; ...

  7. Linux-设置环境变量

    一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“ /opt/au1200_rm/build_tools/bin”目录下, ...

  8. Hibernate中的一级缓存、二级缓存和懒加载

    1.为什么使用缓存 hibernate使用缓存减少对数据库的访问次数,从而提升hibernate的执行效率.hibernate中有两种类型的缓存:一级缓存和二级缓存. 2.一级缓存 Hibenate中 ...

  9. linux exec用法总结

    Linux中exec的用法总结 先总结一个表: exec命令 作用 exec ls 在shell中执行ls,ls结果显示结束后不返回原来的的目录中,而是/(根目录) exec <file 将fi ...

  10. JVM-对象的存活与死亡

    当Java虚拟机进行垃圾收集的时候,那么它必须要先判断对象,是否还存活,如果存活就不能对它进行回收.所以判断一个对象是否存活是Java虚拟机必须要实现的. 1.对象是否存活 1)引用计数器:给对象添加 ...