破解 CrackMe#1 [UBC] by bRaINbuSY

时间:2022-09-17 18:05:48

系统 : Windows xp

程序 : CrackMe#1

程序下载地址 :http://pan.baidu.com/s/1nuagj6h

要求 : 编写注册机

使用工具 :IDA & OD

可在看雪论坛中查找关于此程序的破文:http://bbs.pediy.com/showthread.php?t=29063

IDA载入程序,找出提示破解成功的字串“You cracked the UBC CrackMe#1 ! Please send your solution to ubcrackers@hotmail.com !”并定位关键代码:

  /.              push    ebp
|. 8BEC mov ebp, esp
|. 6A push
|. push ebx
|. 8BD8 mov ebx, eax
|. 33C0 xor eax, eax
0045880A |. push ebp
0045880B |. push
|. :FF30 push dword ptr fs:[eax]
|. : mov dword ptr fs:[eax], esp
|. E8 45FFFFFF call ; 获取用户名
0045881B |. 8D55 FC lea edx, dword ptr [ebp-] ; 取一段内存
0045881E |. 8B83 D0020000 mov eax, dword ptr [ebx+2D0]
|. E8 97CDFCFF call 004255C0 ; 获取序列号
|. 8B45 FC mov eax, dword ptr [ebp-] ; 取序列号
0045882C |. E8 43EFFAFF call ; F(序列号)
|. 3B05 44B84500 cmp eax, dword ptr [45B844]
|. 1B jnz short
|. B8 mov eax, ; ASCII "You cracked the UBC CrackMe#1 ! Please send your solution to ubcrackers@hotmail.com !"
0045883E |. E8 29C1FEFF call 0044496C
|. BA E8884500 mov edx, 004588E8 ; ASCII "CRACKED"
|. A1 3CB84500 mov eax, dword ptr [45B83C]
0045884D |. E8 9ECDFCFF call 004255F0
|. EB 0A jmp short 0045885E
|> B8 F8884500 mov eax, 004588F8 ; ASCII "Try Again !"
|. E8 0EC1FEFF call 0044496C

进入F(序列号):

  /$              push    ebp
|. 8BEC mov ebp, esp
|. 83C4 F0 add esp, -
0040777A |. push ebx
0040777B |. push esi
0040777C |. 33D2 xor edx, edx
0040777E |. F8 mov dword ptr [ebp-], edx
|. 8BD8 mov ebx, eax
|. 33C0 xor eax, eax
|. push ebp
|. DC774000 push 004077DC
0040778B |. :FF30 push dword ptr fs:[eax]
0040778E |. : mov dword ptr fs:[eax], esp
|. 8D55 FC lea edx, dword ptr [ebp-]
|. 8BC3 mov eax, ebx
|. E8 D9B1FFFF call ; 关键call
0040779B |. 8BF0 mov esi, eax
0040779D |. 837D FC cmp dword ptr [ebp-],
004077A1 |. je short 004077C6
004077A3 |. 8D55 F8 lea edx, dword ptr [ebp-]
004077A6 |. A1 90A44500 mov eax, dword ptr [45A490]
004077AB |. E8 A4D6FFFF call 00404E54
004077B0 |. 8B45 F8 mov eax, dword ptr [ebp-]
004077B3 |. push eax
004077B4 |. 895D F0 mov dword ptr [ebp-], ebx
004077B7 |. C645 F4 0B mov byte ptr [ebp-C], 0B
004077BB |. 8D55 F0 lea edx, dword ptr [ebp-]
004077BE |. 33C9 xor ecx, ecx
004077C0 |. pop eax
004077C1 |. E8 A6FCFFFF call 0040746C
004077C6 |> 33C0 xor eax, eax
004077C8 |. 5A pop edx
004077C9 |. pop ecx
004077CA |. pop ecx
004077CB |. : mov dword ptr fs:[eax], edx
004077CE |. E3774000 push 004077E3
004077D3 |> 8D45 F8 lea eax, dword ptr [ebp-]
004077D6 |. E8 0DC0FFFF call 004037E8
004077DB \. C3 retn

