欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

一路问情自动灌水机破解分析

程序员文章站 2022-04-22 10:15:32
文/图 December=================================== 一路问情?其实并不真的是问情,它是一个论坛名称!一路灌水,当然是一路灌水了,不然哪来那么多灌水狂...

文/图 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中。

后记
程序算法比较简单,注册机我就不写了,有兴趣的朋友可以自行研究一下。既然程序注册算法搞定了,我也用这个东西逛逛论坛,灌灌水先啦