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

系统 : 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!”,并双击交叉参考来到关键代码处:

00401582   .  68 B81B4000   push    00401BB8                         ;  SE handler installation
00401587   .  64:A1 0000000>mov     eax, dword ptr fs:[0]
0040158D   .  50            push    eax
0040158E   .  64:8925 00000>mov     dword ptr fs:[0], esp
00401595   .  83EC 0C       sub     esp, 0C
00401598   .  53            push    ebx
00401599   .  55            push    ebp
0040159A   .  56            push    esi
0040159B   .  8BF1          mov     esi, ecx
0040159D   .  57            push    edi
0040159E   .  68 48304000   push    00403048                         ;  ASCII "31415926535897932384"
004015A3   .  8D4C24 14     lea     ecx, dword ptr [esp+14]
004015A7   .  897424 1C     mov     dword ptr [esp+1C], esi
004015AB   .  E8 FA020000   call    <jmp.&MFC42.#537>
004015B0   .  6A 01         push    1
004015B2   .  8BCE          mov     ecx, esi
004015B4   .  C74424 28 000>mov     dword ptr [esp+28], 0
004015BC   .  E8 E3020000   call    <jmp.&MFC42.#6334>               ;  MFC函数,此时,函数正在获取对话框的数据
004015C1   .  8B7E 60       mov     edi, dword ptr [esi+60]          ;  执行完此指令,edi存着用户名地址
004015C4   .  8B5F F8       mov     ebx, dword ptr [edi-8]           ;  用户名长度
004015C7   .  83FB 05       cmp     ebx, 5                           ;  长度不能小于5
004015CA   .  7C 7E         jl      short 0040164A
004015CC   .  8B46 64       mov     eax, dword ptr [esi+64]          ;  eax存着序列号地址
004015CF   .  894424 14     mov     dword ptr [esp+14], eax
004015D3   .  3958 F8       cmp     dword ptr [eax-8], ebx           ;  用户名序列号长度是否相同?
004015D6   .  75 72         jnz     short 0040164A
004015D8   .  83FB 14       cmp     ebx, 14                          ;  用户名长度大于0x14?
004015DB   .  7F 6D         jg      short 0040164A
004015DD   .  33C9          xor     ecx, ecx
004015DF   .  85DB          test    ebx, ebx                         ;  长度为0,则跳转。并没有用的一条指令
004015E1   .  7E 54         jle     short 00401637
004015E3   .  8B7424 10     mov     esi, dword ptr [esp+10]          ;  取密钥
004015E7   >  8A040F        mov     al, byte ptr [edi+ecx]           ;  迭代用户名字串
004015EA   .  0FBE2C31      movsx   ebp, byte ptr [ecx+esi]          ;  迭代密钥
004015EE   .  0FBEC0        movsx   eax, al
004015F1   .  99            cdq                                      ;  扩展指令
004015F2   .  F7FD          idiv    ebp                              ;  用户名字符除以密钥字符
004015F4   .  8BC2          mov     eax, edx                         ;  保留余数
004015F6   .  D1E0          shl     eax, 1                           ;  左移1位
004015F8   .  83F8 7B       cmp     eax, 7B                          ;  小于等于7B?
004015FB   .  7E 03         jle     short 00401600
004015FD   .  83E8 1A       sub     eax, 1A                          ;  大于7B则减去-1A
00401600   >  83F8 41       cmp     eax, 41                          ;  大于等于41?
00401603   .  7D 09         jge     short 0040160E                   ;  是则进入下一cmp
00401605   .  BA 82000000   mov     edx, 82
0040160A   .  2BD0          sub     edx, eax                         ;  edx-=eax
0040160C   .  8BC2          mov     eax, edx                         ;  保留edx
0040160E   >  83F8 5B       cmp     eax, 5B                          ;  小于等于5B?
00401611   .  7E 12         jle     short 00401625                   ;  是则直接去序列号进行对比
00401613   .  83F8 61       cmp     eax, 61                          ;  大于等于61?
00401616   .  7D 0D         jge     short 00401625                   ;  是则直接去序列号进行对比
00401618   .  99            cdq                                      ;  否则eax除以10
00401619   .  BD 0A000000   mov     ebp, 0A
0040161E   .  F7FD          idiv    ebp
00401620   .  83C2 30       add     edx, 30                          ;  余数+30
00401623   .  8BC2          mov     eax, edx                         ;  存入eax
00401625   >  8B5424 14     mov     edx, dword ptr [esp+14]          ;  取序列号
00401629   .  38040A        cmp     byte ptr [edx+ecx], al           ;  序列号与处理结果是否相同?
0040162C   .  75 1C         jnz     short 0040164A
0040162E   .  41            inc     ecx                              ;  循环变量自增
0040162F   .  3BCB          cmp     ecx, ebx                         ;  迭代结束?
00401631   .^ 7C B4         jl      short 004015E7
00401633   .  8B7424 18     mov     esi, dword ptr [esp+18]
00401637   >  6A 00         push    0
00401639   .  68 34304000   push    00403034                         ;  ASCII "Congratulations!"
0040163E   .  68 20304000   push    00403020                         ;  ASCII "Well done cracker!"
00401643   .  8BCE          mov     ecx, esi
00401645   .  E8 54020000   call    <jmp.&MFC42.#4224>               ;  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 >= 5 && len <= 0x14 ){                                        //格式控制。
        CString Serial = "31415926535897932384";                        //密钥
        CString PassWord = str;                                            //序列号

        for ( int i = 0 ; i != len ; i++ ){
            PassWord.SetAt( i,( PassWord[i] % Serial[i] ) << 1 );
            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] % 10 + 0x30 );
        }

        SetDlgItemText( IDC_EDIT_PASSWORD,PassWord );
    }
    else
        MessageBox( "用户名格式错误!" );
}

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

