• 标 题:duelist crackme 2 破解(上) (6千字)
  • 作 者:丁丁虾
  • 时 间:2000-10-17 15:08:09
  • 链 接:http://bbs.pediy.com

duelist crackme 2 破解(上)      (希望转载的时候保持完整)

作者    丁丁虾  ddxia/[CCG]
目标     duelist crackme 2
目标URL    http:\\go.163.com\~ddxia\crackme\DueList\Due-cm2.zip
工具          SoftIce4.01 for NT  WinHex    winapi.hlp

    我们读一下它的readme.txt,就知道这是一道解keyfile类型crackme。

    keyfile类型解决方法:
        1、得到文件名
        2、通过分析代码来获得文件内容!

    首先运行它,看看有什么出错消息---->>"你的使用期限到了,请拷贝keyfile到

该目录下!"。它要读取文件一定用CreateFileA这个API函数。于是在目标程序运行前下

中断
    bpx CreateFileA
    被拦截下来,按F11回到程序代码中
001B:0040105C  6A00                    PUSH      00
001B:0040105E  686F214000    PUSH      0040216F
001B:00401063  6A03                    PUSH      03
001B:00401065  6A00          PUSH      00
001B:00401067  6A03                  PUSH      03
001B:00401069  68000000C0    PUSH      C0000000
001B:0040106E  6879204000      PUSH      00402079
001B:00401073  E80B020000    CALL      KERNEL32!CreateFileA
001B:00401078  83F8FF              CMP      EAX,-01
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果打开文件失败,eax=-01
001B:0040107B  751D                  JNZ      0040109A 
001B:0040107D  6A00                  PUSH      00
001B:0040107F  6801204000      PUSH      00402001
001B:00401084  6817204000      PUSH      00402017
001B:00401089  6A00                    PUSH      00
001B:0040108B  E8D7020000      CALL      USER32!MessageBoxA
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>出错信息
001B:00401090  E824020000      CALL      KERNEL32!ExitProcess       

    让我们看一下调用CreateFileA API的参数含义。

HANDLE CreateFile(

    LPCTSTR lpFileName,    // 指向文件名的指针
    DWORD dwDesiredAccess,    //读写模式
    DWORD dwShareMode,    // 共享模式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,    // 安全属性指针
    DWORD dwCreationDistribution,    // 创建标志
    DWORD dwFlagsAndAttributes,    // 文件属性
    HANDLE hTemplateFile     // 文件属性的复制句柄
  );    

    其中我们最关心的是    LPCTSTR lpFileName这个参数。需要注意的是在API

的调用中ASM和高级语言是有区别的,最先出现的参数,ASM中最后PUSH。然后我们

就看出是以下这行代码是文件名指针
     PUSH      00402079
    d  402079           
                  看到什么??-----due-cm2.dat----->>>keyfile的名字
    到目前我们就完成了第一步!

    接着我们进行下面一步进行挖掘文件的内容,好象有的点观看挖掘老山汉墓的

感觉 呵呵~~~~~~
    在目录下建一个文件名字为due-cm2.dat,再跟踪看一看是怎样的情形。
001B:00401073  E80B020000    CALL      KERNEL32!CreateFileA
001B:00401078  83F8FF              CMP      EAX,-01
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果打开文件失败,eax=-01
001B:0040107B  751D                  JNZ      0040109A 
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>如果成功,就跳到40109A

    然后看一看40109A的代码
001B:0040109A  6A00                  PUSH      00        //数据结构指针
001B:0040109C  6873214000    PUSH      00402173        //实际读取的字节数
001B:004010A1  6A46                    PUSH      46        //需要读取的字节数
001B:004010A3  681A214000    PUSH      0040211A        //存放内容的文件指针
001B:004010A8  50                    PUSH      EAX                                  //文件的句柄
001B:004010A9  E82F020000    CALL      KERNEL32!ReadFile
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>返回参数为非零,就成功
    ReadFile API中需要注意的三个参数:402173    46      40211A

