首页
社区
课程
招聘
[求助]高手帮忙分析下
发表于: 2007-8-5 17:46 4544

[求助]高手帮忙分析下

2007-8-5 17:46
4544
VB6程序,反OD调试(出错不能正确下断),用C32AMS找出字符串,
::0042ECFE::  8D4D E8                  LEA ECX,[EBP-18]                        
::0042ED01::  66:A3 38004300           MOV [430038],AX                        
::0042ED07::  FF15 10124000            CALL [401210]                               >>>: MSVBVM60.DLL:__vbaFreeObj
::0042ED0D::  8D4D D8                  LEA ECX,[EBP-28]                        
::0042ED10::  FF15 1C104000            CALL [40101C]                               >>>: MSVBVM60.DLL:__vbaFreeVar
::0042ED16::  B9 04000280              MOV ECX,80020004                        
::0042ED1B::  B8 0A000000              MOV EAX,A                              
::0042ED20::  894D B0                  MOV [EBP-50],ECX                        
::0042ED23::  894D C0                  MOV [EBP-40],ECX                        
::0042ED26::  8D55 88                  LEA EDX,[EBP-78]                        
::0042ED29::  8D4D C8                  LEA ECX,[EBP-38]                        
::0042ED2C::  8945 A8                  MOV [EBP-58],EAX                        
::0042ED2F::  8945 B8                  MOV [EBP-48],EAX                        
::0042ED32::  C745 90 A4684000         MOV DWORD PTR [EBP-70],4068A4               \->: 提示!
::0042ED39::  895D 88                  MOV [EBP-78],EBX                        
::0042ED3C::  FFD6                     CALL ESI                                
::0042ED3E::  8D55 98                  LEA EDX,[EBP-68]                        
::0042ED41::  8D4D D8                  LEA ECX,[EBP-28]                        
0042ED3C  CALL ESI                                
0042ED3E  LEA EDX,[EBP-68]                        
0042ED41  LEA ECX,[EBP-28]                        
0042ED44  MOV DWORD PTR [EBP-60],407594               \->: 程序将重新启动,以检查注册码是否正确!
0042ED4B  MOV [EBP-68],EBX                        
0042ED4E  CALL ESI                                

                                
........................

0042EC87  CALL ESI                                
0042EC89  LEA EDX,[EBP-68]                        
0042EC8C  LEA ECX,[EBP-28]                        
0042EC8F  MOV DWORD PTR [EBP-60],407570               \->: 恭喜你!注册成功!
0042EC96  MOV [EBP-68],EBX                        
0042EC99  CALL ESI      

  .....................

0042EDBE  CALL EDI                                
0042EDC0  LEA EDX,[EBP-68]                        
0042EDC3  LEA ECX,[EBP-28]                        
0042EDC6  MOV DWORD PTR [EBP-60],4075C0               \->: 对不起,注册失败!请检查注册码!
0042EDCD  MOV [EBP-68],EBX                        
0042EDD0  CALL EDI                        

应该是输入注册正确才会有重启验证,不然就跳到不正确处,找不出关键CALL,关键跳转 没有一点思路..

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
2
寻找读取输入信息的地方,VB的东西,我不知道能不能下GetWindowTextA之类的断点,如果能断下的话一路F9回到用户程序领空
如果不行,可以用SmartCheck来找一找关键的事件处理过程
2007-8-5 18:57
0
雪    币: 1355
活跃值: (344)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
3
是什么程序?给个地址,我来学习研究一下
2007-8-5 19:47
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hnr
4
下载地址:
http://www.jh686.cn/soft/vcdlogo30.rar
http://www.jh686.cn/vcdlogo.rar
用OD就不能调试,更别说下断GetWindowTextA,都没找到..
VB的东西没破过,不知道关键跳转是不是也在CALL里,
而且是注册码正确才重启验证,(从字符上看)..楼上两位大哥一起研究下..
2007-8-5 21:01
0
雪    币: 1355
活跃值: (344)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
5
呵呵,终于解决了。先看看结果,整理一下,等会跟帖发过程和小甜饼,让大家都能用上这个恼人
的“CRACKME”——VCD开机画面随心换V3.0

机器码:F62EAA14415B4116
注册码:9E053DC5B75E9A18   (后面可以跟些字符,但不影响注册,最终只保留前面的16位注册码信息)

