系统 : Windows xp

程序 : Rith's CrackMe #1

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

要求 : 注册机编写

使用工具 : IDA Pro & OD

可在“PEDIY CrackMe 2007”中查找关于此程序的破文,标题为“WAKU的第二个破文----Rith's CrackMe #1(非常简单)”。

使用IDA载入程序,在字串表中找出正确注册的提示“Well done cracker!”,并双击交叉参考来到关键代码处:

   .   B81B4000   push    00401BB8                         ;  SE handler installation
. :A1 >mov eax, dword ptr fs:[]
0040158D . push eax
0040158E . : >mov dword ptr fs:[], esp
. 83EC 0C sub esp, 0C
. push ebx
. push ebp
0040159A . push esi
0040159B . 8BF1 mov esi, ecx
0040159D . push edi
0040159E . push ; ASCII "31415926535897932384"
004015A3 . 8D4C24 lea ecx, dword ptr [esp+]
004015A7 . 1C mov dword ptr [esp+1C], esi
004015AB . E8 FA020000 call <jmp.&MFC42.#>
004015B0 . 6A push
004015B2 . 8BCE mov ecx, esi
004015B4 . C74424 >mov dword ptr [esp+],
004015BC . E8 E3020000 call <jmp.&MFC42.#> ; MFC函数,此时,函数正在获取对话框的数据
004015C1 . 8B7E mov edi, dword ptr [esi+] ; 执行完此指令,edi存着用户名地址
004015C4 . 8B5F F8 mov ebx, dword ptr [edi-] ; 用户名长度
004015C7 . 83FB cmp ebx, ; 长度不能小于5
004015CA . 7C 7E jl short 0040164A
004015CC . 8B46 mov eax, dword ptr [esi+] ; eax存着序列号地址
004015CF . mov dword ptr [esp+], eax
004015D3 . F8 cmp dword ptr [eax-], ebx ; 用户名序列号长度是否相同?
004015D6 . jnz short 0040164A
004015D8 . 83FB cmp ebx, ; 用户名长度大于0x14?
004015DB . 7F 6D jg short 0040164A
004015DD . 33C9 xor ecx, ecx
004015DF . 85DB test ebx, ebx ; 长度为0,则跳转。并没有用的一条指令
004015E1 . 7E jle short
004015E3 . 8B7424 mov esi, dword ptr [esp+] ; 取密钥
004015E7 > 8A040F mov al, byte ptr [edi+ecx] ; 迭代用户名字串
004015EA . 0FBE2C31 movsx ebp, byte ptr [ecx+esi] ; 迭代密钥
004015EE . 0FBEC0 movsx eax, al
004015F1 . cdq ; 扩展指令
004015F2 . F7FD idiv ebp ; 用户名字符除以密钥字符
004015F4 . 8BC2 mov eax, edx ; 保留余数
004015F6 . D1E0 shl eax, ; 左移1位
004015F8 . 83F8 7B cmp eax, 7B ; 小于等于7B?
004015FB . 7E jle short
004015FD . 83E8 1A sub eax, 1A ; 大于7B则减去-1A
> 83F8 cmp eax, ; 大于等于41?
. 7D jge short 0040160E ; 是则进入下一cmp
. BA mov edx,
0040160A . 2BD0 sub edx, eax ; edx-=eax
0040160C . 8BC2 mov eax, edx ; 保留edx
0040160E > 83F8 5B cmp eax, 5B ; 小于等于5B?
. 7E jle short ; 是则直接去序列号进行对比
. 83F8 cmp eax, ; 大于等于61?
. 7D 0D jge short ; 是则直接去序列号进行对比
. cdq ; 否则eax除以10
. BD 0A000000 mov ebp, 0A
0040161E . F7FD idiv ebp
. 83C2 add edx, ; 余数+30
. 8BC2 mov eax, edx ; 存入eax
> 8B5424 mov edx, dword ptr [esp+] ; 取序列号
. 38040A cmp byte ptr [edx+ecx], al ; 序列号与处理结果是否相同?
0040162C . 1C jnz short 0040164A
0040162E . inc ecx ; 循环变量自增
0040162F . 3BCB cmp ecx, ebx ; 迭代结束?
.^ 7C B4 jl short 004015E7
. 8B7424 mov esi, dword ptr [esp+]
> 6A push
. push ; ASCII "Congratulations!"
0040163E . push ; ASCII "Well done cracker!"
. 8BCE mov ecx, esi
. E8 call <jmp.&MFC42.#> ; MessageBox函数

以上就是注册的关键代码了,发现该程序调用了MFC函数,函数名并没有在OD中显示,不要紧,对比IDA中相同的地址就可以看到具体用了什么函数。快速破解这个程序需要对MFC有一定的了解。好了,仔细跟踪代码,发现程序采用了F(用户名)=序列号的判断形势,我们用高级语言实现F(用户名)即可。

