系统 : Windows xp

程序 : RCA_CRACKME

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

要求 : 注册机编写

使用工具 : IDA Pro & OD

可在“PEDIY CrackMe 2007”中查找关于此程序的讨论,标题为“RCA Crackme 简单分析”。

运行程序输入测试用户名密码,准备进行测试。发现check it!!!按钮被隐藏了,无法单击。怀疑这里用了隐藏按钮窗口的API函数,这里我们使用IDA载入程序,发现左侧函数名称中的确有“EnableWindow”函数。双击定位,双击交叉参考进入程序调用它的位置:

.text:                 push    3EEh            ; nIDDlgItem
.text: push [ebp+hDlg] ; hDlg
.text:0040106C call GetDlgItem
.text: mov [ebp+hWnd], eax
.text: or eax, eax
.text: jnz short loc_401087
.text: push ; bEnable
.text:0040107A push [ebp+hWnd] ; hWnd
.text:0040107D call EnableWindow
.text: jmp loc_40112A
.text: ; ---------------------------------------------------------------------------
.text:
.text: loc_401087: ; CODE XREF: DialogFunc+36j
.text: push ; bEnable
.text: push [ebp+hWnd] ; hWnd
.text:0040108C call EnableWindow
.text: jmp loc_40112A

可以看到,程序调用GetDlgItem的返回值做判断,根据参数不难发现,这里的GetDlgItem是WinAPI函数。打开OD,将401076处的代码改成“jz short 00401087”即可解除隐藏按钮。

接着一开始,我们输入测试用户名密码,并根据提供的错误字串找到关键算法:

0040115E  |.              push    edi                              ; /String => ""
0040115F |. E8 call <jmp.&kernel32.lstrlenA> ; \lstrlenA
|. 8BD8 mov ebx, eax ; 用户名长度保存在ebx中
|. 33C0 xor eax, eax
|> /push eax
|. |push ebx ; 长度入栈
0040116A |. |push edi ; 字串地址入栈
0040116B |. 0FBE0C38 |movsx ecx, byte ptr [eax+edi] ; 逐个取字符
0040116F |. |push ecx ; /<%x>
|. |push ; |Format = "%x"
|. |push ; |s = CrackMe.00403168
0040117A |. E8 D3000000 |call <jmp.&user32.wsprintfA> ; \wsprintfA
0040117F |. 83C4 0C |add esp, 0C ; 平衡堆栈
|. |push ; /StringToAdd = ""
|. |push ; |ConcatString = ""
0040118C |. E8 0F010000 |call <jmp.&kernel32.lstrcatA> ; \lstrcatA
|. 5F |pop edi
|. 5B |pop ebx
|. |pop eax
|. |inc eax ; 循环变量自增
|. 3BC3 |cmp eax, ebx
|.^ 7C CF \jl short
|. push ; /String2 = ""
0040119E |. push ; |String1 = ""
004011A3 |. E8 FE000000 call <jmp.&kernel32.lstrcmpA> ; \lstrcmpA
004011A8 |. 0BC0 or eax, eax
004011AA |. 4A jnz short 004011F6
004011AC |. 6A push ; /Style = MB_OK|MB_APPLMODAL
004011AE |. push ; |Title = "Reverse Engineering Association"
004011B3 |. push ; |Text = "Congratulation! You've done with it"
004011B8 |. FF75 push dword ptr [ebp+] ; |hOwner
004011BB |. E8 C2000000 call <jmp.&user32.MessageBoxA> ; \MessageBoxA
004011C0 |. EC030000 push 3EC ; /ControlID = 3EC (1004.)
004011C5 |. FF75 push dword ptr [ebp+] ; |hWnd
004011C8 |. E8 A3000000 call <jmp.&user32.GetDlgItem> ; \GetDlgItem
004011CD |. FC mov dword ptr [ebp-], eax
004011D0 |. 6A push ; /Enable = FALSE
004011D2 |. FF75 FC push dword ptr [ebp-] ; |hWnd
004011D5 |. E8 8A000000 call <jmp.&user32.EnableWindow> ; \EnableWindow
004011DA |. ED030000 push 3ED ; /ControlID = 3ED (1005.)
004011DF |. FF75 push dword ptr [ebp+] ; |hWnd
004011E2 |. E8 call <jmp.&user32.GetDlgItem> ; \GetDlgItem
004011E7 |. F8 mov dword ptr [ebp-], eax
004011EA |. 6A push ; /Enable = FALSE
004011EC |. FF75 F8 push dword ptr [ebp-] ; |hWnd
004011EF |. E8 call <jmp.&user32.EnableWindow> ; \EnableWindow
004011F4 |. EB jmp short 0040120A
004011F6 |> 6A push ; /Style = MB_OK|MB_APPLMODAL
004011F8 |. push ; |Title = "Reverse Engineering Association"
004011FD |. push ; |Text = "No,no! Try it again!"
|. FF75 push dword ptr [ebp+] ; |hOwner
|. E8 call <jmp.&user32.MessageBoxA> ; \MessageBoxA

以上就是关键处算法,用户名字串的十六进制码既是密钥。

打开http://www.cnblogs.com/ZRBYYXDM/p/5002789.html中搭建的MFC窗口程序,修改OnOk函数如下:

