一路问情自动灌水机破解分析
文/图 December
===================================
一路问情?其实并不真的是问情,它是一个论坛名称!一路灌水,当然是一路灌水了,不然哪来那么多灌水狂?这一次的目标是一路问情出品的一个论坛自动灌水机,相信很多人都用过此类灌水机。闲来无事,偶然发现这么一款灌水机,很自然的就想看看它的注册验证机制,于是就有了本文。
这款程序的使用介绍我就不说了,喜欢的可以到其官方找详细教程。将程序丢进PEiD检测到加了tElock 0.98b1的壳,后面还发现有个Overlay,如图1所示,初步猜想可能是个用易语言编写的程序,先脱壳看看猜想是否成立吧!
图1
脱壳过程
用OD载入程序后,停在下面的代码处。
00473BD6 A>^E9 25E4FFFF jmp Ask_Love.00472000
00473BDB 0000 add byte ptr ds:[eax],al
tElock 0.98b1载入后多数第一行是JMP,使用二次内存断点来脱吧。在OD打开“内存”,快捷键是“Alt+M”,可以看到“DATA”段,设置“内存写入断点”,如图2所示,“Shift+F9”后,内存断点发生效应,在写到00407000时中断了下来,清除刚才下的内存断点,继续打开“内存”,在“CODE”段设置“内存访问断点”,如图3所示。大家注意看图2和图3,下的内存断点是不同的,不要混淆了。“Shift+F9”后,发现刚好停在OEP处。
图2
图3
0040389F 55 push ebp
004038A0 8BEC mov ebp,esp
004038A2 6A FF push -1
004038A4 68 F8724000 push Ask_Love.004072F8
入口为0040389F是易语言的一个特有入口,和开始猜想的一样,可见大量的实战练习对脱壳破解来说是非常有用的。根据这个入口,易语言版本应该是最新版本,4.03版本以下的还没有发现有这个入口。题外话就不多说了,既然到了OEP了,自然就把它Dump出来了,启动LORDPE,选择程序的进程,右键选择“dump full”,如图4所示。Dump出来后,程序是无法正常运行的,还需要修复一下。启动ImportREC1.6,在OEP填上389F,再点“自动查找IAT”后,再点击“获取输入表”,发现N多无法识别出来的函数,不过没关系,使用“跟踪级别3”就可以找出正确的函数出来了,最后发现有一个函数还是无法识别出来,将其Cut掉就可以了,如图5所示。
图4
图5
修复后,运行脱壳程序会弹出一个错误对话框,这是由于附加数据没有补上造成的。很多人对易语言的这种特性不是很了解,所以大多会认为是自校验。下面把附加数据补上去吧,把脱壳后的程序丢进PEiD中,选择“附加数据v1.0”插件,在“资源文件”上选择脱壳前的程序,在“目标文件”上选择脱壳后的程序,最后点“复制附加数据”就可以把附加数据补上去了。
破解过程
运行脱壳后的程序,发现提示是否需要注册,点“是”,随便注册一下,如图6所示。竟然有这提示?实在是太需要了,呵呵!
图6
用OD载入,使用插件搜索字符串后,没发现图中出现的提示内容,所以直接走下断点这条路了。下断点:“bp MessageBoxA”,马上就中断了下来,不过这个不是我们想要的结果,再运行一次,会出现注册框,这才是需要的,随便注册一下后,就可以中断下来了。
77D5058A u> 8BFF mov edi,edi
;中断在这里
77D5058C 55 push ebp
77D5058D 8BEC mov ebp,esp
77D5058F 833D BC04D777 >cmp dword ptr ds:[77D704BC],0
77D50596 74 24 je short user32.77D505BC
取消刚才下的断点,返回去。
10062170 FF15 A0260C10 call dword ptr ds:[<&USER32.MessageB>; user32.MessageBoxA
10062176 5F pop edi ;返回到这里
10062177 83F8 03 cmp eax,3
原来10062170这里就是调用了那个失败对话框的地方,不管它了,这里的信息用处不大,单步一直走,来到下面的代码处。
00469CBE E8 DE4A0000 call Unpack.0046E7A1
;机器码
00469CC3 83C4 10 add esp,10
00469CC6 8945 FC mov dword ptr ss:[ebp-4],eax
00469CC9 68 DA6D4500 push Unpack.00456DDA
;ASCII "SHMILY"
00469CCE FF75 FC push dword ptr ss:[ebp-4]
00469CD1 B9 02000000 mov ecx,2
00469CD6 E8 17B2FFFF call Unpack.00464EF2
;机器码和固定字符串SHMILY连接起来
00469CDB 83C4 08 add esp,8
00469CDE 8945 F8 mov dword ptr ss:[ebp-8],eax
;eax保存结果
00469CE1 8B5D FC mov ebx,dword ptr ss:[ebp-4]
………
00469D48 B8 03000000 mov eax,3
00469D4D E8 314A0000 call Unpack.0046E783
;对上面连接后的结果进行MD5运算
跟进这个call,可以发现下面的代码。
02109BCB C742 4C 012345>mov dword ptr ds:[edx+4C],67452301
02109BD2 C742 50 89ABCD>mov dword ptr ds:[edx+50],EFCDAB89
02109BD9 C742 54 FEDCBA>mov dword ptr ds:[edx+54],98BADCFE
02109BE0 C742 58 765432>mov dword ptr ds:[edx+58],10325476
由这里可以判断程序使用了MD5密码学算法,继续往下看。
00469D52 83C4 10 add esp,10
00469D55 8945 F0 mov dword ptr ss:[ebp-10],eax
;eax保存结果
……
00469D81 BB 50010000 mov ebx,150
00469D86 E8 0A4A0000 call Unpack.0046E795
;小写转为大写
00469D8B 83C4 10 add esp,10
……
00469DC9 83F8 00 cmp eax,0
00469DCC B8 00000000 mov eax,0
00469DD1 0F94C0 sete al
;检测条件为真还是为假
00469DD4 8945 E4 mov dword ptr ss:[ebp-1C],eax
00469DD7 8B5D E8 mov ebx,dword ptr ss:[ebp-18]
……
00469DF4 83C4 04 add esp,4
00469DF7 837D E4 00 cmp dword ptr ss:[ebp-1C],0
;比较
00469DFB 0F84 13010000 je Unpack.00469F14
;相等的话就跳到注册失败处
00469E01 6A FF push -1
……
00469E35 68 A86E4500 push Unpack.00456EA8
;ASCII "SOFTWAREaskloveautobbs
ame"
00469E3A 68 01030080 push 80000301
00469E3F 6A 00 push 0
……
00469E9A 6A 00 push 0
00469E9C 68 C66E4500 push Unpack.00456EC6
; ASCII "SOFTWAREaskloveautobbssn"
00469EA1 68 01030080 push 80000301
00469EA6 6A 00 push 0
很明显,上面就是这个程序的算法部分,简单说明一下吧。程序将从用户机器上取得的机器码和固定字符串SHMILY连接起来,然后进行MD5运算,再将其转为大写,就是注册码了,算法非常简单。如果要爆破的话,可以在00469DFB处考虑。注册成功后,注册信息将写入注册表,机器码写到HKEY_LOCAL_MACHINESOFTWAREaskloveautobbs ame中,注册码写到HKEY_LOCAL_MACHINESOFTWAREaskloveautobbssn中。
后记
程序算法比较简单,注册机我就不写了,有兴趣的朋友可以自行研究一下。既然程序注册算法搞定了,我也用这个东西逛逛论坛,灌灌水先啦