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

超强组合搞定Delphi程序

程序员文章站 2022-11-20 15:24:02
本篇文章源自《黑客防线》2007年9月刊转载请注明版权 文/图 December=================================== 对于破解来说,除了必备的基础知识外,工...

本篇文章源自《黑客防线》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