机器码是根据C盘卷的序列号经过某某有名的算法产生的,取变形后的前16位作为机器码。该死的
内置程序版本标志“jhvcdlogo30”,提取“jhvcdlogo”作为连接字符跟机器码连接,我忘了
具体细节了,好像是经过特殊算法的变形(估计这个算法跟取C盘序列号变形的算法是相同的)
产生了最后的注册码。是明码比较的。
程序经过特殊处理,具有迷惑分析的能力,而且替换了COMMAND组件,用画出来的XP风格按钮替换
断点不好设置。而且有TIMER控件时刻干扰,郁闷。。。注册成功后,将取系统登陆的用户名作为
注册用户名 取消掉窗口上的“未注册”字样
再等等,马上就将方法告诉跟我一样的菜鸟
另外我觉得这样的软件卖得太贵了。。。我等学生一族没能力购买的了。。。

正文:

注册信息保存在:HKEY_CURRENT_USER\Software\LOGO ProgramSettings\logoinfo\reginfo\LiberationKey

附件是内存注册机和删除注册信息再玩一遍的REG文件,解压密码是:159357 使用时,请关闭杀毒软件,或者添加为信任程序。该内存注册机匹配 http://www.jh686.cn/soft/vcdlogo30.rar 这个版本

得到的注册码前16位真实有效,后面的可以忽略掉。当然,不忽略也可以成功注册的。还有,使用此内存注册机不要求原程序脱壳。原程序不要改名字,而且不必脱壳。

加载程序的时候OD提示压缩了,那么十之八九加壳了(VB程序除外),也不用PEID了,我习惯这样。

直接用OD受脱,什么ESP定律了,什么步步为营了,还有脱壳机,直接找POPAD等。
这里我用翻动窗口,直接找到:

00436718  - E9 4BB4FCFF     jmp     00401B68

在它身上下断点,F9,断下来,F2,回车,F2,F9,F2,DUMP就OK了
重新加载新的程序,明显的VB语言。

刚开始利用VBEXPLORER来查找事件断点,找到了XP风格的断点,中圈套了,一个劲的被TIMER干扰。撤退~~

利用rtcmsgbox来断点,CTRL+F9,返回,呵呵,看到个JE,改一下,恩,提示注册成功了。真是幸福啊~~然后提示重新启动程序

重新启动后蹦出个窗口,提示未注册,幸福来的快去的也快。接下来猛攻重启验证,弄了好久不成功。撤退~~

呵呵,上面是引导你的思路的,下面才开始:

程序启动时候,LOAD事件中,通过GetVolumelnformationA来获取C盘的序列号。随后利用MID()函数再分别从开头字符依次取它们的十六进制ASC,开始很多运算,烦死了,很长很长。头疼。

如果你想看看机器码到底如何产生,那么加载程序后,先在命令输入栏上“bp GetVolumeInformationA”

F9 断在这里:

7C821BA5 >  6A 44           push    44
7C821BA7    68 201D827C     push    7C821D20
7C821BAC    E8 1509FEFF     call    7C8024C6
7C821BB1    33F6            xor     esi, esi
7C821BB3    3975 08         cmp     dword ptr [ebp+8], esi

CTRL+9,回到上级。一步步来跟吧。。。反正我跟了好久就像进了桃花阵。。。
我不懂算法,很少研究复杂的算法。这个算法好像挺经典的,我不认识。老长老长的。

接入正题,怎么破?怎么下断点?

vbaStrCmp
vbaStrComp

这两个都给我下断点,哦,先别急着下断点。先加载程序,F9让它跑起来。好了,打开注册界面输入123456789假注册码吧。然后用函数断点,

找到上述两个函数,或者直接在命令输入栏里输入断点命令:BP MSVBVM60.__vbaStrCmp  BP MSVBVM60.__vbaStrComp
(两个调用断点分开输入)

下好短点之后就单击注册吧。断在这里:

733B4813 >  FF7424 08       push    dword ptr [esp+8]
733B4817    FF7424 08       push    dword ptr [esp+8]
733B481B    6A 00           push    0
733B481D    E8 03000000     call    __vbaStrComp
733B4822    C2 0800         retn    8
733B4825 >  837C24 04 02    cmp     dword ptr [esp+4], 2
733B482A    0F84 DB2C0200   je      733D750B

没事情做就看看堆栈:
堆栈 ss:[0012EBD8]=00157CEC, (UNICODE "jhvcdlogo30")

jhvcdlogo30 这个字符很刺眼,似乎是作者的软件名称加版本号,这里作为连接字符参与运算。

没什么意义了,就算知道了,呵呵,我也不知道他的算法是怎么搞的。太复杂了。我们不管它,F8潇洒的走下去~~~(心里有个底,算法简单的
就分析算法写注册机,算法复杂的就看是否明码比较,明码比较就写内存注册机,暗码比较就爆破,重启还验证的再爆破~~~一路高歌,菜鸟从来就是这么痛快和低级的——不要笑了)

