首页
社区
课程
招聘
[求助]关于Delphi控件破解的问题(涉及dcu文件格式)
发表于: 2006-4-10 13:42 7001

[求助]关于Delphi控件破解的问题(涉及dcu文件格式)

2006-4-10 13:42
7001
最近初学报表,于是试用了鼎鼎大名的Fast*port控件,感觉功能确实强大。只不过试用版有几处限制,例如只能打印前5页、打印件有未注册标志等等。大约是俄国人的东东,想注册也不太容易,只好动点歪脑筋――将其破解。

破解控件自然是从使用到该控件的应用程序入手最为方便,于是随便写了个程序,然后进行分析,结果三下五除二,仅改了一小段代码,把5页限制解掉了,大喜,未曾想竟如此容易。

为求一劳永逸,当然要直接修改控件,这样便可使每个编译出来的应用程序都无须重新破解了。未注册的商业控件,自是不会有源码的,只有一大堆dcu(已编译好的pas单元)文件,所以一定是对某个dcu下手。抄了一段破解前的16进制字串,到dcu文件中搜索,很快便找到了。心想既然dcu和dll差不多,直接把改好的16进制码一输,不就万事大吉了吗?

且住,仔细想想,有点不对。如果破解不涉及CAll调用,不涉及远跳转,不涉及指针,自然可以直接修改,可是我的破解偏偏要改掉Call(至少要移动一下位置),势必会涉及到如同dll中重定位的问题,岂会如此便利?打开dcu文件一看,果不其然,CALL调用的位置处十六进制串为“E8 00 00 00 00”,登时头大。

dcu文件的重定位信息在哪里呢?
把手头上有的工具翻了个遍,只有dede可以反编dcu文件,试了一下,似乎没有提供重定位的任何信息。上网搜索半日,也一无所获,原来dcu格式属非文档化资料,未有公开者。顿觉沮丧异常。

百般无奈,只好精心重构破解代码,小心避开了相关处,总算把这个地方搞掂了。但还有一处限制(导出Execl时的5页限制)却是无论如何无法回避。

我想,delphi控件涉及此类问题的不在少数,不知各位大侠,似此应当如何处置?

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己顶一下。
2006-4-14 00:33
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
顶一下。
不过小弟无Delphi经验。
2006-4-14 14:10
0
雪    币: 34
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我是一个新手,控件破解好象这个方面的资料很少,作为一个程序员,破解程序的时候可能比较少,而破解控件和dll是真正有用的东西。强烈要求各位高手发布些这样的破解文章。
2006-4-14 19:28
0
雪    币: 216
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 kevinmhw 发布
我是一个新手,控件破解好象这个方面的资料很少,作为一个程序员,破解程序的时候可能比较少,而破解控件和dll是真正有用的东西。强烈要求各位高手发布些这样的破解文章。

跟dll差不多的,你用DeDe反汇编修改。
2006-4-14 22:51
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
前阵子破过一个。改了两个文件,一个DCU,一个BPL.
BPL的好办,OD即可,改也很容易。DCU用DEDE 反编译,找可疑的函数,或查关键字串,修改要用uedit32 ,懂ASM的话就简单多了。
2006-4-15 11:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
刚好是六个字
2006-4-15 17:23
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
如果仅是改一两个跳转,那也未免过于简单了。我指的自然不是这个问题。

以Fast*port中的5页限制为例,源码应当为如下形式:

for i := 0 to 4 do Pages.Print;

那么编译后汇编指令则可能为(设1~n为冗余代码,可以利用):
1:   
2:
3:
4:
5:

n:
@Loop:   xor ebx,ebx
         mov eax,ebx
         call Pages.Print
         inc ebx
         cmp ebx,5
         jnz @Loop
         pop ebx
         pop ebp
         ret
如果要解除限制,最理想的办法是把程序改为:
for i := 0 to PagesCount - 1 do Pages.Print;
那么我需要得到PagesCount值,假设通过跟踪已知“Call GetPageCount”即可得到PagesCount,那么现在的问题是:
1、如何在dcu中插入Call GetPageCount这样的指令而能让连接程序自动进行重定位?
2、如果需要改动原代码中的“Call Pages.Print”这条指令的位置,怎样能做到?
2006-4-16 23:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
Fast*这个控件可能比较特殊一些,冗余代码比较多,相对发挥余地较大,而且“Call GetPageCount”恰巧又是“Call [edx]”这样的形式出现的,所以可以小心构造破解代码,避开重定位问题。比如上面这段我就可以改成:

    push esi
    mov  eax,[ebp+8]
    mov  edx,[eax]
    call [edx]          ;Call GetPageCount
    mov esi,eax
@@Loop:
    xor ebx,ebx
    mov eax,ebx
    call Pages.Print
    inc ebx
    cmp ebx,esi
    jl @@Loop
    pop esi
    pop ebx
    pop ebp
    ret
恰好不需要动Pages.Print那个Call指令,这样就回避了重定位的问题,可是,其它控件也会有这么好运吗?
2006-4-16 23:25
0
雪    币: 234
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
似乎不错,呵呵,不过我不大懂这个!~
2006-4-16 23:30
0
雪    币: 216
活跃值: (77)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
最初由 Easycode 发布
Fast*这个控件可能比较特殊一些,冗余代码比较多,相对发挥余地较大,而且“Call GetPageCount”恰巧又是“Call [edx]”这样的形式出现的,所以可以小心构造破解代码,避开重定位问题。比如上面这段我就可以改成:

push esi
mov eax,[ebp+8]
mov edx,[eax]
........

dcu需要重定位的?
2006-4-17 00:40
0
雪    币: 768
活跃值: (515)
能力值: ( LV13,RANK:460 )
在线值:
发帖
回帖
粉丝
12
不太明白,关注。
2006-4-17 12:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
再顶顶吧,感觉这个问题还是比较有意义的。
2006-4-20 12:15
0
游客
登录 | 注册 方可回帖
返回
//