安全路透社
当前位置:安全路透社 > 网络转载 > 正文

CrackMe破解系列第二番Afkayas.1

第一番地址:【传送门

一、源程序介绍

老规矩,还是首先熟悉下程序功能。

Afkayas.1.exe是一个序列号注册程序,只有输入正确的name和serial才会弹出正确的窗口。

下面是我在窗口随意输入的name和serial,因为serial不对,所以弹出错误窗口。

Pfkayas1.png

输入正确的name和serial后,会弹出正确窗口,并提醒你要破解它,写出算法。

Pfkayas2.png

程序功能很简单,下面我们来尝试破解程序。总共有两点需要去解决。

1,弹出正确窗口

2,逆向破解算法

二、弹出正确窗口

2.1 使用PEid查看程序

在使用OD对程序加载之前,我们先使用PEid加载程序,查看下程序使用的是什么语言。(因为不同语言的破解技巧会有一点出入)

Pfkayas3.png

在这里我们可以看到程序使用的是VB5.0/6.0

2.2 暴力破解-弹出正确窗口

下面我们开始用OD加载程序,并F9运行程序,查看程序是否运行正常,程序功能是否跟直接打开的功能一样。

Pfkayas4.png

这里我们发现程序运行一切正常。

在这里我们记住错误窗口的标题和主体的内容,这里是“You Get Wrong Try Again”。

老方法,在C窗口,右键-查找-所有参考文本字串,然后在新窗口(R窗口)中右键-查找文本,这里输入“You Get Wrong”,然后确定开始查找。

Pfkayas5.png

查找到记录后,双击打开该记录

Pfkayas6.png

我们在这里可以看到,这里有个跳转,可能就是破解的关键点

00402563              .  FF15 F4404000 call dword ptr ds:[<&MSVBVM50.__vbaFreeObjList>]  ;  msvbvm50.__vbaFreeObjList
00402569              .  83C4 0C       add esp,0xC
0040256C              .  B9 04000280   mov ecx,0x80020004
00402571              .  B8 0A000000   mov eax,0xA
00402576              .  894D 9C       mov dword ptr ss:[ebp-0x64],ecx
00402579              .  66:85F6       test si,si                                        ;  si!=0就成功了
0040257C              .  8945 94       mov dword ptr ss:[ebp-0x6C],eax
0040257F              .  894D AC       mov dword ptr ss:[ebp-0x54],ecx
00402582              .  8945 A4       mov dword ptr ss:[ebp-0x5C],eax
00402585              .  894D BC       mov dword ptr ss:[ebp-0x44],ecx
00402588              .  8945 B4       mov dword ptr ss:[ebp-0x4C],eax
0040258B              .  74 58         je XAfkayas_.004025E5                             ;  不跳转即可成功
0040258D 
             .  68 801B4000   push Afkayas_.00401B80                     
       ;  UNICODE "You Get It";name和serial正确,弹出窗口的主体内容
