超强组合搞定Delphi程序
本篇文章源自《黑客防线》2007年9月刊
转载请注明版权
文/图 December
===================================
对于破解来说,除了必备的基础知识外,工具的组合应用也是非常重要的,组合得好,非常利于快速破解程序。这次就给大家介绍一下OD+DeDe+PE Explorer这个超强组合在破解中的运用。
超强视频转Flash是一款以难以置信的超快速度实现对目前已支持的文件格式到FLV/AVI/WMV/MPG/MOV等格式之间的转换,其特长是对3GP和MP4的支持。因为个人需要,想用它来转换点文件,不过就是看到未注册挺碍眼的,所以决定试试搞定它。
首先当然是使用PEiD来火力探测一下是使用了什么语言来编写的,如图1所示,很明显是是Borland Delphi编写的,而且PE嗅探结果也相同。虽然注册有提示失败,但是这次我们不使用这个方法来破解它,因为是Delphi程序,所以使用DeDe来对付它。但有时候DeDe载入分析后,可能代码非常多,会让你眼花缭乱,究竟哪一个才是正确的事件按钮呢?
图1
这里推荐使用PE Explorer来查看,将程序丢到PE Explorer上去,载入后,点击“资源查看/编辑器”,会看如图2所示的结果,其中有一个“RC数据”,它是Delphi程序的一个特点,C、VB等编程语言是没有的。根据分析,可以知道“TFRMMAIN”是关键的地方,所以将其展开,结果如图3所示,很明显,“btnRegisterClick”就是点击注册的按钮事件。
图2
图3
既然已经找到按钮事件了,这时就可以将PE Explorer关闭了,因为它已经完成使命了。这个时候,立马将程序丢到DeDe中去分析,因为刚才已经找到了按钮事件,所以在DeDe中只需找与按钮事件相同的即可,结果如图4所示,可以发现关键地方是在0053851C这里。既然已经找到地址了,DeDe也已经完成它的任务了,可将其关闭掉。下面打开OD,将程序载入进去,直接来到关键之处。
图4
0053857F E8 68C7ECFF call VideoCon.00404CEC
00538584 83BB 50040000 >cmp dword ptr ds:[ebx+450],0
;是否输入用户名
0053858B 75 20 jnz short VideoCon.005385AD
0053858D BA 58865300 mov edx,VideoCon.00538658;P
00538592 8B83 5C030000 mov eax,dword ptr ds:[ebx+35C]
00538598 E8 BF39FAFF call VideoCon.004DBF5C
0053859D 8B83 34030000 mov eax,dword ptr ds:[ebx+334]
005385A3 8B10 mov edx,dword ptr ds:[eax]
005385A5 FF92 C4000000 call dword ptr ds:[edx+C4]
005385AB EB 6B jmp short VideoCon.00538618
005385AD 83BB 54040000 >cmp dword ptr ds:[ebx+454],0
;是否输入注册码
005385B4 75 20 jnz short VideoCon.005385D6
005385B6 BA 8C865300 mov edx,VideoCon.0053868C;P
005385BB 8B83 5C030000 mov eax,dword ptr ds:[ebx+35C]
005385C1 E8 9639FAFF call VideoCon.004DBF5C
005385C6 8B83 3C030000 mov eax,dword ptr ds:[ebx+33C]
005385CC 8B10 mov edx,dword ptr ds:[eax]
005385CE FF92 C4000000 call dword ptr ds:[edx+C4]
005385D4 EB 42 jmp short VideoCon.00538618
005385D6 8BC3 mov eax,ebx
005385D8 E8 B7010000 call VideoCon.00538794
;关键call
005385DD 85C0 test eax,eax
005385DF 74 19 je short VideoCon.005385FA
;关键跳
005385E1 BA DC865300 mov edx,VideoCon.005386DC;T
程序先判断是否输入用户名和注册码,如果都输入了,就直接往下到005385D8这个call上继续判断。这一次,我们跟进这个call去看看究竟是如何判断的。
005387D8 |. E8 8BC7ECFF call VideoCon.00404F68
005387DD |. 83F8 16 cmp eax,16
;比较注册码是不是22位
005387E0 |. 0F85 5D01000>jnz VideoCon.00538943
;不是就玩完
原来这里判断注册码是不是22位,不是就跳向死亡了。
005387E6 |. 8D4D EC lea ecx,dword ptr ss:[ebp-14]
005387E9 |. BA 03000000 mov edx,3
005387EE |. 8B83 5404000>mov eax,dword ptr ds:[ebx+454]
;将注册码保存到eax
005387F4 |. E8 3714F0FF call VideoCon.00439C30
;取注册码前三位
005387F9 |. 8B45 EC mov eax,dword ptr ss:[ebp-14]
;保存到eax
005387FC |. BA 78895300 mov edx,VideoCon.00538978
;FLV
00538801 |. E8 AEC8ECFF call VideoCon.004050B4
;比较前三位是不是FLV
00538806 |. 0F85 3701000>jnz VideoCon.00538943
;不是就玩完
这里判断注册码前三位是不是FLV,不是就OVER。
0053880C |. 8D4D F8 lea ecx,dword ptr ss:[ebp-8]
0053880F |. BA 13000000 mov edx,13
00538814 |. 8B83 5404000>mov eax,dword ptr ds:[ebx+454]
0053881A |. E8 8114F0FF call VideoCon.00439CA0
0053881F |. 837D FC 00 cmp dword ptr ss:[ebp-4],0
;再次检测是否输入用户名
00538823 |. 0F84 1A01000>je VideoCon.00538943
00538829 |. 837D F8 00 cmp dword ptr ss:[ebp-8],0
;再次检测是否输入注册码
再一次检测注册信息。
0053882D |. 0F84 1001000>je VideoCon.00538943
00538833 |. 33F6 xor esi,esi
00538835 |> 8B45 F8 /mov eax,dword ptr ss:[ebp-8]
00538838 |. 8A1C30 |mov bl,byte ptr ds:[eax+esi]
0053883B |. 80FB 2D |cmp bl,2D ; 比较是不是-
0053883E |. 74 15 |je short VideoCon.00538855
00538840 |. 8D45 E8 |lea eax,dword ptr ss:[ebp-18]
00538843 |. 8BD3 |mov edx,ebx
00538845 |. E8 36C6ECFF |call VideoCon.00404E80
0053884A |. 8B55 E8 |mov edx,dword ptr ss:[ebp-18]
0053884D |. 8D45 F4 |lea eax,dword ptr ss:[ebp-C]
00538850 |. E8 1BC7ECFF |call VideoCon.00404F70
00538855 |> 46 |inc esi
00538856 |. 83FE 13 |cmp esi,13
00538859 |.^ 75 DA jnz short VideoCon.00538835 ;循环
这里判断是不是有3个“-”(不含引号)。
0053885B |. 8D45 F8 lea eax,dword ptr ss:[ebp-8]
0053885E |. 8B55 F4 mov edx,dword ptr ss:[ebp-C]
00538861 |. E8 CAC4ECFF call VideoCon.00404D30
00538866 |. 8D45 F4 lea eax,dword ptr ss:[ebp-C]
00538869 |. E8 2AC4ECFF call VideoCon.00404C98
0053886E |. 8B45 F8 mov eax,dword ptr ss:[ebp-8]
00538871 |. E8 F2C6ECFF call VideoCon.00404F68
00538876 |. 83F8 10 cmp eax,10
;比较是不是16位
00538879 |. 0F85 C400000>jnz VideoCon.00538943
这里判断除前三位和三个“-”之外剩下的位数是不是16位。
0053887F |. 33F6 xor esi,esi
00538881 |> 8BC6 /mov eax,esi
00538883 |. 25 01000080 |and eax,80000001
00538888 |. 79 05 |jns short VideoCon.0053888F
0053888A |. 48 |dec eax
0053888B |. 83C8 FE |or eax,FFFFFFFE
0053888E |. 40 |inc eax
0053888F |> 85C0 |test eax,eax
00538891 |. 75 1B |jnz short VideoCon.005388AE
00538893 |. 8D45 E4 |lea eax,dword ptr ss:[ebp-1C]
00538896 |. 8B55 F8 |mov edx,dword ptr ss:[ebp-8]
00538899 |. 8A1432 |mov dl,byte ptr ds:[edx+esi]
;取奇数位
0053889C |. E8 DFC5ECFF |call VideoCon.00404E80
005388A1 |. 8B55 E4 |mov edx,dword ptr ss:[ebp-1C]
005388A4 |. 8D45 F0 |lea eax,dword ptr ss:[ebp-10]
005388A7 |. E8 C4C6ECFF |call VideoCon.00404F70
005388AC |. EB 19 |jmp short VideoCon.005388C7
005388AE |> 8D45 E0 |lea eax,dword ptr ss:[ebp-20]
005388B1 |. 8B55 F8 |mov edx,dword ptr ss:[ebp-8]
005388B4 |. 8A1432 |mov dl,byte ptr ds:[edx+esi]
;取偶数位
005388B7 |. E8 C4C5ECFF |call VideoCon.00404E80
005388BC |. 8B55 E0 |mov edx,dword ptr ss:[ebp-20]
005388BF |. 8D45 F4 |lea eax,dword ptr ss:[ebp-C]
005388C2 |. E8 A9C6ECFF |call VideoCon.00404F70
005388C7 |> 46 |inc esi
005388C8 |. 83FE 10 |cmp esi,10
;循环16次
005388CB |.^75 B4 jnz short VideoCon.00538881
;未取完就继续取
将剩下的16位,分别取得奇数组合和偶数组合。
005388CD |. 8D45 FC lea eax,dword ptr ss:[ebp-4]
005388D0 |. E8 C3C3ECFF call VideoCon.00404C98
;取用户名
005388D5 |. 33F6 xor esi,esi
005388D7 |> 8D45 DC /lea eax,dword ptr ss:[ebp-24]
005388DA |. BA 08000000 |mov edx,8
005388DF |. 2BD6 |sub edx,esi
005388E1 |. 8B4D F4 |mov ecx,dword ptr ss:[ebp-C]
;取得的偶数位组合
005388E4 |. 8A5411 FF |mov dl,byte ptr ds:[ecx+edx-1]
;再将其取倒
将取得的偶数位组合再倒取一次。
005388E8 |. E8 93C5ECFF |call VideoCon.00404E80
005388ED |. 8B55 DC |mov edx,dword