F8下去后发现进入了算法区,挑花阵!赶快出来,这个算法不好弄。按F9重新断下,看看堆栈:
堆栈 ss:[0012EAC0]=0016CACC, (UNICODE "123456789")

恩,假码露脸了。呵呵~~打起精神来吧,小心点,一步步跟,跟了一会儿无非前戏,没意思,撤退~~~直接F9,再次断下:

733B4813 >  FF7424 08       push    dword ptr [esp+8]
733B4817    FF7424 08       push    dword ptr [esp+8]
733B481B    6A 00           push    0
733B481D    E8 03000000     call    __vbaStrComp
733B4822    C2 0800         retn    8
733B4825 >  837C24 04 02    cmp     dword ptr [esp+4], 2
733B482A    0F84 DB2C0200   je      733D750B

呵呵,回到这里了。F9一下。然后,疯狂F8,到:

166A741E    FF15 78106916   call    dword ptr [16691078]             ; MSVBVM60.__vbaHresultCheckObj
166A7424    8B4D DC         mov     ecx, dword ptr [ebp-24]
166A7427    8B56 4C         mov     edx, dword ptr [esi+4C]
166A742A    8B1D 64106916   mov     ebx, dword ptr [16691064]        ; MSVBVM60.__vbaStrCat
166A7430    51              push    ecx
166A7431    52              push    edx

寄存器中:
ECX 001576F4 UNICODE "F62EAA14415B4116" ——这个是机器码
EDX 00157D14 UNICODE "jhvcdlogo"——这个是连接后参与运算的字符

166A7432    FFD3            call    ebx ——字符连接,可看寄存器
166A7434    8B3D 58126916   mov     edi, dword ptr [16691258]        ; MSVBVM60.__vbaStrMove
166A743A    8BD0            mov     edx, eax
166A743C    8D4D D8         lea     ecx, dword ptr [ebp-28]

寄存器:
EAX 0016CF94 UNICODE "F62EAA14415B4116jhvcdlogo"

166A743A    8BD0            mov     edx, eax
166A743C    8D4D D8         lea     ecx, dword ptr [ebp-28]
166A743F    FFD7            call    edi
166A7441    50              push    eax
166A7442    8B46 44         mov     eax, dword ptr [esi+44]
166A7445    50              push    eax
166A7446    FFD3            call    ebx
166A7448    8BD0            mov     edx, eax
166A744A    8D4D D4         lea     ecx, dword ptr [ebp-2C]
166A744D    FFD7            call    edi
166A744F    8B0E            mov     ecx, dword ptr [esi]

经过上面这一段后,连接了"jhvcdlogo30" 看寄存器:
EAX 0016FF44 UNICODE "F62EAA14415B4116jhvcdlogojhvcdlogo30"

166A745A    FF91 84080000   call    dword ptr [ecx+884] ————关键算法,执行这个之后,标记为HELLO1

就根据"F62EAA14415B4116jhvcdlogojhvcdlogo30"挺出了注册码的前身,看寄存器:

EDX 0016C584 UNICODE "9E053DC5B75E9A186D2F61170C0B7BDF"

这串字符其实就可以拿来注册的了,其实它的前面16位才是有效注册码。后面的跟不跟都没关系。我们在这做内存注册机。
送给你们当点心、甜饼。大餐的话我功力不够,做不好。