void CSerialNumber_KeygenDlg::OnOK()
{
// TODO: Add extra validation here
CString str;
GetDlgItem( IDC_EDIT_NAME )->GetWindowText( str ); //获取用户名 int len = str.GetLength(); //获取长度
CString SerialNumber,Temp; for ( int i = ; i != len ; i++ ){
Temp.Format( "%x",str[i] );
SerialNumber += Temp;
} GetDlgItem( IDC_EDIT_Number )->SetWindowText( SerialNumber ); //CDialog::OnOK(); //屏蔽基类OnOk函数
}

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

运行效果:

破解 RCA_CRACKME(解除隐藏按钮)的更多相关文章

  1. iOS 为键盘添加隐藏按钮

    // 为键盘添加隐藏按钮 UIToolbar * backView = [[UIToolbar alloc]initWithFrame:CGRectMake(, , , )]; [backView s ...

  2. JS如何调用隐藏按钮的click事件

    js如何调用隐藏按钮的click事件:1.设定隐藏不要使用Visiable属性,使用style.display=none:2.触发JS事件可以使用fireEvent方法,如:document.getE ...

  3. openerp学习笔记 视图(tree\form)中隐藏按钮( 创建、编辑、删除 ),tree视图中启用编辑

    视图(tree\form)中隐藏按钮( 创建.编辑.删除 )create="false" edit="false" delete="false&quo ...

  4. layerui如何隐藏按钮?

    https://www.layui.com/doc/modules/layer.html#btn 建议把 btn: ['取消'],btnAlign: 'c',yes: function (index) ...

  5. WIN7 X64 下 VS2008升级补丁 (显示隐藏按钮)

    原文地址:http://blog.sina.com.cn/s/blog_57b5da120100gk7l.html 更新列表: 2010年3月26日:增加对日文版的支持. 2010年3月3日:更新代码 ...

  6. Android 浮动按钮+上滑隐藏按钮+下滑显示按钮

    1.效果演示 1.1.关注这个红色的浮动按钮 . 可以看到,上滑的时候浮动按钮消失,因为用户迫切想知道下面的东西,而不是回到顶部. 当下滑的时候,用户想回到原来的位置,就可以点击浮动按钮,快速回到顶部 ...

  7. 隐藏按钮button

    <td> <input id="del" type="button" value="删除" onclick="u ...

  8. jquery隐藏按钮

    $(function () { jhbs = getQueryStringByName('jhbs'); shhbs = getQueryStringByName('shhbs'); if (shhb ...

  9. openerp编辑与非编辑下隐藏按钮的方法

    在form表单中,有些控件希望在编辑的时候显示,非编辑时不显示,如hr模块的员工表单,在非编辑模式中,姓名的title不显示,而在编辑模式中显示出来.我们可以在xml文件中给控件赋属性值,class= ...

随机推荐

  1. 你需要知道的三个 CSS3技巧(转)

    1. 在CSS中用attr()显示HTML属性值 attr()功能早在CSS 2.1标准中就已经出现,但现在才开始普遍流行.它提供了一个巧妙的方法在CSS中使用HTML标签上的属性,在很多情况下都能帮 ...

  2. replace(),indexOf(),substring(),split(),join(),——各种小知识点

    1.replace ———— 实现去除指定字符串功能,可以用空字符串代替,也可以去新字符代替已有的字符. var str="123_z.jpg"; str=str.replace( ...

  3. jQuery_pager.js分页

    在做前端项目中,总是需要自己手写类似于这样的分页效果: 这就需要使用jQuery.pager.js文件,其使用方法为:在html中引入三个文件,分别为: <link rel="styl ...

  4. Mysqldump参数大全

    Mysqldump参数大全(参数来源于mysql5.5.19源码)   参数 参数说明 --all-databases  , -A 导出全部数据库. mysqldump  -uroot -p --al ...

  5. GFS: Evolution on Fast-forward

    GFS: Evolution on Fast-forward by Marshall Kirk McKusick, Sean Quinlan | August 7, 2009 A discussion ...

  6. uva 1428

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. 高效前端优化工具--Fiddler入门教程

    简介: Fiddler是用C#编写的一个免费的HTTP/HTTPS网络调试器.Fiddler是以代理服务器的方式,监听系统的网络数据流动英语中Fiddler是小提琴的意思,Fiddler Web De ...

  8. 【个人使用.Net类库】(2)Log日志记录类

    开发接口程序时,要保证程序稳定运行就要时刻监控接口程序发送和接收的数据,这就需要一个日志记录的类将需要的信息记录在日志文件中,便于自己维护接口程序.(Web系统也是如此,只是对应的日志实现比这个要复杂 ...

  9. hihocoder 1236(2015北京网络赛 J题) 分块bitset乱搞题

    题目大意: 每个人有五门课成绩,初始给定一部分学生的成绩,然后每次询问给出一个学生的成绩,希望知道在给定的一堆学生的成绩比这个学生每门都低或者相等的人数 因为强行要求在线查询,所以题目要求,每次当前给 ...

  10. 13个优秀的开源UML工具介绍

    本文将为您介绍12个优秀的UML工具: 1. StarUML StarUML(简称SU),是一种创建UML类图,是一种生成类图和其他类型的统一建模语言(UML)图表的工具.StarUML是一个开源项目 ...