关键call:

  /$              push    ebx
|. push esi
|. push edi
|. 89C6 mov esi, eax
|. push eax
0040297A |. 85C0 test eax, eax ; 序列号为空?
0040297C |. je short 004029F1
0040297E |. 31C0 xor eax, eax
|. 31DB xor ebx, ebx
|. BF CCCCCC0C mov edi, 0CCCCCCC
|> 8A1E /mov bl, byte ptr [esi] ; 迭代序列号
|. |inc esi
0040298A |. 80FB |cmp bl, ; 字符 = 0x20?
0040298D |.^ F8 \je short ; 不是则退出循环
0040298F |. B5 mov ch,
|. 80FB 2D cmp bl, 2D ; Switch (cases 24..78)
|. je short 004029FF
|. 80FB 2B cmp bl, 2B ; ‘+’
|. je short 00402A01
0040299B |. 80FB cmp bl,
0040299E |. je short 00402A06
004029A0 |. 80FB cmp bl,
004029A3 |. je short 00402A06
004029A5 |. 80FB cmp bl,
004029A8 |. 5C je short 00402A06
004029AA |. 80FB cmp bl,
004029AD |. jnz short 004029C2
004029AF |. 8A1E mov bl, byte ptr [esi] ; Case 30 ('0') of switch 00402991
004029B1 |. inc esi
004029B2 |. 80FB cmp bl,
004029B5 |. 4F je short 00402A06
004029B7 |. 80FB cmp bl,
004029BA |. 4A je short 00402A06
004029BC |. 84DB test bl, bl
004029BE |. je short 004029E0
004029C0 |. EB jmp short 004029C6
004029C2 |> 84DB test bl, bl ; Default case of switch 00402991
004029C4 |. je short 004029FA ; 为空则跳转
004029C6 |> 80EB /sub bl,
004029C9 |. 80FB |cmp bl, ; 高于9?
004029CC |. 2C |ja short 004029FA
004029CE |. 39F8 |cmp eax, edi ; 高于0CCCCCCC?
004029D0 |. |ja short 004029FA
004029D2 |. 8D0480 |lea eax, dword ptr [eax+eax*] ; eax = eax + eax*4
004029D5 |. 01C0 |add eax, eax ; eax += eax
004029D7 |. 01D8 |add eax, ebx ; 累加
004029D9 |. 8A1E |mov bl, byte ptr [esi] ; 取下一个字符
004029DB |. |inc esi
004029DC |. 84DB |test bl, bl ; 不为空?
004029DE |.^ E6 \jnz short 004029C6
004029E0 |> FECD dec ch
004029E2 |. je short 004029F4
004029E4 |. 85C0 test eax, eax
004029E6 |. 7C jl short 004029FA
004029E8 |> pop ecx
004029E9 |. 31F6 xor esi, esi
004029EB |> mov dword ptr [edx], esi
004029ED |. 5F pop edi
004029EE |. 5E pop esi
004029EF |. 5B pop ebx
004029F0 |. C3 retn

再回去看看程序流程中的关键比对,将eax与45B844处的数据进行对比。这里,对45B844下写入断点,重新运行程序发现关键算法:

