160个CrackMe 077 firework2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了160个CrackMe 077 firework2相关的知识,希望对你有一定的参考价值。

首先,PEID查壳
技术分享

是一个Delphi程序

伪码检验:
技术分享
弹出错误对话框,于是去OD中,查找文本字符串:
技术分享

可以看到,在OD中字符串有点乱码,果然OD不太适用于处理Delphi的程序。

推荐一个极其强大的Delphi反汇编工具DeDe。
下面我们的思路就是用它来打开程序,找到程序的关键点,然后再OD中动态调试,破解程序。
OK,用DeDe 打开程序: 点击过程:
关于DeDe的使用
找到关键位置:
技术分享
Button1Click对应的正是用户点击OK按钮,双击后我们可以在DeDe看到代码:
技术分享

仅仅这样看代码我们很难分析出序列号算法,所以我们还是放到OD中去,找到函数的入口地址:

004416EC   55                     push    ebp

OD中Crtl+G过去:
技术分享
在函数头部F2下断,然后F9运行起来,输入伪码
技术分享
开始F8对代码进行分析,注意将每一个Call指令都当做是黑箱进行,分析出了程序的大致流程如下:

00441706  |.  8D55 FC       lea edx,[local.1]
00441709  |.  8B83 C8020000 mov eax,dword ptr ds:[ebx+0x2C8]
0044170F  |.  E8 901AFEFF   call fireworx.004231A4                   ;  ;计算serial的长度
00441714  |.  8B45 FC       mov eax,[local.1]
00441717  |.  50            push eax
00441718  |.  8D55 F4       lea edx,[local.3]
0044171B  |.  8B83 C4020000 mov eax,dword ptr ds:[ebx+0x2C4]
00441721  |.  E8 7E1AFEFF   call fireworx.004231A4                   ;  ;计算name字符串的长度
00441726  |.  FF75 F4       push [local.3]
00441729  |.  8D55 F0       lea edx,[local.4]
0044172C  |.  8B83 C4020000 mov eax,dword ptr ds:[ebx+0x2C4]
00441732  |.  E8 6D1AFEFF   call fireworx.004231A4
00441737  |.  FF75 F0       push [local.4]
0044173A  |.  68 BC174400   push fireworx.004417BC                   ;  ASCII 36,"25"
0044173F  |.  68 C8174400   push fireworx.004417C8                   ;  UNICODE "g"
00441744  |.  68 D4174400   push fireworx.004417D4                   ;  UNICODE "祝"
00441749  |.  8D45 F8       lea eax,[local.2]
0044174C  |.  BA 05000000   mov edx,0x5
00441751  |.  E8 9E23FCFF   call fireworx.00403AF4                   ;  ;序列号生成算法
00441756  |.  8B55 F8       mov edx,[local.2]                        ;  ;serila算法后的正确字符串
00441759  |.  58            pop eax                                  ;  ;用户输入的字符串
0044175A  |.  E8 E523FCFF   call fireworx.00403B44                   ;  字符串比较
0044175F      75 17         jnz short fireworx.00441778              ;  ;返回值等于0说明匹配成功,不等于0说明失败
这部分的堆栈,OD的识别有些乱,我们通过数据窗口跟随,得到值。
0044173A  |.  68 BC174400   push fireworx.004417BC                   ;  ASCII 36,"25"  625
0044173F  |.  68 C8174400   push fireworx.004417C8                   ;  UNICODE "g"   g
00441744  |.  68 D4174400   push fireworx.004417D4                   ;  UNICODE "祝"  72

之后我们进入序列号生成算法:

00403AF7   .  50            push eax
00403AF8   .  89D3          mov ebx,edx
00403AFA   .  31C0          xor eax,eax                              ;  ;循环变量edx=5进入循环
00403AFC   >  8B4C94 10     mov ecx,dword ptr ss:[esp+edx*4+0x10]
00403B00   .  85C9          test ecx,ecx                             ;  fireworx.0041E530
00403B02   .  74 03         je short fireworx.00403B07
00403B04   .  0341 FC       add eax,dword ptr ds:[ecx-0x4]
00403B07   >  4A            dec edx                                  ;  ;edx--
00403B08   .^ 75 F2         jnz short fireworx.00403AFC
00403B0A   .  E8 69FDFFFF   call fireworx.00403878
00403B0F   .  50            push eax
00403B10   .  89C6          mov esi,eax
00403B12   >  8B449C 14     mov eax,dword ptr ss:[esp+ebx*4+0x14]
00403B16   .  89F2          mov edx,esi                              ;  ;循环变量ebx=5进入循环
00403B18   .  85C0          test eax,eax
00403B1A   .  74 0A         je short fireworx.00403B26
00403B1C   .  8B48 FC       mov ecx,dword ptr ds:[eax-0x4]
00403B1F   .  01CE          add esi,ecx                              ;  fireworx.0041E530
00403B21   .  E8 86ECFFFF   call fireworx.004027AC                   ;  ;字符串拼接函数
00403B26   >  4B            dec ebx                                  ;  ;ebx--
00403B27   .^ 75 E9         jnz short fireworx.00403B12
00403B29   .  5A            pop edx                                  ;  ;序列号已经生成
00403B2A   .  58            pop eax                                  ;  0018F4A4
00403B2B   .  85D2          test edx,edx
00403B2D   .  74 03         je short fireworx.00403B32               ;  ;整理栈中数据

实话说,看到这个我是有点懵B的,之后多进行了几组伪码测试,我找到了规律之后再去分析代码就相对简单了,可见汇编基础的重要性。
算法就是name*2+625g72,就是一个字符串的拼接操作,只不过没有封装成函数,吓唬人罢了。

写注册机:
python:

name=raw_input("Please input your name")
serial=name+name+‘625g72‘
print serial

验证:
技术分享

以上是关于160个CrackMe 077 firework2的主要内容,如果未能解决你的问题,请参考以下文章

[CrackMe]160个CrackMe之19

[CrackMe]160个CrackMe之40

[CrackMe]160个CrackMe之40

# 160个CrackMe 003 Afkayas.2

160个crackme 004 ajj.1

160个CrackMe 002 Afkayas.1