166A74C5    FF15 2C106916   call    dword ptr [1669102C]             ; MSVBVM60.__vbaStrVarMove 取你的假注册码
166A7525    8995 78FFFFFF   mov     dword ptr [ebp-88], edx
166A752B    C785 70FFFFFF 0>mov     dword ptr [ebp-90], 4008
166A7535    FFD7            call    edi
166A7537    8D55 B0         lea     edx, dword ptr [ebp-50]
166A753A    8D45 A0         lea     eax, dword ptr [ebp-60]
166A753D    52              push    edx
166A753E    50              push    eax
166A753F    FF15 20116916   call    dword ptr [16691120]             ; MSVBVM60.__vbaVarTstEq
166A7545    8D4D A0         lea     ecx, dword ptr [ebp-60]
166A7548    66:8BF8         mov     di, ax
166A754B    8D55 B0         lea     edx, dword ptr [ebp-50]
166A754E    51              push    ecx
166A754F    8D45 C0         lea     eax, dword ptr [ebp-40]
166A7552    52              push    edx
166A7553    50              push    eax
166A7554    6A 03           push    3
166A7556    FFD3            call    ebx
166A7558    66:F7DF         neg     di
166A755B    1BFF            sbb     edi, edi
166A755D    B9 08000000     mov     ecx, 8
166A7562    897D E8         mov     dword ptr [ebp-18], edi
166A7565    8BFC            mov     edi, esp
166A7567    8B16            mov     edx, dword ptr [esi]
166A7569    894D 80         mov     dword ptr [ebp-80], ecx
166A756C    890F            mov     dword ptr [edi], ecx
166A756E    8B4D 84         mov     ecx, dword ptr [ebp-7C]
166A7571    B8 ACA56916     mov     eax, 1669A5AC                    ; UNICODE "RegisteredUser"
166A7576    56              push    esi
166A7577    894F 04         mov     dword ptr [edi+4], ecx
166A757A    8945 88         mov     dword ptr [ebp-78], eax
166A757D    8947 08         mov     dword ptr [edi+8], eax
166A7580    8B45 8C         mov     eax, dword ptr [ebp-74]
166A7583    8947 0C         mov     dword ptr [edi+C], eax
166A7586    FF92 90030000   call    dword ptr [edx+390]
166A758C    85C0            test    eax, eax
166A758E    DBE2            fclex
166A7590    7D 12           jge     short 166A75A4
166A7592    68 90030000     push    390
166A7597    68 DC926916     push    166992DC
166A759C    56              push    esi
166A759D    50              push    eax
166A759E    FF15 78106916   call    dword ptr [16691078]             ; MSVBVM60.__vbaHresultCheckObj
166A75A4    68 F0756A16     push    166A75F0

上面这一段是给提取用户信息

166A753F    FF15 20116916   call    dword ptr [16691120]             ; MSVBVM60.__vbaVarTstEq

上面这一句莫非是关键比较?为了验证我们的想法,请先在这里下断点,待会有用!!!!!我们标记为:NO1断点

166A416C    52              push    edx
166A416D    56              push    esi
166A416E    FF91 48080000   call    dword ptr [ecx+848]
166A4174    3BC7            cmp     eax, edi                         ; 莫非是关键标志检测?先再这里下断点,标记为NO2断点
166A4176    7D 12           jge     short 166A418A
166A4178    68 48080000     push    848
166A417D    68 0C936916     push    1669930C
166A4182    56              push    esi
166A4183    50              push    eax
166A4184    FF15 78106916   call    dword ptr [16691078]             ; MSVBVM60.__vbaHresultCheckObj
166A418A    8B45 C8         mov     eax, dword ptr [ebp-38]
166A418D    83EC 10         sub     esp, 10
166A4190    8BD4            mov     edx, esp
166A4192    B9 0B400000     mov     ecx, 400B
166A4197    894D CC         mov     dword ptr [ebp-34], ecx
166A419A    8945 C4         mov     dword ptr [ebp-3C], eax
166A419D    890A            mov     dword ptr [edx], ecx
166A419F    8B4D D0         mov     ecx, dword ptr [ebp-30]
166A41A2    8D45 C4         lea     eax, dword ptr [ebp-3C]
166A41A5    6A 01           push    1
166A41A7    894A 04         mov     dword ptr [edx+4], ecx
166A41AA    8945 D4         mov     dword ptr [ebp-2C], eax
166A41AD    6A 01           push    1
166A41AF    56              push    esi
166A41B0    8942 08         mov     dword ptr [edx+8], eax
166A41B3    8B45 D8         mov     eax, dword ptr [ebp-28]
166A41B6    8942 0C         mov     dword ptr [edx+C], eax
166A41B9    FF15 40106916   call    dword ptr [16691040]             ; MSVBVM60.__vbaRaiseEvent 提示错误信息了
166A41BF    83C4 1C         add     esp, 1C

一路下来,到这里就已经提示错误了,大概的流程已经有了个印象了。好了,我们单击确定,F9运行下去,重新填上注册信息,再次注册。

断下来后,一路狂按F9,直到NO2断点,修改
166A4176    7D 12           jge     short 166A418A  改它为不跳走,试试能不能突破?(改标志S即可)

测试结果为不是标志,所以取消掉NO2断点,下面重复上一验证的方法,来看看NO1能起什么作用?
F9运行下去,重新填上注册信息,再次注册。断下来后,一路狂按F9,直到NO1断点,修改

166A753F    FF15 20116916   call    dword ptr [16691120]             ; NO1断点
166A7545    8D4D A0         lea     ecx, dword ptr [ebp-60]            怎么改?执行到这一句后,看看寄存器:
166A7548    66:8BF8         mov     di, ax
166A754B    8D55 B0         lea     edx, dword ptr [ebp-50]
166A754E    51              push    ecx

