首页
社区
课程
招聘
[原创]crackme破解for菜青虫 (菜鸟级别以上请点评)
发表于: 2006-3-2 14:43 9381

[原创]crackme破解for菜青虫 (菜鸟级别以上请点评)

2006-3-2 14:43
9381

标 题:crackme破解for菜青虫 (菜鸟级别以上请点评)
发信人:babason(学习不满20天)
时 间:2006-3-2  
File : Crackme#3 - Self Destructed.exe
Difficulty : 1/10
Blahblah : The Serial is different on each machine.(后来我想跟安装的系统和系统的用户名有关。)
详细信息:
http://www.crackmes.de/users/d4ph1/self_destructed/download (可以下载)
运行软件,输入注册名babason,序列号123456,点注册按钮,弹出对话筐  ( "This is not the right serial...")。
很典型的。右击-查找-所有参考文字-找到This is not the right serial...-反汇编跟随到004014C5

004014C0  |.  68 00304000   PUSH Crackme#.00403000     ; |Title = "Crackme#3 By D4ph1"
004014C5  |.  68 19314000   PUSH Crackme#.00403119     ; |Text = "This is not the right serial..."
004014CA  |.  6A 00         PUSH 0                     ; |hOwner = NULL
004014CC  |.  E8 7B000000   CALL <JMP.&user32.MessageBoxA>   ; \MessageBoxA
004014D1  |.  EB 13         JMP SHORT Crackme#.004014E6
004014D3  |>  6A 10         PUSH 10                                 
004014D5  |.  68 00304000   PUSH Crackme#.00403000       ; |Title = "Crackme#3 By D4ph1"
004014DA  |.  68 BB304000   PUSH Crackme#.004030BB       ; |Text = "You have to write a Serial first...!"
004014DF  |.  6A 00         PUSH 0                       ; |hOwner = NULL
004014E1  |.  E8 66000000   CALL <JMP.&user32.MessageBoxA>; \MessageBoxA
(也可以根据MessageBoxA查找。办法很多)
向上找,
00401366  |.  68 EC314000   PUSH Crackme#.004031EC        ; /lParam = 4031EC
0040136B  |.  68 80000000   PUSH 80                       ; |wParam = 80
00401370  |.  6A 0D               PUSH 0D                 ; |Message = WM_GETTEXT
00401372  |.  68 EA030000   PUSH 3EA                      ; |ControlID = 3EA (1002.)
00401377  |.  FF75 08            PUSH DWORD PTR SS:[EBP+8] ; |hWnd
0040137A  |.  E8 D9010000   CALL <JMP.&user32.SendDlgItemMessageA> ; \SendDlgItemMessageA
0040137F  |.  A3 6C324000   MOV DWORD PTR DS:[40326C],EAX     取注册名位数
00401384  |.  83F8 04           CMP EAX,4     注册名位数比较,小于或等于转移4跳出提
00401387  |.  0F86 60010000 JBE Crackme#.004014ED    示( "The Name you write is not correct!")。
0040138D  |.  83F8 14          CMP EAX,14   注册名大于或等于转移14位,跳出提示
00401390  |.  0F83 57010000 JNB Crackme#.004014ED         
向下看
004013B8  |.  33C9          XOR ECX,ECX                    ;  ECX清零
004013BA  |.  49            DEC ECX                        ;  ECX减一
004013BB  |.  33D2          XOR EDX,EDX
004013BD  |.  4A            DEC EDX                        ;  EDX减一
004013BE  |.  33F6          XOR ESI,ESI
004013C0  |.  4E            DEC ESI                       ;  ESI减一
004013C1  |.  33C0          XOR EAX,EAX
004013C3  |.  A1 6C324000   MOV EAX,DWORD PTR DS:[40326C]   取注册名位数
004013C8  |.  48            DEC EAX                         减一位
004013C9  |.  50            PUSH EAX
004013CA  |>  46            /INC ESI                       ESI归零
004013CB  |.  41            |INC ECX                       ECX归零
004013CC  |.  0FBE81 F03440>|MOVSX EAX,BYTE PTR DS:[ECX+4034F0]   好像取系统。我是XP。第一次取”X“
004013D3  |.  0FBE9E EC3140>|MOVSX EBX,BYTE PTR DS:[ESI+4031EC]   ;  取注册名每一位进行一下运算
004013DA  |.  83F0 12       |XOR EAX,12                      ;  与12异或
004013DD  |.  83C0 34       |ADD EAX,34                    ;  加34
004013E0  |.  C1E3 03       |SHL EBX,3                     ;  注册名第一位左移3位,就是乘以2^3
004013E3  |.  83EB 20       |SUB EBX,20                    ;  再减20
004013E6  |.  83F3 66       |XOR EBX,66                    ;  再跟66异或
004013E9  |.  32C3          |XOR AL,BL                    ;  EAX的低位跟EBX的低位异或
004013EB  |.  03C3          |ADD EAX,EBX                  ;  EAX与EBX相加
004013ED  |.  E8 5CFDFFFF   |CALL Crackme#.0040114E   具体运算,F7跟进如下