001B:004010AE  85C0                TEST      EAX,EAX
001B:004010B0  7502                  JNZ      004010B4
001B:004010B2  EB43                JMP      004010F7
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>出错跳远
001B:004010B4  33DB                XOR      EBX,EBX
001B:004010B6  33F6                  XOR      ESI,ESI
001B:004010B8  833D7321400012      CMP      DWORD PTR [00402173],12
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>文件的字节数是否大于12,

注意12是十六进制=18,小于18个字节就出错!
001B:004010BF  7C36                JL        004010F7
001B:004010C1  8A831A214000        MOV      AL,[EBX+0040211A]
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>取每一个字节进行比较
001B:004010C7  3C00                CMP      AL,00
001B:004010C9  7408                JZ        004010D3
001B:004010CB  3C01              CMP      AL,01
001B:004010CD  7501                JNZ      004010D0
001B:004010CF  46                    INC      ESI
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>ESI是累计01的个数
001B:004010D0  43                    INC      EBX
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>文件偏移指针
001B:004010D1  EBEE              JMP      004010C1
001B:004010D3  83FE02            CMP      ESI,02
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>01的个数要大于等于2
001B:004010D6  7C1F                JL        004010F7
001B:004010D8  33F6                XOR      ESI,ESI
001B:004010DA  33DB                XOR      EBX,EBX
001B:004010DC  8A831A214000        MOV      AL,[EBX+0040211A]
001B:004010E2  3C00                CMP      AL,00
001B:004010E4  7409                JZ        004010EF
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>判断是否到文件尾部
001B:004010E6  3C01                CMP      AL,01
001B:004010E8  7405                JZ        004010EF
001B:004010EA  03F0                ADD      ESI,EAX
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>当不等于01和00的时候进行

累加
001B:004010EC  43                    INC      EBX
001B:004010ED  EBED              JMP      004010DC
001B:004010EF  81FED5010000        CMP      ESI,000001D5
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>当累加到1D5时,就跳转,

否则出错!!!
001B:004010F5  741D                JZ        00401114

001B:004010F7  6A00                PUSH      00
001B:004010F9  6801204000  PUSH      00402001
001B:004010FE  6886204000  PUSH      00402086
001B:00401103  6A00                PUSH      00
001B:00401105  E85D020000  CALL      USER32!MessageBoxA
             ^^^^^^^^^^^^^^^^^^^^^^^^^^------>错误信息。
001B:0040110A  E8AA010000 CALL      KERNEL32!ExitProcess
    到这里我们中场休息10分钟,看看目前战果如何?^_^
    1、文件的长度至少18个字节。
    2、文件中01的字节至少有2个。
    3、文件中再遇到01字节前,至少累加和为1D5。
    aa+aa+81=1d5 (十六进制数字顺便取)
    文件内容至少是这样 AA AA 81 01 01 00 00......凑够18个字节就行了

    下课了,3点俺要上班了,下回接着讲啊!呵呵~~~~~~~~~~~~
    啊哦!!迟到了,没有关系,领导不在!!呵呵~~~~~~~~~~~~
                时间:2000.10.17 15:02:33

  • 标 题:duelist crackme 2 破解(下) (3千字)
  • 作 者:丁丁虾
  • 时 间:2000-10-17 18:48:55

duelist crackme 2 破解(下)      (希望转载的时候保持完整)

作者    丁丁虾  ddxia/[CCG]
E_mail        ddxia@263.net (如果Crackme教学文章中有错,请来信:))
Web            http://go18.163.com/~ddxia
目标     duelist crackme 2
目标URL    http:\\go.163.com\~ddxia\crackme\DueList\Due-cm2.zip
工具          SoftIce4.01 for NT  WinHex    winapi.hlp
    
    经过一下午的苦活,终于有时间写下辑了 呵呵~~~~~
001B:00401114  33F6                          XOR      ESI,ESI
001B:00401116  43                              INC      EBX
            ^^^^^^^^^^^^^^^^^^^^^^^^^^----->>ebx值是指向碰到第一个01时的指针
