首页
社区
课程
招聘
[旧帖] [原创]破解ex1402.rar_582 0.00雪花
发表于: 2016-2-19 16:42 1510

[旧帖] [原创]破解ex1402.rar_582 0.00雪花

2016-2-19 16:42
1510
CrackMe提供者:tane
原帖:http://bbs.pediy.com/showthread.php?t=9655
工具:od,vc
平台:winxpsp3

这是一个delphi程序,有简单的壳。脱壳后,运行程序可以看到注册信息和提示,“No keyfile found!”。根据提示可知程序需要授权文件。给函数CreateFile下断点,就可以找到验证处理函数。
00426572   .  BA 4C674200   mov     edx, 0042674C                    ;  ASCII "ctm_cm02.key"
00426577   .  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]
0042657D   .  E8 3FD8FDFF   call    00403DC1
00426582   .  BA 01000000   mov     edx, 1
00426587   .  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]
0042658D   .  E8 1EDCFDFF   call    004041B0
00426592   .  E8 4DC1FDFF   call    004026E4
00426597   .  85C0          test    eax, eax
00426599   .  0F85 66010000 jnz     00426705
0042659F   .  8D85 A8FEFEFF lea     eax, dword ptr [ebp+FFFEFEA8]
004265A5   .  E8 5AD9FDFF   call    00403F04
004265AA   .  E8 F9C0FDFF   call    004026A8
004265AF   .  8945 FC       mov     dword ptr [ebp-4], eax
004265B2   .  837D FC 00    cmp     dword ptr [ebp-4], 0
004265B6   .  75 15         jnz     short 004265CD
004265B8   .  BA 64674200   mov     edx, 00426764                    ;  ASCII "Key file is empty!"
004265BD   .  8B83 B0010000 mov     eax, dword ptr [ebx+1B0]
004265C3   .  E8 CCB6FEFF   call    00411C94
004265C8   .  E9 28010000   jmp     004266F5

爆破点1:
00426599   . /0F85 66010000 jnz     00426705
该点破掉授权文件不存在验证。

爆破点2:
004266D1   . /EB 22         jmp     short 004266F5
该点破掉使用无效文件句柄异常。

爆破之后发现提示信息不完美。应该显示注册信息的地方被大量s字母占据。仔细看了一下验证过程,发现算法非常简洁。
00426600   .  8DB5 FCFFFEFF lea     esi, dword ptr [ebp+FFFEFFFC]
00426606   .  8DBD FBFFFEFF lea     edi, dword ptr [ebp+FFFEFFFB]
0042660C   .  31C0          xor     eax, eax
0042660E   .  83CA FF       or      edx, FFFFFFFF
00426611   .  31DB          xor     ebx, ebx
00426613   .  40            inc     eax
00426614   .  F7D2          not     edx
00426616   >  8A1C16        mov     bl, byte ptr [esi+edx]
00426619   .  84DB          test    bl, bl
0042661B   .  74 29         je      short 00426646
0042661D   .  E8 16000000   call    00426638
00426622   .  52            push    edx
00426623   .  F7E3          mul     ebx
00426625   .  5A            pop     edx
00426626   .  35 326D5463   xor     eax, 63546D32
0042662B   .  FEC2          inc     dl
0042662D   .  39CA          cmp     edx, ecx
0042662F   .  74 42         je      short 00426673
00426631   .  80FA FF       cmp     dl, 0FF
00426634   .  74 3D         je      short 00426673
00426636   .^ EB DE         jmp     short 00426616
00426638  /$  57            push    edi
00426639  |.  8DBD F4FFFEFF lea     edi, dword ptr [ebp+FFFEFFF4]
0042663F  |.  8B3F          mov     edi, dword ptr [edi]
00426641  |.  881C17        mov     byte ptr [edi+edx], bl
00426644  |.  5F            pop     edi
00426645  \.  C3            retn
00426646   >  E8 EDFFFFFF   call    00426638
0042664B   .  42            inc     edx
0042664C   .  83C2 04       add     edx, 4
0042664F   .  39D1          cmp     ecx, edx
00426651   .  75 20         jnz     short 00426673
00426653   .  83EA 04       sub     edx, 4
00426656   .  85C0          test    eax, eax
00426658   .  76 02         jbe     short 0042665C
0042665A   .  D1E8          shr     eax, 1
0042665C   >  3B0416        cmp     eax, dword ptr [esi+edx]

于是决定尝试写keygen。刚开始,由于思路错误,加上
00426658   .  76 02         jbe     short 0042665C
0042665A   .  D1E8          shr     eax, 1

这两句没真正看懂,我指定了结果为零进行逆运算,结果陷入了误区。在此向elance表示感谢。看了他的分析和keygen,我知道了自己的问题。我没有他那么好的c语言功底,就混杂着汇编写了这个keygen
#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
        char name[256];
        char *pname;
        FILE* hfile;
        long lkey,len;

        printf("请输入注册用户名;");
        pname = gets_s(name,256);

        _asm
        {
                mov esi,pname
                mov eax,1
                xor ecx,ecx
                xor ebx,ebx
        }
loopsum:
        _asm
        {
                mov bl,[esi+ecx]
                test bl,bl
                jz writefile
                xor edx,edx
                mul ebx
                xor eax,0x63546d32
                inc ecx
                cmp ecx,0xff
                jb loopsum
               
        }
        printf("错误:注册名太长");
        return 0;
writefile:
        _asm{
                shr eax,1
                mov [lkey],eax
                mov [len],ecx
        }
        fopen_s(&hfile,"ctm_cm02.key","w");
        fwrite(pname,sizeof(char),len+1,hfile);
        fwrite(&lkey,sizeof(long),1,hfile);

        fclose(hfile);

        return 0;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//