0040114E  /$  66:50         PUSH AX
00401150  |.  C0E8 04       SHR AL,4              ;  右移4位,除2^4(十六进制10)
00401153  |.  24 0F         AND AL,0F
00401155  |.  04 30         ADD AL,30
00401157  |.  3C 39         CMP AL,39            ;  EAX低位与39比较,<=时跳
00401159  |.  7E 02         JLE SHORT Crackme#.0040115D
0040115B  |.  04 07         ADD AL,7
0040115D  |>  42            INC EDX              ;  EDX清零
0040115E  |.  8882 70334000 MOV BYTE PTR DS:[EDX+403370],AL          ;  低位储存到地址403370+EDX
00401164  |.  66:58         POP AX
00401166  |.  C0E0 04       SHL AL,4        ;  左移,乘(十六进制10)
00401169  |.  C0E8 04       SHR AL,4        ;  右移,除以(十六进制10)
0040116C  |.  24 0F         AND AL,0F
0040116E  |.  04 30         ADD AL,30
00401170  |.  3C 39         CMP AL,39      ;  EXA低位与39比较,〈=时跳
00401172  |.  7E 02         JLE SHORT Crackme#.00401176
00401174  |.  04 07         ADD AL,7
00401176  |>  42            INC EDX
00401177  |.  8882 70334000 MOV BYTE PTR DS:[EDX+403370],AL ;  低位储存到地址403370+EDX
0040117D  \.  C3            RETN                             跳出。

现在我们应该知道,真码是储存在地址:403370开始的。我们可以跟随地址:403370看

004013F2  |.  58            |POP EAX
004013F3  |.  3BF0          |CMP ESI,EAX        判断是否取完注册名
004013F5  |.  50            |PUSH EAX
004013F6  |.  74 0A         |JE SHORT Crackme#.00401402
004013F8  |.  83F9 03       |CMP ECX,3          循环3次
004013FB  |.  75 03         |JNZ SHORT Crackme#.00401400
004013FD  |.  33C9          |XOR ECX,ECX
004013FF  |.  49            |DEC ECX
00401400  |>^ EB C8         \JMP SHORT Crackme#.004013CA

下面的还是计算了。如果你换了其他注册名,后面的序列号是不变的.可以自己慢慢看。
最后在地址:004033700下断点。
00403370=Crackme#.00403370 (ASCII "7E86E6BA7E8626-3605-6BF980FD6600FE")

我的注册名是:babason
            注册码是:7E86E6BA7E8626-3605-6BF980FD6600FE
新的注册名是:bbs.pediy.com
  注册码:7E76F6CA7E86063A7E76F6DA7E-3605-6BF980FD6600FE
后面的是一样的.

前一段码跟软件注册名有关,中间一段跟系统(XP,WIN98等)有关,后面一段跟系统注册名有关。
各位高手看看,是不是跟系统有关?还跟系统注册的用户名有关??