001B:00401117  8A831A214000        MOV      AL,[EBX+0040211A]
001B:0040111D  3C00                        CMP      AL,00
001B:0040111F  7418                        JZ        00401139
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>判断是否到文件尾部
001B:00401121  3C01                        CMP      AL,01
001B:00401123  7414                        JZ        00401139
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>由于上回已经知道01有两个,这里假设两个01为连在一起,所以要跳
001B:00401125  83FE0F                  CMP      ESI,0F
001B:00401128  730F                        JAE      00401139
001B:0040112A  32861A214000      XOR      AL,[ESI+0040211A]
001B:00401130  898660214000      MOV      [ESI+00402160],EAX
001B:00401136  46                            INC      ESI
001B:00401137  EBDD                      JMP      00401116

001B:00401139  43                            INC      EBX
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>移动指向字节的指针
    下面这一段代码基本和上回说的代码相同。            
001B:0040113A  33F6                      XOR      ESI,ESI
001B:0040113C  8A831A214000  MOV      AL,[EBX+0040211A]
001B:00401142  3C00                    CMP      AL,00
001B:00401144  7409                      JZ        0040114F
001B:00401146  3C01                    CMP      AL,01
001B:00401148  74F2                    JZ        0040113C
001B:0040114A  03F0                    ADD      ESI,EAX
001B:0040114C  43                          INC      EBX
001B:0040114D  EBED                  JMP      0040113C
001B:0040114F  81FEB2010000  CMP      ESI,000001B2
            ^^^^^^^^^^^^^^^^^^^^^^^^^^------>剩余的累加和为1B2
001B:00401155  75A0                    JNZ      004010F7
001B:00401157  6A00                    PUSH      00
001B:00401159  68C9114000        PUSH      004011C9
001B:0040115E  6A00                    PUSH      00
001B:00401160  6A05                    PUSH      05
001B:00401162  FF3577214000    PUSH      DWORD PTR [00402177]
001B:00401168  E842020000        CALL      USER32!DialogBoxParamA
001B:0040116D  EB53                    JMP      004011C2
    AA+AA+5E=1B2
    于是可以得到一个文件的内容为
    AA AA 81 01 01 AA AA 5E 00..............至少要有18个字节!这样就OK了
    本想收工了。后来把程序又看了一遍,发现还有一个地方不是很明白。
001B:00401125  83FE0F                  CMP      ESI,0F
001B:00401128  730F                        JAE      00401139
001B:0040112A  32861A214000      XOR      AL,[ESI+0040211A]
001B:00401130  898660214000      MOV      [ESI+00402160],EAX
001B:00401136  46                            INC      ESI
001B:00401137  EBDD                      JMP      00401116
    大家如果有时间可以进一步研究这段程序,你发现好好玩的哦!^_^
    给点提示:
    AA AA 81 01 ........中间...........01 AA AA 5E 00..............至少要有18个字节
                        |--->>允许有    小于16个字节的存在。将会显示在对话框中
                    如果大于16个字节,会死循环^_^


                时间:2000.10.17 18:33:33

  • 标 题:这段程序是计算用户名的 (700字)
  • 作 者:真.hp
  • 时 间:2000-10-18 15:18:51

这段程序是计算用户名的

:00401125 83FE0F          cmp esi, 0000000F              ;用户名<=15个字节
:00401128 730F            jnb 00401139
:0040112A 32861A214000    xor al, byte ptr [esi+0040211A]    ;把第1个01后,第2个01前的第1个字节与
:00401130 898660214000    mov dword ptr [esi+00402160], eax  ;keyfile的第1个字节xor。
:00401136 46              inc esi                            ;再把第1个01后,第2个01前的第2个字节
:00401137 EBDD            jmp 00401116                      ;与keyfile的第2个字节xor,以此类推得出用户名。

AA AA 81 01 CE CE F9 68 AF E1 BA 2B E8 01 AA AA 5E 00

FF D6 01 9B B2 79 F2 D3 56 B1 90 11 01 FF B3 00 00 00

这是两个不同的keyfile,但用户名均为:ddxia/CCG