004587A2  |.  33C0          xor     eax, eax                         ;  清空eax
004587A4 |. mov dword ptr [ebx], eax ; 对内存置零
004587A6 |. 8B07 mov eax, dword ptr [edi] ; 取用户名
004587A8 |. E8 B7B2FAFF call 00403A64 ; 计算长度
004587AD |. 85C0 test eax, eax ; 为空?
004587AF |. 7E jle short 004587CA
004587B1 |. C706 mov dword ptr [esi],
004587B7 |> 8B17 /mov edx, dword ptr [edi] ; 取用户名
004587B9 |. 8B0E |mov ecx, dword ptr [esi]
004587BB |. 0FB6540A FF |movzx edx, byte ptr [edx+ecx-] ; 迭代字串
004587C0 |. C1E2 |shl edx, ; 逻辑左移3位
004587C3 |. |add dword ptr [ebx], edx ; 与内存值累加
004587C5 |. FF06 |inc dword ptr [esi] ; 循环变量自增
004587C7 |. |dec eax ; 长度-1
004587C8 |.^ ED \jnz short 004587B7
004587CA |> 8B07 mov eax, dword ptr [edi]
004587CC |. E8 93B2FAFF call 00403A64 ; 计算长度
004587D1 |. C1E0 shl eax, ; 长度逻辑左移3位
004587D4 |. add dword ptr [ebx], eax ; 与内存值累加
004587D6 |. 8B03 mov eax, dword ptr [ebx]
004587D8 |. C1E0 shl eax, ; 长度逻辑左移2位
004587DB |. mov dword ptr [ebx], eax ; 存入内存
004587DD |. 33C0 xor eax, eax
004587DF |. 5A pop edx
004587E0 |. pop ecx
004587E1 |. pop ecx
004587E2 |. : mov dword ptr fs:[eax], edx
004587E5 |. FA874500 push 004587FA
004587EA |> 8D45 FC lea eax, dword ptr [ebp-]
004587ED |. E8 F6AFFAFF call 004037E8
004587F2 \. C3 retn

至此,程序算法流程已经分析得差不多了。马上动手编写注册机。

我们直接打开http://www.cnblogs.com/ZRBYYXDM/p/5115596.html中搭建的框架,并修改OnBtnDecrypt函数如下:

void CKengen_TemplateDlg::OnBtnDecrypt()
{
// TODO: Add your control notification handler code here
CString str;
GetDlgItemText( IDC_EDIT_NAME,str ); //获取用户名字串基本信息。
int len = str.GetLength(); int FNameres = ;
if ( len != ){ //格式控制。
for ( int i = ; i != len ; i++ )
FNameres += str[i] << ; FNameres += len << ;
FNameres = FNameres << ; //模拟F(序列号):十进制转化十六进制
/*
CString serial = "1234"; int FSelres = 0;
for ( int j = 0 ; j != serial.GetLength() ; j++ ){
FSelres *= 10;
FSelres += ( serial[j] - 0x30 );
}
*/ if ( FNameres > 0x0CCCCCCC )
return ; CString PassWord;
PassWord.Format( "%d",FNameres );
SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
}
else
MessageBox( "用户名格式错误!" );
}

再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("crackme1_Keygen"));

运行效果:

破解 CrackMe#1 [UBC] by bRaINbuSY