地址004034F0  58 50 80 7C 05 01 42 41 42 41 53 4F 4E           XP?BABASON


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

收藏
免费 7
支持
分享
最新回复 (14)
雪    币: 73
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
写的很精彩,可是地址下载不下来,请检查一下。
2006-3-2 17:53
0
雪    币: 50161
活跃值: (20665)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
3
新手第一篇加精鼓励一下。
小小建议:文章排版格式不是太美观,另外你算法分析差不多,再写出注册机就会感到更有乐趣。
2006-3-2 22:00
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
lar
4
小弟是新来的也来顶一下了,看了楼主的文章小弟也要多多的向楼主的各位高手们学习了。
2006-3-2 23:52
0
雪    币: 50
活跃值: (145)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
5
离写出注册机也不远了
2006-3-3 00:25
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
谢谢各位的支持!!
2006-3-3 09:06
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
用讯雷5,文件------新建----弹出对话筐,然后把http://www.crackmes.de/users/d4ph1/self_destructed/download
添入网址(URL):里面就可以了下载了.
或者直接到 http://www.crackmes.de下载...
上传的附件:
2006-3-3 09:09
0
雪    币: 200
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
不错,学习一下。很适合新手!
2006-3-3 09:36
0
雪    币: 273
活跃值: (250)
能力值: ( LV9,RANK:410 )
在线值:
发帖
回帖
粉丝
9
我的PASSWOR是7E86E64A7E8606-3605-730580015A00

004034F0  58 50 80 7C 05 01 50 52 4F 2D 50 43 2D 48 4D     XP?PRO-PC-HM

