CrackMe破解系列第二番Afkayas.1

黑客与极客 / 2018年02月23日 16:00

互联网+

第一番地址:【传送门】

一、源程序介绍

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

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

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

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

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

1,弹出正确窗口

2,逆向破解算法

二、弹出正确窗口 2.1 使用PEid查看程序

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

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

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

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

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

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

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

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

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

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掉,不进行跳转。

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

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

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

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

三、逆向破解算法

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

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

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

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

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

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

于是在前面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进去能看到关键代码。

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

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

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

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

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

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

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

这里就是最核心的算法,生成的是真正的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)

程序运行代码情况如下:

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

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

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

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

* 本文作者gncao,转载注明来自FreeBuf.COM返回搜狐,查看更多

责任编辑:

1.环球科技网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.环球科技网的原创文章,请转载时务必注明文章作者和"来源:环球科技网",不尊重原创的行为环球科技网或将追究责任;3.作者投稿可能会经环球科技网编辑修改或补充。