00402592              .  68 9C1B4000   push Afkayas_.00401B9C                            ;  UNICODE "
"
00402597              .  FFD7          call edi
00402599              .  8BD0          mov edx,eax
0040259B              .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
0040259E              .  FFD3          call ebx
004025A0              .  50            push eax
004025A1              .  68 A81B4000   push Afkayas_.00401BA8                            ;  UNICODE "KeyGen It Now"
004025A6              .  FFD7          call edi
004025A8              .  8D4D 94       lea ecx,dword ptr ss:[ebp-0x6C]
004025AB              .  8945 CC       mov dword ptr ss:[ebp-0x34],eax
004025AE              .  8D55 A4       lea edx,dword ptr ss:[ebp-0x5C]
004025B1              .  51            push ecx
004025B2              .  8D45 B4       lea eax,dword ptr ss:[ebp-0x4C]
004025B5              .  52            push edx
004025B6              .  50            push eax
004025B7              .  8D4D C4       lea ecx,dword ptr ss:[ebp-0x3C]
004025BA              .  6A 00         push 0x0
004025BC              .  51            push ecx
004025BD              .  C745 C4 08000>mov dword ptr ss:[ebp-0x3C],0x8
004025C4              .  FF15 10414000 call dword ptr ds:[<&MSVBVM50.#595>]              ;  msvbvm50.rtcMsgBox
004025CA              .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
004025CD              .  FF15 80414000 call dword ptr ds:[<&MSVBVM50.__vbaFreeStr>]      ;  msvbvm50.__vbaFreeStr
004025D3              .  8D55 94       lea edx,dword ptr ss:[ebp-0x6C]
004025D6              .  8D45 A4       lea eax,dword ptr ss:[ebp-0x5C]
004025D9              .  52            push edx
004025DA              .  8D4D B4       lea ecx,dword ptr ss:[ebp-0x4C]
004025DD              .  50            push eax
004025DE              .  8D55 C4       lea edx,dword ptr ss:[ebp-0x3C]
004025E1              .  51            push ecx
004025E2              .  52            push edx
004025E3              .  EB 56         jmp XAfkayas_.0040263B
004025E5 
             >  68 C81B4000   push Afkayas_.00401BC8                 
           ;  UNICODE "You Get Wrong" ;name和serial错误,弹出窗口的主体内容
004025EA              .  68 9C1B4000   push Afkayas_.00401B9C                            ;  UNICODE "
"
004025EF              .  FFD7          call edi
004025F1              .  8BD0          mov edx,eax
004025F3              .  8D4D E8       lea ecx,dword ptr ss:[ebp-0x18]
004025F6              .  FFD3          call ebx
004025F8              .  50            push eax
004025F9              .  68 E81B4000   push Afkayas_.00401BE8                            ;  UNICODE "Try Again"
004025FE              .  FFD7          call edi

从上面代码中,我们可以看到,[0040258B]地址处有一个跳转指令,是指说当ZF位=1则跳转 ;ZF位=0则不跳转。

0040258B              .  74 58         je XAfkayas_.004025E5                             ;  不跳转即可成功

而ZF位的数值是由上面一个test指令决定的。test表示的是对oper1和oper2进行按位与操作,其执行结果会影响ZF位的数值。

00402579              .  66:85F6       test si,si                                        ;  si!=0就成功了

当si=0,则test si,si的结果为0,ZF位置1,下面的je指令则发生跳转。

故,我们这里不能让程序执行跳转,所以,我们这里采用的是对je指令nop掉,不进行跳转。

下图是关键代码修改前的情况

Pfkayas7.png

下图是关键代码修改后的情况

Pfkayas8.png

修改完毕有,右键-复制到可执行文件-所有修改,选择全部复制;在切换的新窗口中,右键-保存文件,重命名为Afkayas.1_1.exe。

然后运行Afkayas.1_1.exe程序,随意输入name和serial,都能弹出正确窗口。

Pfkayas9.png

三、逆向破解算法

程序可以弹出正确窗口了,但是我们要进行下一步操作,写出破解算法。

OD加载程序,跳转到关键跳转指令位置处。

在这里我们看到是否跳转取决于test si,si的值,而离得最近的一个函数是

00402563              .  FF15 F4404000 call dword ptr ds:[<&MSVBVM50.__vbaFreeObjList>]  ;  msvbvm50.__vbaFreeObjList

我F7进去看过这个函数,没啥卵用,所以放弃该处,继续向上看。

看到一个__vbastrcmp函数,这个是vb语言中针对字符串比较的一个函数,所以怀疑是在此处。

Pfkayas11.png

于是在前面push eax位置F2下断点,重新加载程序,F9到断点位置F8向下走,到strcmp函数处F7进入该函数。

进入后发现又是一个字符串比较函数,同样F7进入该函数。注意(这里函数的参数值是”AKA-487758″

进入函数后,分析代码表示的含义

74023563 msvbvm50.__>  55              push ebp
74023564               8BEC            mov ebp,esp
74023566               53              push ebx
74023567               56              push esi
74023568               57              push edi
74023569               837D 10 00      cmp dword ptr ss:[ebp+0x10],0x0                   ; 比较用户输入的serial和数字0的大小
7402356D               BE 00000000     mov esi,0x0
74023572               74 06           je Xmsvbvm50.7402357A
74023574               8B45 10         mov eax,dword ptr ss:[ebp+0x10]                   ; 将用户输入的serial赋值给eax
74023577               8B70 FC         mov esi,dword ptr ds:[eax-0x4]                    ; esi记录的是serial长度*2
7402357A               837D 0C 00      cmp dword ptr ss:[ebp+0xC],0x0                    ; 比较AKA-487758字符串和数字0的大小
7402357E               BF 00000000     mov edi,0x0
74023583               74 06           je Xmsvbvm50.7402358B
74023585               8B4D 0C         mov ecx,dword ptr ss:[ebp+0xC]                    ; 将AKA-487758的数值赋值给ECX
74023588               8B79 FC         mov edi,dword ptr ds:[ecx-0x4]                    ; 将AKA-487758字符串的长度*2数值赋值给EDI
7402358B               3BFE            cmp edi,esi                                       ; 比较EDI和ESI的大小
7402358D               8BDF            mov ebx,edi
7402358F               73 25           jnb Xmsvbvm50.740235B6                            ; 用户输入的serial字符串长度短则跳转
74023591               837D 08 00      cmp dword ptr ss:[ebp+0x8],0x0
74023595               75 36           jnz Xmsvbvm50.740235CD
74023597               85DB            test ebx,ebx
74023599               74 28           je Xmsvbvm50.740235C3
7402359B               8BC3            mov eax,ebx
7402359D               D1E8            shr eax,1
7402359F               50              push eax
740235A0               FF75 0C         push dword ptr ss:[ebp+0xC]
740235A3               FF75 10         push dword ptr ss:[ebp+0x10]
740235A6               E8 3FA40000     call msvbvm50.7402D9EA                            ; 比较字符串是否相同的函数,若相同,则EAX为0
740235AB               85C0            test eax,eax
740235AD               74 0B           je Xmsvbvm50.740235BA
740235AF               5F              pop edi
740235B0               5E              pop esi
740235B1               5B              pop ebx
740235B2               5D              pop ebp
740235B3               C2 0C00         retn 0xC

这个函数也是一个过度函数,真正的字符串比较动作在call msvbvm50.7402D9EA 这个函数里面,F7进去能看到关键代码。

Pfkayas13.png

7402D9FA               F3:66:A7        repe cmps word ptr es:[edi],word ptr ds:[esi]     ;     

这个指令是比较用户输入的serial和”AKA-487758″是否相同,如果相同,则EAX为0,程序弹出正确窗口。

分析到此处,我们可以知道,我们进去的几个字符串比较函数的其中一个对象是我们的serial,另外一个是真正的serial。

且真正的serial是由字符串”AKA-”和一系列数字组合而成的。

Pfkayas19.png

那么真正的serial(一系列数字)是在哪里产生的呢?

回到最原始的那个__vbastrcmp函数位置处,继续向上翻,我们能看到几个STRING字符串。于是我们在此处下断点测试(破解的过程就是需要不断尝试),然后重新加载程序输入name=’gncao’;当程序执行到此处的时候我们发现我们输入的name字段已经被赋值给eax了。

Pfkayas14.png

仔细研究这段代码,写出注释如下:

Pfkayas15.png

这里就是最核心的算法,生成的是真正的serial。

我这里使用python实现破解算法:

#!/usr/bin/python
#coding:utf-8
name=raw_input("Please Input Your Name: ")
serial=len(name) * int('17cfb',16) + ord(name[0])
print 'The %s Serial is AKA-%s' % (name,serial)

程序运行代码情况如下:

Pfkayas16.png

在程序中输入name=’gncao’,serial=’AKA-487758′

Pfkayas17.png

至此,程序的逆向破解就到此结束了。

PS:楼主在逆向破解该程序时,曾试着想把程序的serial输出到弹窗的主体内容中,这样就可以直接看到真正的serial了,不用再写逆向函数了,但是在实验过程中出现一些问题没有成功。

哪位大佬方便的话指点一二,能够实现将serial直接链接文字输出到弹窗中。

* 本文作者gncao,转载注明来自FreeBuf.COM

未经允许不得转载:安全路透社 » CrackMe破解系列第二番Afkayas.1

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册