寄存器:
EAX 00000000

呵呵,用鼠标在EAX上双击,修改数据为“FFFFFFFF”如:
EAX FFFFFFFF

然后F9运行到底,提示注册成功了。看来不出所料,

166A753F    FF15 20116916   call    dword ptr [16691120]             ; MSVBVM60.__vbaVarTstEq

这一句(NO1断点处)还真的是关键比较的地方了。我是不知道怎么改好,如果要爆破的话。这里好像是不能修改代码的。

不过可以打内存补丁进行爆破。如果你用注册码,这里也就不用管了。好了,先讲到这里吧。

附件是内存注册机和删除注册信息再玩一遍的REG文件,解压密码是:159357

该内存注册机匹配 http://www.jh686.cn/soft/vcdlogo30.rar

得到的注册码前16位真实有效,后面的可以忽略掉。不忽略也可以成功注册。

想睡觉了~~哎~~挺天亮吧
上传的附件:
2007-8-5 23:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
8错,我也下来研究一下
2007-8-5 23:56
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hnr
7
爱琴海老大是高手,能不能把你的分析过程贴出来,俺很想学学,,,
至于这个软件,已经是非常过时的了,这个作者听说也不是原作者,(在百度吧里看他们在相互讽刺.说拿别人的东西修改了来卖.当时我破了几普通的不是VB的程序,对他们这个很有兴趣,不想让俺这样的连小菜都算不上的碰了一鼻子灰,这个程序和另一个自称原作者是一样功能界面也差不多,只是那个更难破,有一个输入框,下面没有注册按键,可能用功能键的其中一个来代替注册键而且要注册码正确才起作用)这都是过时很久的软件了,该不会对他们造成影响.那个贴吧里面比他们的更新的已经出了几款,是C++的,那个很容易破,是明码比较,在错误信息前改了两个跳转就行了...就这个VB的太难了,,..俺一定要好好学学...不知老大收不收俺这个徒弟.....
2007-8-6 02:24
0
雪    币: 1355
活跃值: (344)
能力值: ( LV13,RANK:920 )
在线值:
发帖
回帖
粉丝
8
hnr客气了,我不是什么高手和老大。不会武功,不会飞镖夺命,不会百步穿杨。。。研究这个只是平时无聊打发时间的,是非常业余的水平。你应该自学为主,跟人交流为辅,独立分析,这样才能尽快赶上那些前辈们。当然一定要拜师的话,就拜高手,拜中高级会员为师。加油,一起进步吧
2007-8-6 03:59
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hnr
9
是俺太笨了,你不想收俺这个徒弟,但俺真的很佩服你分析的过程,
166A7448    8BD0            mov     edx, eax
166A744A    8D4D D4         lea     ecx, [ebp-2C]
166A744D    FFD7            call    edi
166A744F    8B0E            mov     ecx, [esi]
166A7451    8D55 D0         lea     edx, [ebp-30]
166A7454    8D45 D4         lea     eax, [ebp-2C]
166A7457    52              push    edx
166A7458    50              push    eax
166A7459    56              push    esi
166A745A    FF91 84080000   call    [ecx+884]
166A7460    8B55 D0         mov     edx, [ebp-30]
166A7463    8D4D E4         lea     ecx, [ebp-1C]
166A7466    C745 D0 0000000>mov     dword ptr [ebp-30], 0
166A746D    FFD7            call    edi
166A746F    8D4D D4         lea     ecx, [ebp-2C]
166A7472    8D55 D8         lea     edx, [ebp-28]
166A7475    51              push    ecx
166A7476    8D45 DC         lea     eax, [ebp-24]
166A7479    52              push    edx
166A747A    50              push    eax
166A747B    6A 03           push    3
166A747D    FF15 E8116916   call    [166911E8]                       ; MSVBVM60.__vbaFreeStrList
166A7483    83C4 10         add     esp, 10
166A7486    8D55 80         lea     edx, [ebp-80]

166A745A    FF91 84080000   call    [ecx+884]是关键CALL算法在里面
F2下断,运行断下.按F8注册码出来了,
堆栈 ss:[0012F174]=0015DFFC, (UNICODE "A52ECE13DE61C71C947F81165E789445")
edx=0015DFFC, (UNICODE "A52ECE13DE61C71C947F81165E789445")
A52ECE13DE61C71C947F81165E789445就是注册码
2007-8-6 17:53
0
雪    币: 213
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
老大写的不错,看来我以后还要加强学习啊!学无止境!
2007-8-6 19:42
0
游客
登录 | 注册 方可回帖
返回
//