打开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(); if ( len >= && len <= 0x14 ){ //格式控制。
CString Serial = ""; //密钥
CString PassWord = str; //序列号 for ( int i = ; i != len ; i++ ){
PassWord.SetAt( i,( PassWord[i] % Serial[i] ) << );
if ( PassWord[i] > 0x7B )
PassWord.SetAt( i,PassWord[i] - 0x1A );
if ( PassWord[i] < 0x41 )
PassWord.SetAt( i,0x82 - PassWord[i] ); if ( PassWord[i] > 0x5B && PassWord[i] < 0x61 )
PassWord.SetAt( i,PassWord[i] % + 0x30 );
} SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
}
else
MessageBox( "用户名格式错误!" );
}

再在OnInitDialog中添加此代码修改标题:SetWindowText(_T("Rith's CrackMe #1_Keygen"));

运行效果:

破解 Rith's CrackMe #1(对比IDA查看动态分析中的MFC函数名)的更多相关文章

  1. 查看局域网中连接的主机名和对应的IP地址

    1.查看局域网中的所有主机名 2.通过主机名解析IP地址:-4选项 3.通过IP地址解析主机名:-a选项

  2. dumpbin 查看dll中的导出函数

    C:\Program Files (x86)\Microsoft Visual Studio 14.0>dumpbin -exports E:\20171110\Release\aa.dll h ...

  3. 查看局域网其它电脑的计算机名和IP

    一.下面脚本可查看局域网中的电脑计算机名和IP,保存下面文本至记事本.后缀改成bat COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off ...

  4. IDA在内存中dump出android的Dex文件

    转载自http://drops.wooyun.org/tips/6840 在现在的移动安全环境中,程序加壳已经成为家常便饭了,如果不会脱壳简直没法在破解界混的节奏.ZJDroid作为一种万能脱壳器是非 ...

  5. 查看linux中的TCP连接数【转】

     转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:   计算机网络知识库  分类: ...

  6. 查看SQL SERVER 加密存储过程,函数,触发器,视图

    原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset noc ...

  7. 使用strings查看二进制文件中的字符串

    使用strings查看二进制文件中的字符串 今天介绍的这个小工具叫做strings,它实现功能很简单,就是找出文件内容中的可打印字符串.所谓可打印字符串的涵义是,它的组成部分都是可打印字符,并且以nu ...

  8. 查看linux中某个端口(port)是否被占用(netstat,lsof)

    查看linux中某个端口(port)是否被占用(netstat,lsof) netstat命令可以显示网络连接,路由表,接口状态,伪装连接,网络链路信息和组播成员组等信息.命令格式:netstat [ ...

  9. 查看jquery绑定的事件函数

    作为技术狂热分子的职业本能,看到一个技术产品的功能,总会忍不住想知道它是怎么被实现的.比如我每每看到别人网站一个很炫的界面或者很酷的功能,就忍不住打开了浏览器的控制台... 好,不扯远,说说当你想看到 ...

随机推荐

  1. HDUOJ-----(1162)Eddy's picture(最小生成树)

    Eddy's picture Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  2. nssm在windows服务器上部署nodejs,coffee启动方式

    本想用forever / pm2 来部署nodejs, 百度后发现只能在Linux系统上使用,window上没法使用,兜一圈后又转nssm了.... 在Linux上,可以轻松的使用forever或者p ...

  3. 深入掌握include_once与require_once的区别

    转:http://www.jb51.net/article/38587.htm  http://www.360doc.com/content/12/1022/17/7851074_243107406. ...

  4. Servlet容器如何同时来处理多个请求

    工作者线程Work Thread:执行代码的一组线程调度线程Dispatcher Thread:每个线程都具有分配给它的线程优先级,线程是根据优先级调度执行的Servlet采用多线程来处理多个请求同时 ...

  5. ASP.NET MVC 上传大文件时404

    前一段时间会员的上传组件改用FLASH的swfupload来上传,既能很友好的显示上传进度,又能完全满足大文件的上传. 后来服务器升级到windows 2008,改为IIS7后,上传文件一旦超过30M ...

  6. bzoj3594: [Scoi2014]方伯伯的玉米田

    dp新优化姿势... 首先,当我们拔高时,一定右端点是n最优.因为如果右端点是r,相当于降低了r之后玉米的高度.显然n更优. 那么可以dp.dp[i][j]表示前i个拔高j次的LIS.dp[i][j] ...

  7. adMob iAd整合,随机根据网络状况自动显示。

    最近找整合的代码,找到的都不对,有个大概对的,但要奔溃退出,只要两个单独弄. adMob 下载好sdk,导入进去,iAd的加入iad framework. 使用方法,在viewController v ...

  8. sdut 2605 A^X mod P

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 这个题卡的是优化,直观解法是在求x^y时 ...

  9. Delphi 的 7zip 压缩算法

    http://blog.csdn.net/warrially/article/details/8039915

  10. matlab 画框(二) 去白边

    在matlab图像处理中,为了标识出图像的目标区域来,需要利用plot函数或者rectangle函数,这样标识目标后,就保存图像. 一般saves保存的图像存在白边,可以采用imwrite对图像进行保 ...