XP             ?          PRO-PC-HM
|               |               |
操作系统       没研究         计算机名
2006-3-3 10:23
0
雪    币: 207
活跃值: (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
10
建议其他菜青虫到http://www.crackmes.de下载适合自己的crackme.
它有十个等级的.我们菜青虫只要选1/10~2/10等级就可以了.
2006-3-3 11:12
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了!
2006-3-3 23:32
0
雪    币: 115
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
12
#include<stdio.h>
#include<windows.h>

void convert(char * pwd, long eax){
        int len;
        long al;

        len=strlen(pwd);
        al=eax&0x000000ff;
        al=al/16;
        al=al&0x0f;
        al=al+0x30;
        if(al>0x39)
                al=al+7;
        pwd[len]=al;
        len=strlen(pwd);
        al=eax&0xff;
        al=al*16;
        al=al/16;
        al=al&0x0f;
        al=al+0x30;
        if(al>0x39)
                al=al+7;
        pwd[len]=al;

}

int main(){
        char str[48]="XP";
        char str2[]={0x75, 0x0C, 0x8A, 0x1D, 0x07, 0x12, 0x40, 0x00, 0x80, 0xFB, 0x75, 0x75, 0x03, 0xC3, 0xEB, 0x00, 0x6A, 0x00, 0x68, 0x80, 0x00, 0x00, 0x00, 0x6A, 0x02, 0x6A, 0x00, 0x6A, 0x00, 0x68, 0x00, 0x00, 0x00, 0x40, 0x68, 0x47, 0x31, 0x40, 0x00, 0xE8, 0x37, 0x03, 0x00, 0x00, 0x8B, 0xD8, 0x8D, 0x35, 0x0A, 0x39, 0x40, 0x00, 0x68, 0x04, 0x01, 0x00, 0x00, 0x56, 0x6A, 0x00, 0xE8, 0x3A, 0x03, 0x00, 0x00, 0x56, 0x56, 0xE8, 0xE5, 0x02, 0x00, 0x00, 0x8D, 0x3D, 0x0A, 0x35, 0x40, 0x00, 0x68, 0x47, 0x31, 0x40, 0x00, 0x56, 0x56, 0x68, 0x53, 0x31, 0x40, 0x00, 0x57, 0xE8, 0xC7, 0x02, 0x00, 0x00, 0x83, 0xC4, 0x14, 0x57, 0xE8, 0x3C, 0x03, 0x00, 0x00, 0x8D, 0x15, 0x0E, 0x3A, 0x40, 0x00, 0x6A};
        char pwd[100];
        char name[30];
        TCHAR szHostName[20];
        DWORD dwSize=20;
    DWORD dwVersion;
        int i, len;
        long eax, ebx, edi, esi;

        memset(pwd, 0x00, sizeof(pwd));
        GetComputerName(szHostName, &dwSize);   
        dwVersion = GetVersion();
       
        str[2]=0x80;
        str[3]=0x7C;
        str[4]=dwVersion&0xff;
        str[5]=dwVersion/0x100;
        strcpy(&str[6], szHostName);

        printf("请输入用户名:");
        scanf("%s", name);

        for(i=0; i<strlen(name); i++){
                eax=(str[i%4]^0x12)+0x34;
                ebx=(name[i]*8-0x20)^0x66;
                eax=(eax&0xffffff00)+((eax&0xff)^(ebx&0xff))+ebx;
                convert(pwd, eax);
        }

        pwd[i*2]='-';

        for(i=4, eax=0; i<6; i++){
                edi='X';
                esi=str[i];
                edi=edi-esi;
                eax=eax+edi;
                eax=eax-esi;
                eax=eax*16;
        }
        eax=eax/16;
        convert(pwd, eax&0xff);
        convert(pwd, eax/0x100);
       
        pwd[strlen(pwd)]='-';
       
        len=strlen(szHostName);
        for(i=0; i<len; i++){
                eax=szHostName[i];
                ebx=str2[i*4+3]*0x1000000+str2[i*4+2]*0x10000+str2[i*4+1]*0x100+str2[i*4];
                eax=eax^ebx;
                ebx=ebx^len;
                ebx=ebx-eax;
                ebx=ebx-len;
                eax=eax+ebx;
                convert(pwd, eax);
        }

        printf("%s\n", pwd);
       
        getch();
        return 0;
}
2009-5-13 11:32
0
雪    币: 87
活跃值: (25)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
13
我是刚学习有关加密与解密的知识,在《加密与解密第三版》中看到这个程序,出于练习的目的,利用MFC编写了一个注册机,不对之处,请各位高手指教!(本人只是测试了当LoadLibraryA("kernel32.dll")=0x7C800000的情况,其它情况没有进行测试)
上传的附件:
2009-5-25 13:09
0
雪    币: 108
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
这个CrackMe有一个简单的Anti-Debug需要注意一下,在这里:

004011F3  /$  68 D1314000   push    004031D1                         ; /ProcNameOrOrdinal = "IsDebuggerPresent"
004011F8  |.  FF35 F0344000 push    dword ptr [4034F0]               ; |hModule = 7C805058
004011FE  |.  E8 8B030000   call    <jmp.&kernel32.GetProcAddress>   ; \GetProcAddress
00401203  |.  FFD0          call    eax
00401205  |.  0BC0          or     eax, eax
00401207  |.  75 0C         jnz     short 00401215

这里检查程序是否处于Debug状态,如果是的话执行下的语句:

00401215  |>  EB 00         jmp     short 00401217
00401217  |>  6A 00         push    0                                ; /hTemplateFile = NULL
00401219  |.  68 80000000   push    80                               ; |Attributes = NORMAL
0040121E  |.  6A 02         push    2                                ; |Mode = CREATE_ALWAYS
00401220  |.  6A 00         push    0                                ; |pSecurity = NULL
00401222  |.  6A 00         push    0                                ; |ShareMode = 0
00401224  |.  68 00000040   push    40000000                         ; |Access = GENERIC_WRITE
00401229  |.  68 47314000   push    00403147                         ; |FileName = "\ERASER.BAT"
0040122E  |.  E8 37030000   call    <jmp.&kernel32.CreateFileA>      ; \CreateFileA
00401233  |.  8BD8          mov     ebx, eax
00401235  |.  8D35 0A394000 lea     esi, dword ptr [40390A]
0040123B  |.  68 04010000   push    104                              ; /BufSize = 104 (260.)
00401240  |.  56            push    esi                              ; |PathBuffer => 复件_Cra.0040390A
00401241  |.  6A 00         push    0                                ; |hModule = NULL
00401243  |.  E8 3A030000   call    <jmp.&kernel32.GetModuleFileName>; \GetModuleFileNameA
00401248  |.  56            push    esi                              ; /pDest => 复件_Cra.0040390A
00401249  |.  56            push    esi                              ; |pSrc => ""
0040124A  |.  E8 E5020000   call    <jmp.&user32.CharToOemA>         ; \CharToOemA
0040124F  |.  8D3D 0A354000 lea     edi, dword ptr [40350A]
00401255  |.  68 47314000   push    00403147                         ; /<%s> = "\ERASER.BAT"
0040125A  |.  56            push    esi                              ; |<%s> => ""
0040125B  |.  56            push    esi                              ; |<%s> => ""
0040125C  |.  68 53314000   push    00403153                         ; |Format = ":LOOP",CR,LF,"DEL ""%s""",CR,LF,"IF EXIST ""%s"" GOTO LOOP",CR,LF,"DEL ""%s"""
00401261  |.  57            push    edi                              ; |s => 复件_Cra.0040350A
00401262  |.  E8 C7020000   call    <jmp.&user32.wsprintfA>          ; \wsprintfA
00401267  |.  83C4 14       add     esp, 14
0040126A  |.  57            push    edi                              ; /String
0040126B  |.  E8 3C030000   call    <jmp.&kernel32.lstrlenA>         ; \lstrlenA
00401270  |.  8D15 0E3A4000 lea     edx, dword ptr [403A0E]
00401276  |.  6A 00         push    0                                ; /pOverlapped = NULL
00401278  |.  52            push    edx                              ; |pBytesWritten => 复件_Cra.00403A0E
00401279  |.  50            push    eax                              ; |nBytesToWrite
0040127A  |.  57            push    edi                              ; |Buffer
0040127B  |.  53            push    ebx                              ; |hFile
0040127C  |.  E8 25030000   call    <jmp.&kernel32.WriteFile>        ; \WriteFile
00401281  |.  53            push    ebx                              ; /hObject
00401282  |.  E8 DD020000   call    <jmp.&kernel32.CloseHandle>      ; \CloseHandle
00401287  |.  6A 10         push    10                               ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL
00401289  |.  68 00304000   push    00403000                         ; |Title = "Crackme#3 By D4ph1"
0040128E  |.  68 86314000   push    00403186                         ; |Text = "Debugger found...I think im gonna kill myself!:("
00401293  |.  6A 00         push    0                                ; |hOwner = NULL
00401295  |.  E8 B2020000   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
0040129A  |.  6A 00         push    0                                ; /IsShown = 0
0040129C  |.  6A 00         push    0                                ; |DefDir = NULL
0040129E  |.  6A 00         push    0                                ; |Parameters = NULL
004012A0  |.  68 47314000   push    00403147                         ; |FileName = "\ERASER.BAT"
004012A5  |.  6A 00         push    0                                ; |Operation = NULL
004012A7  |.  6A 00         push    0                                ; |hWnd = NULL
004012A9  |.  E8 04030000   call    <jmp.&shell32.ShellExecuteA>     ; \ShellExecuteA
004012AE  |.  6A 00         push    0                                ; /ExitCode = 0
004012B0  \.  E8 BB020000   call    <jmp.&kernel32.ExitProcess>      ; \ExitProcess

这一段代码就是将批处理写入到一个bat文件中,然后调用ShellExecute函数执行改bat文件,将CrackMe和生成的.bat文件删除。

在这里,可以直接将or eax, eax修改为xor eax, eax,简单破解掉。算法使用明码比较,就像楼主分析的一样,兄弟们已经给出注册机了
2009-5-25 15:33
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
呵呵,下载一个试一试。
2009-5-30 13:18
0
游客
登录 | 注册 方可回帖
返回
//