运行效果:

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

时间: 2025-01-31 10:23:01

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

使用&quot;Visual Studio命令提示&quot;查看cad中的重整函数

AutoCAD2006以前,包括cad2006都是用VC++开发的,从AutoCAD2007开始,Autodesk公司为cad引入的.Net框架.通过平台调用,也就是P/Invoke技术,让.Net代码调用动态链接库中的非托管的C++函数. 要使用P/Invoke技术,首先就需要知道一个C++函数对应的重整函数.什么是重整函数?重整函数,就是C++编译器,对每个函数,根据它的函数名称.参数类型.返回值等生成唯一的函数名.例如,在CAD中,用来为"实体添加永久反应器"的C++函数 add

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

一.下面脚本可查看局域网中的电脑计算机名和IP,保存下面文本至记事本.后缀改成bat COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off&setlocal enabledelayedexpansion ECHO 正在获取本机的IP地址.请稍等... for /f "tokens=3 skip=2 delims=: " %%i in ('nbtstat -n') do ( set "IP=%%i"

查看局域网其他电脑的计算机名和IP

一.以下脚本可查看局域网中的电脑计算机名和IP,保存以下文本至记事本,后缀改成bat COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off&setlocal enabledelayedexpansion ECHO 正在获取本机的IP地址,请稍等... for /f "tokens=3 skip=2 delims=: " %%i in ('nbtstat -n') do ( set "IP=%%i"

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

转自:http://blog.csdn.net/he_jian1/article/details/40787269 查看linux中的TCP连接数 本文章已收录于:  计算机网络知识库  分类: 安全测试总结(2)  性能经验总结(107)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.查看哪些IP连接本机 netstat -an 二.查看TCP连接数 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps

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

原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器--修正上一版"视图触发器"不能正确解密错误--发现有错,请E_MAIL:[email protected]be

BCB 查看动态库中有什么函数

切换至 tdump.exe 所在目录: C:\Documents and Settings\Administrator>cd D:\Program Files\CodeGear\RAD Studio\6.0 \bin D:\Program Files\CodeGear\RAD Studio\6.0\bin>tdump.exe D:\Program\CKD\05191800\F nthex32.dll > d:\Fnthex32.txt 输出结(红色字体为函数名): Exports fro

使用SourceInsight查看android中的native方法

SourceInsight真的是查看源代码的神器.只要知道了文件名,就可以快速定位到文件.最近在研究Android的touch系统,发现MotionEvent的getX()方法调用的是nativeGexAxis(),于是想看看该本地代码是如何实现的,但我不知道nativeGexAxis的实现代码在什么位置.Android中的类调用本地代码是通过类名相似或Android.mk文件定义.MotionEvent所在的pack为android.view,将点号换成下划线,我们可以推测MotionEven

ORACLE中查看表中的外键来源于哪些表

1. ORACLE中查看表中的外键来源于哪些表 select cl.table_name from user_cons_columns cl left join user_constraints c on cl.constraint_name = c.r_constraint_name where c.constraint_type = 'R' and c.table_name = '表名' 2.Oracle中查看表中的主键被被哪些表引用为外键

如何快速查看数据库中的表大小

exec sp_spaceused 以上语法可以查看数据库大小 以下可以查看数据库中每个表的数据条数 SELECT   a.name, b.rows FROM      sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE   (a.type = 'u') AND (b.indid IN (0, 1)) ORDER BY b.rows DESC