破解 CrackMe#1 [UBC] by bRaINbuSY的更多相关文章

  1. 破解 crackme(&OpenCurlyDoubleQuote;不可逆&OpenCurlyDoubleQuote;函数)

    系统 : Windows xp 程序 : crackme 程序下载地址 :http://pan.baidu.com/s/1i41oh9r 要求 : 注册机编写 使用工具 : IDA Pro & ...

  2. 软件破解入门&lpar;暴力破解CrackMe&rpar;

    ---恢复内容开始--- 所谓暴力破解,就是通过修改汇编代码进而控制程序的运行流程,达到不需注册码也能正常使用软件的目的.相对于解出算法进而编写注册机,暴破的技术含量是比较低的.但也正是因为一本05年 ...

  3. 破解 crackme(完全拆解警告窗口)

    系统 : Windows xp 程序 : crackme 程序下载地址 :http://pan.baidu.com/s/1kUrbcAr 要求 : 注册机编写 & 去除Nag窗口 使用工具 : ...

  4. obdg反汇编破解crackme

    obdg是一个反汇编软件 直接将要反汇编的exe文件拖入或者file->open打开文件,等待一段时间就会显示出来 界面中分别为汇编代码(程序内存内容),寄存器内容,数据内存内容,栈内容 代码界 ...

  5. CommandoVM-虚拟机映像文件 &vert; VM打开直接用

    呵呵!自从火眼发布了这个CommandoVM,想必大家应该都挺激动,然而实际操作一下,基本炸裂-- 因为并没有给类似于kali这种直接安装的现成镜像,而是要通过github的脚本去完全网络安装 实际操 ...

  6. 逆向project实战--Acid burn

    0x00 序言 这是第二次破解 crackme 小程序,感觉明显比第一次熟练.破解过程非常顺利,差点儿是分分钟就能够找到正确的 serial,可是我们的目标是破解计算过程.以下将具体介绍. 0x01 ...

  7. 破解 Rith&&num;39&semi;s CrackMe &num;1(对比IDA查看动态分析中的MFC函数名)

    系统 : Windows xp 程序 : Rith's CrackMe #1 程序下载地址 :http://pan.baidu.com/s/1gecW9Qr 要求 : 注册机编写 使用工具 : IDA ...

  8. IOS CrackMe 破解学习

    一直在看别人如何破解一个app,下面自己也尝试着学习怎么去破解一个app的密码,下面是完整的过程. 准备工作: 一台mac或者pc安装了ssh客户端 一台越狱的iphone iphone上安装了ope ...

  9. 一道360 crackme的破解

    该crackme主要实现都在so中,用ida加载libqihoo.so,出现以下错误 第一个错误说明是节区头部表格的表项大小错误,第二个错误是指节区头部表格的大小或偏移值错误.不管它,点击“Yes”继 ...

随机推荐

  1. Python 代码覆盖率统计工具 coverage&period;py

    coverage.py是一个用来统计python程序代码覆盖率的工具.它使用起来非常简单,并且支持最终生成界面友好的html报告.在最新版本中,还提供了分支覆盖的功能. 官方网站: http://ne ...

  2. mysql int&lpar;3&rpar;与int&lpar;11&rpar;的区别

    总结,int(M) zerofill,加上zerofill后M才表现出有点点效果,比如 int(3) zerofill,你插入到数据库里的是10,则实际插入为010,也就是在前面补充加了一个0.如果i ...

  3. Python 正则表达式&lowbar;re模块&lowbar;使用compile加速

    使用compile加速 compile( rule [,flag] ) 将正则规则编译成一个Pattern对象,以供接下来使用. 第一个参数是规则式,第二个参数是规则选项. 返回一个Pattern对象 ...

  4. CentOS7上安装和使用Docker

    导读 Docker 是一个开源工具,它可以让创建和管理 Linux 容器变得简单,容器就像是轻量级的虚拟机,并且可以以毫秒级的速度来启动或停止.在本篇文章中我们将教你如何在 CentOS 7.x 中安 ...

  5. C&num;导出带有格式的Excel(列宽,合并单元格,显示边框线,加背景颜色等)

    源地址:http://blog.sina.com.cn/s/blog_74f702e60101au55.html 导出excel相关设置:http://blog.csdn.net/wanmingtom ...

  6. mozilla css developer center

    https://developer.mozilla.org/en-US/docs/Web/CSS

  7. devStack for Openstack dev Env

    devstack是一套用来给开发人员快速部署Openstack开发环境的脚本,其实对于整个安装过程没有什么好说的,因为脚本写的很完善,全程无脑式安装也没什么大问题,但是因为公司里的网络环境不给力,我的 ...

  8. php 简单的存在 (方法之间的神奇作用:容错)

    <span style="font-family:KaiTi_GB2312;font-size:18px;"><?php // 重载 class Person{ ...

  9. Unity 数据Json格式的转换

    把对象转换为字节序列的过程称为对象的序列化. 把字节序列化恢复为对象过程称为对象的反序列化. JSON格式的转换,是一大神给我说的,让我拿来存储数据库时对一些数据的处理,感觉特别好用.但是我并没有深入 ...

  10. spring boot 注解

    一级注解:(写在类名前面的)@RestController: 等价于在函数前面写@ResponseBody ,会直接返回要显示的内容 @ControllerString返回的是模板文件的名称. 二级注 ...